<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>肉包子的摇滚生活 &#187; PHP</title>
	<atom:link href="http://www.fangyuqiang.com/archives/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fangyuqiang.com</link>
	<description>在通往架构师的路上努力着...</description>
	<lastBuildDate>Mon, 14 Mar 2011 03:48:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>深入解读Supesite CMS的数据库缓存与文件缓存机制(一)</title>
		<link>http://www.fangyuqiang.com/archives/1025</link>
		<comments>http://www.fangyuqiang.com/archives/1025#comments</comments>
		<pubDate>Mon, 14 Mar 2011 03:15:05 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[supesite]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=1025</guid>
		<description><![CDATA[深入解读Supesite CMS的数据库缓存与文件缓存机制。各种系统开发中都会大量的使用缓存，用于提高程序执行速度，避免过于频繁的查询或者是过于复杂的查询的性能消耗。]]></description>
			<content:encoded><![CDATA[<p>各种系统开发中都会大量的使用缓存，用于提高程序执行速度，避免过于频繁的查询或者是过于复杂的查询的性能消耗。例如网站名称这样的设置项,每个页面都会调用到,这属于频繁查询。另外一种比如是一个连接了3,4个表的sql查询，每次查询都会造成很大的数据库消耗，这属于复杂查询。</p>
<h2>supesite中的缓存类型</h2>
<p>supesite中有2种缓存，一种是文件缓存，一种是数据库缓存。</p>
<p>文件缓存的做法就是执行一次查询，然后将返回的结果生成一个.php的缓存文件,可以直接在程序中include进来，所有需要的地方都是直接include，这样就减少了数据库的查询。（当然，这里眼尖的同学会说这个增加了磁盘IO，等会下说个权衡问题）</p>
<p>数据库缓存的做法是将查询结果，再序列化成字符串，保存到数据库，碰到相同条件的查询语句时候，直接将查询结果又从数据库中读取出来。这里有些同学不理解，既然是减少数据库查询的负担，为什么又把结果保存到数据库再读出来？ 这是我们刚刚提到的复杂查询的缓存。我们将复杂的，性能消耗很高的查询结果保存到数据库，下次碰到一样的查询语句的时候，直接取出来，消耗仅仅是一个最简单的select语句而已，可以完全避免复杂sql的性能消耗。</p>
<p>以上是2种缓存文件实现提高性能的方式。具体缓存机制如何实现呢？</p>
<h2>缓存机制的实现</h2>
<p>无论文件缓存还是数据库缓存，实现都包括3个方面：</p>
<p>生成，更新，调用。</p>
<h3>文件缓存的生成</h3>
<p>文件缓存较为简单。生成文件缓存，只要将数据库结果整理成字符串，然后应用php自带的fwrite()函数将字符串写入文件即可。当然也要注意生成的文件语法要正确，才可以保证include的时候不会出错。</p>
<p>supesite中生成缓存的代码：</p>
<pre class="php" title="code">$cachefile = S_ROOT.'./data/robot/robot_'.$id. '.cache.php';
$text = '$cacheinfo = '.arrayeval($tarr). ';';
writefile($cachefile, $text, 'php');
</pre>
<p>其中$tarr是结果集数据组,指定文件名,生成文件就行.arrayeval是supesite中转换数据为缓存内容的函数,具体如下:</p>
<pre class="php" title="code">function arrayeval($array, $level = 0) {
       if(!is_array($array)) {
             return "'".$array. "'";
      }
       if(is_array($array) &#038;&#038; function_exists('var_export')) {
             return var_export($array, true);
      }

      $space = '';
       for($i = 0; $i <= $level; $i++) {
            $space .= "\t";
      }
      $evaluate = "Array\n$space(\n" ;
      $comma = $space;
       if(is_array($array)) {
             foreach($array as $key => $val) {
                  $key = is_string($key) ? '\''.addcslashes($key, '\'\\').'\'' : $key;
                  $val = !is_array($val) &#038;&#038; (!preg_match("/^\-?[1-9]\d*$/" , $val) || strlen($val) > 12) ? '\''.addcslashes($val, '\'\\' ).'\'' : $val;
                   if(is_array($val)) {
                        $evaluate .= "$comma$key => " .arrayeval($val, $level + 1);
                  } else {
                        $evaluate .= "$comma$key => $val";
                  }
                  $comma = ",\n$space" ;
            }
      }
      $evaluate .= "\n$space)" ;
       return $evaluate;
}
</pre>
<p>writefile是supesite封装的一个写文件的函数。主要是保证生成的php文件不会存在语法出错的状况，并且增加一定的可读性。</p>
<pre class="php" title="code">
function writefile($filename, $writetext, $filemod='text', $openmod= 'w', $eixt=1) {
       if(!@$fp = fopen($filename, $openmod)) {
             if($eixt) {
                   exit('File :' .srealpath($filename).'Have no access to write!');
            } else {
                   return false;
            }
      } else {
            $text = '';
             if($filemod == 'php' ) {
                   $text = "<?php\r\n\r\nif(!defined('IN_SUPESITE')) exit('Access Denied');\r\n\r\n";
            }
            $text .= $writetext;
             if($filemod == 'php' ) {
                  $text .= "\r\n\r\n?>";
            }
            flock($fp, 2);
            fwrite($fp, $text);
            fclose($fp);
             return true;
      }
}
</pre>
<h3>文件缓存的更新</h3>
<p>文件缓存的更新，就涉及到了整个业务机制了。有两种更新需求，一种是即时更新，就是一旦结果集发生变化，缓存文件也要更新，适应于对实时性要求比较高的配置项。另一种是定时更新，每隔一段时间就检查是否到了更新的时间点，到了时间点之后，无论结果是否有变化，都执行更新。不过两种方式没有绝对的性能优劣。假设结果集更新非常频繁，那么显然定时更新的方式性能较优，但是如果结果集很久才变化一次，那么即时更新的方式更划算。</p>
<p>即时更新的实现难度不大，只要在更新结果集的时候同时更新缓存即可。比如系统修改了设置项，那么在执行完数据库修改语句后，再加上缓存文件的更新代码即可。</p>
<p>定时更新则会稍微有一点点麻烦，你需要一个配置项来记住当前文件更新的时间间隔（例如1小时），然后每次触发执行的时候，都判断下当前时间与文件时间的差异是否达到了更新的间隔。</p>
<h3>文件缓存的调用</h3>
<p>文件缓存的调用非常简单，php中只要include指定的文件就可以了。当然，要稍微注意下include，require，include_once，require_once的差异。一般可使用include_once。</p>
<h3>数据库缓存的实现</h3>
<p>数据库缓存的整体实现机制相比文件缓存来说复杂得多，需要一整套完整的从生成更新到调用的机制。</p>
<p>supesite中采用的机制叫block，中文应该叫簇。这是一个相当好的设计，它极大的简化了数据调用的方式，并且与数据库缓存机制紧密结合，目前这种机制在各种开源CMS中都很流行。</p>
<p>首先来看看整套缓存表的设计，整个建表语句如下：</p>
<p>show create table supe_cache;</p>
<p>查看数据缓存表：</p>
<pre class="sql" title="code">CREATE TABLE `supe_cache` (
`cachekey` varchar(16) NOT NULL DEFAULT '',
`uid` mediumint(8) unsigned NOT NULL DEFAULT '0',
`cachename` varchar(20) NOT NULL DEFAULT '',
`value` mediumtext NOT NULL,
`updatetime` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`cachekey`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk
</pre>
<p>cachekey缓存主键，用于识别缓存，uid基本是无用，可以忽略。cachename是supesite中区分缓存的内容的类型的，例如分类调用缓存，新闻调用缓存，评论调用缓存等，通过cachename字段，可以允许后台单独对某些分类的缓存进行更新。value则是整个调用结果集，它是php中的结果数组的序列化字符串。updatetime记录的是下次缓存要更新的时间。</p>
<p>通过这个设计，可以得出整个数据库缓存的实现思路：生成缓存的时候，生成一个唯一的cachekey作为主键，将结果集序列化为数组保存在数据库中，并记录下次更新的时间。调用缓存的时候凭借cachekey主键获取，并判断updatetime时间是否已经到达更新的时间点，如果需要更新，则更新缓存表。否则直接读取缓存的结果集。</p>
<p>这里面围绕着一个核心的技术问题：</p>
<p>如何将sql调用跟唯一的cachekey对应起来？也就是说我执行一条sql语句来查询数据，这个查询怎么生成一个唯一的cachekey，然后我下次再次执行同样的sql就可以跟通过cachekey找到缓存结果？</p>
<p>这里就是supesite的核心函数block的功劳了。</p>
<p>原谅我继续待续..</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/1025/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最近2个月的技术文写作计划</title>
		<link>http://www.fangyuqiang.com/archives/1019</link>
		<comments>http://www.fangyuqiang.com/archives/1019#comments</comments>
		<pubDate>Wed, 09 Mar 2011 07:23:39 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=1019</guid>
		<description><![CDATA[太懒了..人一旦养成惰性了就容易这样&#8230;博客荒废了这么久,真对不起几百个订阅我博客的观众哈..决定从现在起,每周强制自己至少写一篇技术文。 本次计划完整的书写关于CMS架构方面的东西，自己在长期的CMS开发中总结的一些技术经验与大家分享。欢迎拍砖。 深入解读Supesite CMS的数据库缓存与文件缓存机制 深入解读Supesite CMS的模板与数据调用机制 深入解读Supesite CMS的接口调用机制 深入解读Supesite CMS的静态页生成机制 深入解读Supesite CMS的计划任务执行机制 深入解读Supesite CMS的模型机制 深入解读Supesite CMS的内容采集机制 深入解读Supesite CMS的debug调试机制 每周一篇,敬请期待! &#160;]]></description>
			<content:encoded><![CDATA[<p>太懒了..人一旦养成惰性了就容易这样&#8230;博客荒废了这么久,真对不起几百个订阅我博客的观众哈..决定从现在起,每周强制自己至少写一篇技术文。</p>
<p>本次计划完整的书写关于CMS架构方面的东西，自己在长期的CMS开发中总结的一些技术经验与大家分享。欢迎拍砖。<span id="more-1019"></span></p>
<ol>
<li>深入解读Supesite CMS的数据库缓存与文件缓存机制</li>
<li>深入解读Supesite CMS的模板与数据调用机制</li>
<li>深入解读Supesite CMS的接口调用机制</li>
<li>深入解读Supesite CMS的静态页生成机制</li>
<li>深入解读Supesite CMS的计划任务执行机制</li>
<li>深入解读Supesite CMS的模型机制</li>
<li>深入解读Supesite CMS的内容采集机制</li>
<li>深入解读Supesite CMS的debug调试机制</li>
</ol>
<p>每周一篇,敬请期待!</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/1019/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>静态页面显示动态数据解决方案</title>
		<link>http://www.fangyuqiang.com/archives/1003</link>
		<comments>http://www.fangyuqiang.com/archives/1003#comments</comments>
		<pubDate>Thu, 23 Dec 2010 01:12:50 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=1003</guid>
		<description><![CDATA[大家都知道的，静态的html页面，一般都是跟随着各自CMS的设置进行更新的，比如说CMS的设置是10分钟，那10分钟静态html页面重新生成一次。

这里有些地方就有特别的要求了。页面上的有些数据不是静态的，而是动态变化的。]]></description>
			<content:encoded><![CDATA[<p>经常有人问起我这个问题，生成静态页的页面，如何显示动态的数据？</p>
<p>大家都知道的，静态的html页面，一般都是跟随着各自CMS的设置进行更新的，比如说CMS的设置是10分钟，那10分钟静态html页面重新生成一次。</p>
<p>这里有些地方就有特别的要求了。页面上的有些数据不是静态的，而是动态变化的。比如</p>
<p><strong>文章的阅读次数，评论次数，投票的次数，当前用户的登陆状态，等等，这些都是动态，并且要即时显示。</strong></p>
<p>解决的方式就是应用Javascript来实现。Javascript的实现也分2种方式，一种是直接采用document.write页面上进行输出,另外一种就是应用ajax。</p>
<p>以php为例,新建一个php文件如test.php,输出</p>
<pre class="php" title="code">&lt;?php
echo "document.write('动态输出,此处可以换成自己的变量例如阅读次数')";
?&gt;</pre>
<p>页面上在你需要显示此数据的地方采用Javascript链接:</p>
<p>&lt;script src=”test.php?testid=1&#8243;&gt;&lt;/script&gt;</p>
<p>这样既可达到目标。</p>
<p>另外一种方式ajax，就更容易理解了。就是每次页面载入的时候执行一个更新数据的ajax，将页面上需要更新的数据动态赋值就可以了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/1003/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>php两个不错的字符串startswith实现</title>
		<link>http://www.fangyuqiang.com/archives/989</link>
		<comments>http://www.fangyuqiang.com/archives/989#comments</comments>
		<pubDate>Wed, 22 Sep 2010 16:40:33 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=989</guid>
		<description><![CDATA[写得很轻巧精妙的start with实现，学习借鉴。来自http://www.jonasjohn.de/snippets/，在他的网站上还能看到更多不错的一些实用函数的实现，有时间可以揣摩看看 /** * StartsWith * Tests if a text starts with an given string. * * @param     string * @param     string * @return    bool */ function StartsWith($Haystack, $Needle){ // Recommended version, using strpos return strpos($Haystack, $Needle) === 0; } // Another way, using substr function StartsWithOld($Haystack, $Needle){ return substr($Haystack, 0, strlen($Needle)) == $Needle; }]]></description>
			<content:encoded><![CDATA[<p>写得很轻巧精妙的start with实现，学习借鉴。来自<a href="http://www.jonasjohn.de/snippets/">http://www.jonasjohn.de/snippets/</a>，在他的网站上还能看到更多不错的一些实用函数的实现，有时间可以揣摩看看<span id="more-989"></span></p>
<pre class="php" title="code">/**
 * StartsWith
 * Tests if a text starts with an given string.
 *
 * @param     string
 * @param     string
 * @return    bool
 */
function StartsWith($Haystack, $Needle){
 // Recommended version, using strpos
 return strpos($Haystack, $Needle) === 0;
}

// Another way, using substr
function StartsWithOld($Haystack, $Needle){
 return substr($Haystack, 0, strlen($Needle)) == $Needle;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/989/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Supesite替换后台编辑器为ckeditor</title>
		<link>http://www.fangyuqiang.com/archives/974</link>
		<comments>http://www.fangyuqiang.com/archives/974#comments</comments>
		<pubDate>Mon, 13 Sep 2010 02:37:16 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[supesite]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=974</guid>
		<description><![CDATA[Supesite的后台编辑器是ss自己写的，不怎么好用，尤其是查看源代码的功能，所有代码都粘在一起，没有格式化，根本看不了，跟discuz论坛的编辑器对比起来差距太大了，估计这个编辑器是comsenz早期出的东西，supesite一直没有更新，所以编辑器太古董了。最近有些受不了，决定将supesite的编辑器替换为业内目前流行的ckeditor，ckeditor的前身就是fckeditor，相信做web的应该都会听过。 替换supesite的编辑器，主要存在几个问题： Javascript代码的兼容性，引入ckeditor的js代码，是否会与网站原先的代码产生冲突？ 分页插入。supesite的分页机制较为特殊，与编辑器的结合比较紧密，它的各个分页都是存为一条数据库记录。引入新的编辑器对分页会有不小的影响。 插入图片功能，supesite的图片上传组件是独立的，引入ckeditor的话需要跟ckeditor再进行融合。 原有的编辑器的一些特殊功能，插入分页标志，远程下载图片，需要重写并融入ckeditor。 逐一解决。 引入ckeditor 下载ckeditor，将整个目录放在supesite的目录下面。包不算很大吧，不过我还是删除了很多无用的语言文件，代码洁癖&#8230;没办法&#8230; 修改 supesite/admin/tpl/header.htm，删除原有的editor的js的引入，引入ckeditor的代码。 &#60;script language=”javascript” type=”text/javascript” src=”ckeditor/ckeditor.js”&#62;&#60;/script&#62; 修改supesite/admin/tpl/spacenews.htm，去掉原先的editor的编辑器的初始化代码，改为ckeditor的模式。 原先是： &#60;div id="fulledit"&#62;&#60;div id="message"&#62;&#60;/div&#62;&#60;/div&#62; &#60;script type="text/javascript"&#62; function init() { &#60;!--{if checkperm('allowpostattach')}--&#62; et = new word("message", "$thevalue[message]", 0, 1); &#60;!--{else}--&#62; et = new word("message", "$thevalue[message]", 0, 3); &#60;!--{/if}--&#62; } if(window.Event) { window.onload = init; } else { init(); } &#60;/script&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Supesite的后台编辑器是ss自己写的，不怎么好用，尤其是查看源代码的功能，所有代码都粘在一起，没有格式化，根本看不了，跟discuz论坛的编辑器对比起来差距太大了，估计这个编辑器是comsenz早期出的东西，supesite一直没有更新，所以编辑器太古董了。最近有些受不了，决定将supesite的编辑器替换为业内目前流行的<a href="http://docs.cksource.com/" target="_blank">ckeditor</a>，ckeditor的前身就是fckeditor，相信做web的应该都会听过。<span id="more-974"></span></p>
<p>替换supesite的编辑器，主要存在几个问题：</p>
<ol>
<li>Javascript代码的兼容性，引入ckeditor的js代码，是否会与网站原先的代码产生冲突？</li>
<li>分页插入。supesite的分页机制较为特殊，与编辑器的结合比较紧密，它的各个分页都是存为一条数据库记录。引入新的编辑器对分页会有不小的影响。</li>
<li>插入图片功能，supesite的图片上传组件是独立的，引入ckeditor的话需要跟ckeditor再进行融合。</li>
<li>原有的编辑器的一些特殊功能，插入分页标志，远程下载图片，需要重写并融入ckeditor。</li>
</ol>
<p>逐一解决。</p>
<h3>引入ckeditor</h3>
<p>下载ckeditor，将整个目录放在supesite的目录下面。包不算很大吧，不过我还是删除了很多无用的语言文件，代码洁癖&#8230;没办法&#8230;</p>
<p>修改 supesite/admin/tpl/header.htm，删除原有的editor的js的引入，引入ckeditor的代码。</p>
<blockquote><p>&lt;script language=”javascript” type=”text/javascript” src=”ckeditor/ckeditor.js”&gt;&lt;/script&gt;</p></blockquote>
<p>修改supesite/admin/tpl/spacenews.htm，去掉原先的editor的编辑器的初始化代码，改为ckeditor的模式。</p>
<p>原先是：</p>
<pre class="html" title="code">&lt;div id="fulledit"&gt;&lt;div id="message"&gt;&lt;/div&gt;&lt;/div&gt;

&lt;script type="text/javascript"&gt;

function init() {

&lt;!--{if checkperm('allowpostattach')}--&gt;

et = new word("message", "$thevalue[message]", 0, 1);

&lt;!--{else}--&gt;

et = new word("message", "$thevalue[message]", 0, 3);

&lt;!--{/if}--&gt;

}

if(window.Event) {

window.onload = init;

} else {

init();

}

&lt;/script&gt;</pre>
<p>改成：</p>
<pre class="js" title="code">&lt;textarea cols="80" id="message" name="message" rows="10"&gt;$thevalue[message]&lt;/textarea&gt;
 &lt;script type="text/javascript"&gt;
 //&lt;![CDATA[
 CKEDITOR.replace( 'message' );
 //]]&gt;
 &lt;/script&gt;</pre>
<p>OK，刷新下页面。。你就可能看到界面已经变成ckeditor了。华丽丽的ckeditor！同时，我所担心的Javascript兼容问题没有出现，看了ckeditor这方面的确做得相当不错。</p>
<p>如果你需要的编辑功能很少，到这一步你基本上就可以结束了，基本的编辑功能都ok了。不过如果你是做资讯类的网站，需要大量使用编辑器的各项功能，那还是要做完整的替换修改方案。</p>
<h3>插入图片功能</h3>
<p>插入图片功能的实现，是在supesite/function/common.func.php中的getuploadinserthtml函数，因为编辑器的替换，原先的插入图片无法找到原来的编辑区域，所以，只需要将原有的插入代码改成插入到ckeditor的插入代码即可。这里涉及到了ckeditor的一些接口方法调用。</p>
<p>原先的代码：</p>
<pre class="php" title="code">$inserthtml .= ' | &lt;a href="javascript:;" onClick="insertHtml(\''.shtmlspecialchars($thehtml).'\');return false;"&gt;'.($isimg?$lang['insert']:$lang['insert_attachments']).'&lt;/a&gt;';
 if(!empty($thehtmlsmallpic)) {
 $inserthtml .= ' | &lt;a href="javascript:;" onClick="insertHtml(\''.shtmlspecialchars($thehtmlsmallpic).'\');return false;"&gt;'.$lang['insertsmall'].'&lt;/a&gt;';
 }</pre>
<p>修改后的代码：</p>
<pre class="php" title="code">$inserthtml .= ' | &lt;a href="javascript:;" onClick="CKEDITOR.instances.message.insertHtml(\''.shtmlspecialchars($thehtml).'\');return false;"&gt;'.($isimg?$lang['insert']:$lang['insert_attachments']).'&lt;/a&gt;';
 if(!empty($thehtmlsmallpic)) {
 $inserthtml .= ' | &lt;a href="javascript:;" onClick="CKEDITOR.instances.message.insertHtml(\''.shtmlspecialchars($thehtmlsmallpic).'\');return false;"&gt;'.$lang['insertsmall'].'&lt;/a&gt;';
 }</pre>
<p>OK,搞定插入图片功能。</p>
<h3>插入分页标志与远程下载图片功能</h3>
<p>这2个功能的实现，就需要做ckeditor的插件开发了。</p>
<p>未完待续。</p>
<p>具体涉及的代码较多，有需要的同学可以邮箱联系我了解。fangyuqiang@gmail.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/974/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>php的switch函数的陷阱</title>
		<link>http://www.fangyuqiang.com/archives/926</link>
		<comments>http://www.fangyuqiang.com/archives/926#comments</comments>
		<pubDate>Wed, 04 Aug 2010 10:00:25 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=926</guid>
		<description><![CDATA[if(empty($reportCatid)&#124;&#124;$reportCatid == 176){ $reportCatid = '177,178,179,180'; } switch($reportCatid){ case 177: $reportName.=' - 福房指数'; break; case 178: $reportName.=' - 二手房指数'; break; case 179: $reportName.=' - 每日交易数据'; break; case 180: $reportName.=' - 综合数据分析'; break; } 猜猜结果如何。]]></description>
			<content:encoded><![CDATA[<p><code class="php" title="code"><br />
if(empty($reportCatid)||$reportCatid == 176){<br />
$reportCatid = '177,178,179,180';<br />
}</p>
<p>switch($reportCatid){<br />
case 177:<br />
$reportName.=' - 福房指数';<br />
break;<br />
case 178:<br />
$reportName.=' - 二手房指数';<br />
break;<br />
case 179:<br />
$reportName.=' - 每日交易数据';<br />
break;<br />
case 180:<br />
$reportName.=' - 综合数据分析';<br />
break;<br />
}<br />
</code><br />
猜猜结果如何。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/926/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>基于Supesite的大型网站开发</title>
		<link>http://www.fangyuqiang.com/archives/766</link>
		<comments>http://www.fangyuqiang.com/archives/766#comments</comments>
		<pubDate>Sun, 04 Jul 2010 13:39:02 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cms]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=766</guid>
		<description><![CDATA[很早就想开始写，但是因为一直忙于网站初期的上线跟后期改进，没有时间多写，现在决定每次想到什么都记录一点，不然过期就耽搁了。 目前我们在运营的网站http://www.hxfang.com，就是基于supesite 7.5开发的一个房地产网站。 supesite的优缺点 优点 缓存机制很强大 架构简单，却足够实用 缺点 单页支持不佳 模型做得比较强大，但是还是有不少可以改进的地方 非常怨念的问题。太多的地方需要设置权限。在liunx下面跑的时候太麻烦了。要到处给缓存目录设置写入权限。 svn支持不佳。因为太多目录会有读写操作，svn提交要设置很多繁杂的忽略，导致开发的时候很麻烦。 supesite建立频道 在后台频道管理中添加频道，单个页面一般为企业介绍之类。一般选择文章频道，不生成基本运行文件。 建立完之后，到对应的模板文件夹下创建频道的模板，一般以频道名打头，例如house_index.html.php。 然后编辑刚刚建立的频道，设置频道首页的模板为house_index。可以为各个频道设定不同的模板。这点上面ss做得的确不错。 待续。。。]]></description>
			<content:encoded><![CDATA[<p>很早就想开始写，但是因为一直忙于网站初期的上线跟后期改进，没有时间多写，现在决定每次想到什么都记录一点，不然过期就耽搁了。</p>
<p>目前我们在运营的网站<a href="http://www.hxfang.com" target="_blank">http://www.hxfang.com</a>，就是基于supesite 7.5开发的一个房地产网站。</p>
<h3><span id="more-766"></span></h3>
<h3>supesite的优缺点</h3>
<p>优点</p>
<ol>
<li>缓存机制很强大</li>
<li>架构简单，却足够实用</li>
</ol>
<p>缺点</p>
<ol>
<li>单页支持不佳</li>
<li>模型做得比较强大，但是还是有不少可以改进的地方</li>
<li>非常怨念的问题。太多的地方需要设置权限。在liunx下面跑的时候太麻烦了。要到处给缓存目录设置写入权限。</li>
<li>svn支持不佳。因为太多目录会有读写操作，svn提交要设置很多繁杂的忽略，导致开发的时候很麻烦。</li>
</ol>
<h3>supesite建立频道</h3>
<p>在后台频道管理中添加频道，单个页面一般为企业介绍之类。一般选择文章频道，不生成基本运行文件。</p>
<p>建立完之后，到对应的模板文件夹下创建频道的模板，一般以频道名打头，例如house_index.html.php。</p>
<p>然后编辑刚刚建立的频道，设置频道首页的模板为house_index。可以为各个频道设定不同的模板。这点上面ss做得的确不错。</p>
<p>待续。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/766/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php的empty函数的小陷阱</title>
		<link>http://www.fangyuqiang.com/archives/904</link>
		<comments>http://www.fangyuqiang.com/archives/904#comments</comments>
		<pubDate>Fri, 11 Jun 2010 08:55:10 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=904</guid>
		<description><![CDATA[先看看empty函数的用法: empty($var); 如果 var 是非空或非零的值，则 empty() 返回 FALSE。换句话说，”"、0、”0&#8243;、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的，如果 var 为空，则返回 TRUE。 我们经常用emtpt这样的函数来检查变量.但是要留意的是这样的问题,0值会被认为是empty . 这里就会带来一个问题了,如果说从数据库中取出来的值,或者从表单中传递过来的值本身就是0，那么就可能导致判断出问题. 我碰到的状况是判断表单传递过来的值,因为无意中忽略掉了0这样的状况,表单传递0的时候过来就会出现处理错误,后来改用isset方法才避免这样的问题.]]></description>
			<content:encoded><![CDATA[<p>先看看empty函数的用法:</p>
<p>empty($var);</p>
<p>如果   var   是非空或非零的值，则   empty()   返回   FALSE。换句话说，”"、0、”0&#8243;、NULL、FALSE、array()、var   $var;   以及没有任何属性的对象都将被认为是空的，如果   var   为空，则返回   TRUE。     <span id="more-904"></span></p>
<p>我们经常用emtpt这样的函数来检查变量.但是要留意的是这样的问题,0值会被认为是empty . 这里就会带来一个问题了,如果说从数据库中取出来的值,或者从表单中传递过来的值本身就是0，那么就可能导致判断出问题.</p>
<p>我碰到的状况是判断表单传递过来的值,因为无意中忽略掉了0这样的状况,表单传递0的时候过来就会出现处理错误,后来改用isset方法才避免这样的问题.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/904/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open Flash Chart 在IE下显示错误的bug</title>
		<link>http://www.fangyuqiang.com/archives/891</link>
		<comments>http://www.fangyuqiang.com/archives/891#comments</comments>
		<pubDate>Wed, 26 May 2010 02:04:10 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=891</guid>
		<description><![CDATA[图表在首次打开IE6进去后可以正常看到，但是这个时候再点击其他的图表，就出错了，IE8，firefox等浏览器不会有此问题，想来想去不清楚问题所在。后来用httpwatch抓包分析了下，发现IE6第二次不会重新加载图表。shit，又是 IE6缓存问题造成的。要解决IE6的缓存问题，当然就是每次请求的时候请求地址后面附带一个随机数。]]></description>
			<content:encoded><![CDATA[<p>之前就已经碰到过这个问题，open flash chart在IE6，7下会显示不出来，参见：<a href="http://www.fangyuqiang.com/archives/531">http://www.fangyuqiang.com/archives/531</a></p>
<blockquote><p>算是被这个bug吓出一身冷汗，还以为open flash chart在IE下不能用了。状况是：图表在首次打开IE6进去后可以正常看到，但是这个时候再点击其他的图表，就出错了，IE8，firefox等浏览器不会有此问题，想来想去不清楚问题所在。后来用httpwatch抓包分析了下，发现IE6第二次不会重新加载图表。shit，又是 IE6缓存问题造成的。要解决IE6的缓存问题，当然就是每次请求的时候请求地址后面附带一个随机数。这里我们就要对flash的加载地址后面附带随机数了。</p></blockquote>
<p>这次我是用swfobject加载的flash，所以直接在加载的flash地址后面加上时间随机数：<br />
swfobject.embedSWF(“{S_URL}/flash/hxchart.swf?t=”+new Date(), “totaldata”, “100%”, “100%”, “7.0.0&#8243;,”expressInstall.swf”,{“get-data”:”get_total_data”});</p>
<p>问题解决。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/891/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql与php时间格式化参数参考</title>
		<link>http://www.fangyuqiang.com/archives/881</link>
		<comments>http://www.fangyuqiang.com/archives/881#comments</comments>
		<pubDate>Sun, 16 May 2010 15:30:17 +0000</pubDate>
		<dc:creator>fangyuqiang</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.fangyuqiang.com/?p=881</guid>
		<description><![CDATA[为方便查阅，从官方网站上转载的。因为mysql还有php的时间格式化参数不同，不小心会搞混，这里整理一番 PHP format character Description Example returned values Day &#8212; &#8212; d Day of the month, 2 digits with leading zeros 01 to 31 D A textual representation of a day, three letters Mon through Sun j Day of the month without leading zeros 1 to 31 l (lowercase &#8216;L&#8217;) A full textual representation of [...]]]></description>
			<content:encoded><![CDATA[<p>为方便查阅，从官方网站上转载的。因为mysql还有php的时间格式化参数不同，不小心会搞混，这里整理一番<span id="more-881"></span></p>
<h3>PHP</h3>
<table>
<thead>
<tr valign="middle">
<th><em><tt>format</tt></em> character</th>
<th>Description</th>
<th>Example returned values</th>
</tr>
</thead>
<tbody>
<tr valign="middle">
<td align="center"><em>Day</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>d</em></td>
<td align="left">Day of the month, 2 digits with leading  zeros</td>
<td align="left"><em>01</em> to <em>31</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>D</em></td>
<td align="left">A textual representation of a day, three  letters</td>
<td align="left"><em>Mon</em> through <em>Sun</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>j</em></td>
<td align="left">Day of the month without leading zeros</td>
<td align="left"><em>1</em> to <em>31</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>l</em> (lowercase &#8216;L&#8217;)</td>
<td align="left">A full textual representation of the day of  the week</td>
<td align="left"><em>Sunday</em> through <em>Saturday</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>N</em></td>
<td align="left">ISO-8601 numeric representation of the day  of the week (added in            PHP 5.1.0)</td>
<td align="left"><em>1</em> (for Monday) through <em>7</em> (for  Sunday)</td>
</tr>
<tr valign="middle">
<td align="left"><em>S</em></td>
<td align="left">English ordinal suffix for the day of the  month, 2 characters</td>
<td align="left"><em>st</em>, <em>nd</em>, <em>rd</em> or             <em>th</em>.  Works well with <em>j</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>w</em></td>
<td align="left">Numeric representation of the day of the  week</td>
<td align="left"><em>0</em> (for Sunday) through <em>6</em> (for  Saturday)</td>
</tr>
<tr valign="middle">
<td align="left"><em>z</em></td>
<td align="left">The day of the year (starting from 0)</td>
<td align="left"><em>0</em> through <em>365</em></td>
</tr>
<tr valign="middle">
<td align="center"><em>Week</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>W</em></td>
<td align="left">ISO-8601 week number of year, weeks starting  on Monday (added in PHP 4.1.0)</td>
<td align="left">Example: <em>42</em> (the 42nd week in the  year)</td>
</tr>
<tr valign="middle">
<td align="center"><em>Month</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>F</em></td>
<td align="left">A full textual representation of a month,  such as January or March</td>
<td align="left"><em>January</em> through <em>December</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>m</em></td>
<td align="left">Numeric representation of a month, with  leading zeros</td>
<td align="left"><em>01</em> through <em>12</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>M</em></td>
<td align="left">A short textual representation of a month,  three letters</td>
<td align="left"><em>Jan</em> through <em>Dec</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>n</em></td>
<td align="left">Numeric representation of a month, without  leading zeros</td>
<td align="left"><em>1</em> through <em>12</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>t</em></td>
<td align="left">Number of days in the given month</td>
<td align="left"><em>28</em> through <em>31</em></td>
</tr>
<tr valign="middle">
<td align="center"><em>Year</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>L</em></td>
<td align="left">Whether it&#8217;s a leap year</td>
<td align="left"><em>1</em> if it is a leap year, <em>0</em> otherwise.</td>
</tr>
<tr valign="middle">
<td align="left"><em>o</em></td>
<td align="left">ISO-8601 year number. This has the same  value as             <em>Y</em>, except that if the ISO week number             (<em>W</em>) belongs to the previous or next year, that year             is used instead. (added in PHP 5.1.0)</td>
<td align="left">Examples: <em>1999</em> or <em>2003</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>Y</em></td>
<td align="left">A full numeric representation of a year, 4  digits</td>
<td align="left">Examples: <em>1999</em> or <em>2003</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>y</em></td>
<td align="left">A two digit representation of a year</td>
<td align="left">Examples: <em>99</em> or <em>03</em></td>
</tr>
<tr valign="middle">
<td align="center"><em>Time</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>a</em></td>
<td align="left">Lowercase Ante meridiem and Post meridiem</td>
<td align="left"><em>am</em> or <em>pm</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>A</em></td>
<td align="left">Uppercase Ante meridiem and Post meridiem</td>
<td align="left"><em>AM</em> or <em>PM</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>B</em></td>
<td align="left">Swatch Internet time</td>
<td align="left"><em>000</em> through <em>999</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>g</em></td>
<td align="left">12-hour format of an hour without leading  zeros</td>
<td align="left"><em>1</em> through <em>12</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>G</em></td>
<td align="left">24-hour format of an hour without leading  zeros</td>
<td align="left"><em>0</em> through <em>23</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>h</em></td>
<td align="left">12-hour format of an hour with leading zeros</td>
<td align="left"><em>01</em> through <em>12</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>H</em></td>
<td align="left">24-hour format of an hour with leading zeros</td>
<td align="left"><em>00</em> through <em>23</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>i</em></td>
<td align="left">Minutes with leading zeros</td>
<td align="left"><em>00</em> to <em>59</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>s</em></td>
<td align="left">Seconds, with leading zeros</td>
<td align="left"><em>00</em> through <em>59</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>u</em></td>
<td align="left">Microseconds (added in PHP 5.2.2)</td>
<td align="left">Example: <em>654321</em></td>
</tr>
<tr valign="middle">
<td align="center"><em>Timezone</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>e</em></td>
<td align="left">Timezone identifier (added in PHP 5.1.0)</td>
<td align="left">Examples: <em>UTC</em>, <em>GMT</em>, <em>Atlantic/Azores</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>I</em> (capital i)</td>
<td align="left">Whether or not the date is in daylight  saving time</td>
<td align="left"><em>1</em> if Daylight Saving Time, <em>0</em> otherwise.</td>
</tr>
<tr valign="middle">
<td align="left"><em>O</em></td>
<td align="left">Difference to Greenwich time (GMT) in hours</td>
<td align="left">Example: <em>+0200</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>P</em></td>
<td align="left">Difference to Greenwich time (GMT) with  colon between hours and minutes (added in PHP 5.1.3)</td>
<td align="left">Example: <em>+02:00</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>T</em></td>
<td align="left">Timezone abbreviation</td>
<td align="left">Examples: <em>EST</em>, <em>MDT</em> &#8230;</td>
</tr>
<tr valign="middle">
<td align="left"><em>Z</em></td>
<td align="left">Timezone offset in seconds. The offset for  timezones west of UTC is always            negative, and for those east of UTC is always positive.</td>
<td align="left"><em>-43200</em> through <em>50400</em></td>
</tr>
<tr valign="middle">
<td align="center"><em>Full Date/Time</em></td>
<td align="left">&#8212;</td>
<td align="left">&#8212;</td>
</tr>
<tr valign="middle">
<td align="left"><em>c</em></td>
<td align="left">ISO 8601 date (added in PHP 5)</td>
<td align="left">2004-02-12T15:19:21+00:00</td>
</tr>
<tr valign="middle">
<td align="left"><em>r</em></td>
<td align="left"><a href="http://www.faqs.org/rfcs/rfc2822">» RFC 2822</a> formatted date</td>
<td align="left">Example: <em>Thu, 21 Dec 2000 16:01:07 +0200</em></td>
</tr>
<tr valign="middle">
<td align="left"><em>U</em></td>
<td align="left">Seconds since the Unix Epoch (January 1 1970  00:00:00 GMT)</td>
<td align="left">See also <a href="http://www.php.net/manual/en/function.time.php">time()</a></td>
</tr>
</tbody>
</table>
<p>Unrecognized characters in the format string will be printed        as-is.  The <em>Z</em> format will always return        <em>0</em> when using <a href="http://www.php.net/manual/en/function.gmdate.php">gmdate()</a>.</p>
<p><strong>Note</strong>:                  Since this function only accepts  <a href="http://www.php.net/manual/en/language.types.integer.php">integer</a> timestamps the         <em>u</em> format character is only useful when using the         <a href="http://www.php.net/manual/en/function.date-format.php">date_format()</a> function with user based  timestamps         created with <a href="http://www.php.net/manual/en/function.date-create.php">date_create()</a>.</p>
<h3>MySQL</h3>
<table>
<tbody>
<tr>
<th>Specifier</th>
<th>Description</th>
</tr>
<tr>
<td><code>%a</code></td>
<td>Abbreviated weekday name                   (<code>Sun</code>..<code>Sat</code>)</td>
</tr>
<tr>
<td><code>%b</code></td>
<td>Abbreviated month name (<code>Jan</code>..<code>Dec</code>)</td>
</tr>
<tr>
<td><code>%c</code></td>
<td>Month, numeric (<code>0</code>..<code>12</code>)</td>
</tr>
<tr>
<td><code>%D</code></td>
<td>Day of the month with English suffix (<code>0th</code>,                   <code>1st</code>, <code>2nd</code>,                   <code>3rd</code>, …)</td>
</tr>
<tr>
<td><code>%d</code></td>
<td>Day of the month, numeric (<code>00</code>..<code>31</code>)</td>
</tr>
<tr>
<td><code>%e</code></td>
<td>Day of the month, numeric (<code>0</code>..<code>31</code>)</td>
</tr>
<tr>
<td><code>%f</code></td>
<td>Microseconds (<code>000000</code>..<code>999999</code>)</td>
</tr>
<tr>
<td><code>%H</code></td>
<td>Hour (<code>00</code>..<code>23</code>)</td>
</tr>
<tr>
<td><code>%h</code></td>
<td>Hour (<code>01</code>..<code>12</code>)</td>
</tr>
<tr>
<td><code>%I</code></td>
<td>Hour (<code>01</code>..<code>12</code>)</td>
</tr>
<tr>
<td><code>%i</code></td>
<td>Minutes, numeric (<code>00</code>..<code>59</code>)</td>
</tr>
<tr>
<td><code>%j</code></td>
<td>Day of year (<code>001</code>..<code>366</code>)</td>
</tr>
<tr>
<td><code>%k</code></td>
<td>Hour (<code>0</code>..<code>23</code>)</td>
</tr>
<tr>
<td><code>%l</code></td>
<td>Hour (<code>1</code>..<code>12</code>)</td>
</tr>
<tr>
<td><code>%M</code></td>
<td>Month name (<code>January</code>..<code>December</code>)</td>
</tr>
<tr>
<td><code>%m</code></td>
<td>Month, numeric (<code>00</code>..<code>12</code>)</td>
</tr>
<tr>
<td><code>%p</code></td>
<td><code>AM</code> or <code>PM</code></td>
</tr>
<tr>
<td><code>%r</code></td>
<td>Time, 12-hour (<code>hh:mm:ss</code> followed by                   <code>AM</code> or <code>PM</code>)</td>
</tr>
<tr>
<td><code>%S</code></td>
<td>Seconds (<code>00</code>..<code>59</code>)</td>
</tr>
<tr>
<td><code>%s</code></td>
<td>Seconds (<code>00</code>..<code>59</code>)</td>
</tr>
<tr>
<td><code>%T</code></td>
<td>Time, 24-hour (<code>hh:mm:ss</code>)</td>
</tr>
<tr>
<td><code>%U</code></td>
<td>Week (<code>00</code>..<code>53</code>),  where Sunday is the                   first day of the week</td>
</tr>
<tr>
<td><code>%u</code></td>
<td>Week (<code>00</code>..<code>53</code>),  where Monday is the                   first day of the week</td>
</tr>
<tr>
<td><code>%V</code></td>
<td>Week (<code>01</code>..<code>53</code>),  where Sunday is the                   first day of the week; used with <code>%X</code></td>
</tr>
<tr>
<td><code>%v</code></td>
<td>Week (<code>01</code>..<code>53</code>),  where Monday is the                   first day of the week; used with <code>%x</code></td>
</tr>
<tr>
<td><code>%W</code></td>
<td>Weekday name (<code>Sunday</code>..<code>Saturday</code>)</td>
</tr>
<tr>
<td><code>%w</code></td>
<td>Day of the week                   (<code>0</code>=Sunday..<code>6</code>=Saturday)</td>
</tr>
<tr>
<td><code>%X</code></td>
<td>Year for the week where Sunday is the first day of the week,  numeric,                   four digits; used with <code>%V</code></td>
</tr>
<tr>
<td><code>%x</code></td>
<td>Year for the week, where Monday is the first day of the week,  numeric,                   four digits; used with <code>%v</code></td>
</tr>
<tr>
<td><code>%Y</code></td>
<td>Year, numeric, four digits</td>
</tr>
<tr>
<td><code>%y</code></td>
<td>Year, numeric (two digits)</td>
</tr>
<tr>
<td><code>%%</code></td>
<td>A literal “<code>%</code>”  character</td>
</tr>
<tr>
<td><code>%<em><code>x</code></em></code></td>
<td><em><code>x</code></em>, for any                   “<em><code>x</code></em>”  not listed                   above</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.fangyuqiang.com/archives/881/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

