<?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>WilliamGates Blog &#187; PHP</title>
	<atom:link href="http://blog.williamgates.biz/category/tech/php-tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.williamgates.biz</link>
	<description>四片叶子的三叶草</description>
	<lastBuildDate>Sat, 05 Jun 2010 18:09:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>NOD32升级服务器——WG个人提供</title>
		<link>http://blog.williamgates.biz/2009/02/wg-nod32-update-server/</link>
		<comments>http://blog.williamgates.biz/2009/02/wg-nod32-update-server/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 03:23:37 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[LilyStudio]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[NOD32]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[折腾]]></category>
		<category><![CDATA[服务]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=322</guid>
		<description><![CDATA[　　试着公布一下我自己建的NOD32升级服务器（仅限v3，测试阶段，可能不稳定，随时可能改密码）： 　　地址：http://nod32.williamgates.biz 　　用户名：williamgates 　　密码：nodnod 　　密码可能常常修改，修改规则未定，一旦不能升级请及时来看本帖，所有修改都将在本帖发布。 Related posts:Reload]]></description>
			<content:encoded><![CDATA[<p>　　试着公布一下我自己建的NOD32升级服务器（仅限v3，测试阶段，可能不稳定，随时可能改密码）：</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">　　地址：http://nod32.williamgates.biz
　　用户名：williamgates
　　密码：nodnod</pre></div></div>

<p>　　密码可能常常修改，修改规则未定，一旦不能升级请及时来看本帖，所有修改都将在本帖发布。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/11/reload/' rel='bookmark' title='Permanent Link: Reload'>Reload</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2009/02/wg-nod32-update-server/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>在虚拟主机上架设NOD32升级服务器</title>
		<link>http://blog.williamgates.biz/2009/02/setup-nod32-update-server-on-hostmonster/</link>
		<comments>http://blog.williamgates.biz/2009/02/setup-nod32-update-server-on-hostmonster/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 03:16:00 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[HostMonster]]></category>
		<category><![CDATA[NOD32]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[折腾]]></category>
		<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=317</guid>
		<description><![CDATA[　　常给朋友和同事推荐NOD32，但是给他们装的时候往往没有升级服务器可用，他们既不会自己上网去搜索一些免费的升级地址，我也不大方便把drl的服务器给他们用——于是决定自己架设一个。 　　自己没有架在公众网的服务器，只有虚拟主机，到底能不能做到呢？下面就以我的HostMonster主机为例，来一步步尝试。 　　所需条件：支持SSH、cron的主机。 　　一、安装unrar 　　nod32升级的第一步就是下载update.ver文件，这是一个更新包的列表文件，用于增量升级。要命的是这个文件是rar包——天知道他们怎么想的——绝大多数商业的虚拟主机由于版权的原因不可能预装rar，所以我们只能自己装一个。 　　首先创建一个目录，建议在public_html之外，即无法通过apache访问到的目录，用于存放rarlinux程序文件。然后从官方网站下载rarlinux http://www.rarlab.com/rar/rarlinux-3.6.0.tar.gz 　　解压 tar zxvf rarlinux-3.6.0.tar.gz 　　这里要注意的是，Debian系统用3.6以下或以上的版本都会出现库文件错误，只有3.6不需要任何折腾就能使用，反正只是用来解压缩一个文件，还是老老实实用3.6吧。 　　解压之后得到rar目录，unrar就在目录中，无须安装，由于没有权限，就不要用make install了，反正不安装也能用。 　　二、编写升级脚本 　　这里使用php脚本自动从升级服务器下载文件，假设wget在系统中路径是/usr/bin/wget，unrar（刚才解压出来的地址）是/home/rar/unrar，我们升级文件的绝对路径为/home/public_html/nod32/，实际公开的地址是nod32.a.com，上层升级服务器是nod32.b.com/nod32/，用户名a，密码b（以上全都是虚构），那么脚本如下（抄袭自drl的jindui，根据我的情况略有修改，并修改了一处BUG） 　　文件&#8221;v3.php&#8221; &#60; ? $base='/home/public_html/nod32/'; $LOCALDIR = $base; $UPDATEDIR = $base; $TEMPDIR = $base.'tmp/'; $WGET = &#34;/usr/bin/wget --user-agent='ESS Update (Windows; U; 32bit; VDB 1924; BPC 3; OS: 6.0.6000 SP 0.0 NT; CH 1.1; LNG 1033; x32c;' &#34;; $UNRAR = '/home/rar/unrar'; [...]]]></description>
			<content:encoded><![CDATA[<p>　　常给朋友和同事推荐NOD32，但是给他们装的时候往往没有升级服务器可用，他们既不会自己上网去搜索一些免费的升级地址，我也不大方便把drl的服务器给他们用——于是决定自己架设一个。<br />
　　自己没有架在公众网的服务器，只有虚拟主机，到底能不能做到呢？下面就以我的HostMonster主机为例，来一步步尝试。<br />
　　所需条件：支持SSH、cron的主机。</p>
<p>　　一、安装unrar<br />
　　nod32升级的第一步就是下载update.ver文件，这是一个更新包的列表文件，用于增量升级。要命的是这个文件是rar包——天知道他们怎么想的——绝大多数商业的虚拟主机由于版权的原因不可能预装rar，所以我们只能自己装一个。<br />
　　首先创建一个目录，建议在public_html之外，即无法通过apache访问到的目录，用于存放rarlinux程序文件。然后从官方网站下载rarlinux</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http:<span style="color: #000000; font-weight: bold;">//</span>www.rarlab.com<span style="color: #000000; font-weight: bold;">/</span>rar<span style="color: #000000; font-weight: bold;">/</span>rarlinux-3.6.0.tar.gz</pre></div></div>

<p>　　解压</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">tar</span> zxvf rarlinux-3.6.0.tar.gz</pre></div></div>

<p>　　这里要注意的是，Debian系统用3.6以下或以上的版本都会出现库文件错误，只有3.6不需要任何折腾就能使用，反正只是用来解压缩一个文件，还是老老实实用3.6吧。<br />
　　解压之后得到rar目录，unrar就在目录中，无须安装，由于没有权限，就不要用make install了，反正不安装也能用。</p>
<p>　　二、编写升级脚本<br />
　　这里使用php脚本自动从升级服务器下载文件，假设wget在系统中路径是/usr/bin/wget，unrar（刚才解压出来的地址）是/home/rar/unrar，我们升级文件的绝对路径为/home/public_html/nod32/，实际公开的地址是nod32.a.com，上层升级服务器是nod32.b.com/nod32/，用户名a，密码b（以上全都是虚构），那么脚本如下（抄袭自drl的jindui，根据我的情况略有修改，并修改了一处BUG）<br />
<span id="more-317"></span><br />
　　文件&#8221;v3.php&#8221;</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ? 
<span style="color: #000088;">$base</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'/home/public_html/nod32/'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$LOCALDIR</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$base</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$UPDATEDIR</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$base</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$TEMPDIR</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$base</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'tmp/'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$WGET</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/usr/bin/wget  --user-agent='ESS Update (Windows; U; 32bit; VDB 1924; BPC 3; OS: 6.0.6000 SP 0.0 NT; CH 1.1; LNG 1033; x32c;' &quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$UNRAR</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/home/rar/unrar'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$UPDATE_SERVER</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://nod32.b.com/'</span><span style="color: #339933;">;</span> 
<span style="color: #000088;">$updateurl</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">${UPDATE_SERVER}</span>/nod32/update.ver&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;nod32.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>　　文件&#8221;nod32.php&#8221;</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ? 
<span style="color: #000088;">$UNRAR</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/home/rar/unrar'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$update</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">${UPDATEDIR}</span>update.ver&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$updatetmp</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">${UPDATEDIR}</span>update.tmp&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$USER</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'a'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$PASS</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'b'</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;">//$ignore = array('fr.nup', 'ge.nup', 'it.nup', 'jp.nup', 'pl.nup', 'pt.nup', 'sk.nup', 'sp.nup', 'hr.nup', 'hu.nup', 'nl.nup'); </span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_dir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$LOCALDIR</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
    <span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$LOCALDIR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_dir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$UPDATEDIR</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
    <span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$UPDATEDIR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_dir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$TEMPDIR</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
    <span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$TEMPDIR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #666666; font-style: italic;">//copy($update,$updatetmp);</span>
<span style="color: #990000;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$WGET</span> -t 15 -T 60 -N -nH -nd -P <span style="color: #006699; font-weight: bold;">$UPDATEDIR</span> <span style="color: #006699; font-weight: bold;">$updateurl</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$output</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ret</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #666666; font-style: italic;">/*$md51=exec(&quot;md5 -q $update&quot;);
$md52=exec(&quot;md5 -q $updatetmp&quot;);
unlink($updatetmp);
&nbsp;
if($md51==$md52) {
         echo &quot;no update need   !&quot;;
        exit;
&nbsp;
}*/</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ret</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Failed while downloading update.ver.'</span><span style="color: #339933;">;</span> 
    <span style="color: #990000;">exit</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> 
&nbsp;
<span style="color: #990000;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$UNRAR</span> x -y -o+ <span style="color: #006699; font-weight: bold;">{$UPDATEDIR}</span>update.ver <span style="color: #006699; font-weight: bold;">{$TEMPDIR}</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$output</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ret</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$TEMPDIR}</span>update.ver&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/file=(\/[\/a-z0-9\-\_\.]+)\W+size=([0-9]+)\W/ise&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$list</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$num</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//这句话我修改了一下，将字符串开头的&quot;/&quot;去掉了</span>
<span style="color: #666666; font-style: italic;">//否则地址会有两个&quot;/&quot;，造成文件大小无法比对，每次都会重新下载全部的文件）</span>
    <span style="color: #000088;">$size</span><span style="color: #339933;">=</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$num</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$filesize</span><span style="color: #339933;">=</span><span style="color: #990000;">filesize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$base</span><span style="color: #339933;">.</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$size</span><span style="color: #339933;">!=</span><span style="color: #000088;">$filesize</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$list</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$UPDATE_SERVER}</span><span style="color: #006699; font-weight: bold;">$file</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;the file size of   <span style="color: #006699; font-weight: bold;">$file</span>  is same, skip <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*
preg_match_all(&quot;/file=(.+?)\n/ie&quot;, $content, $matches); 
&nbsp;
$list = ''; 
foreach($matches[1] as $match) { 
    $match = trim($match); 
    $last = substr($match, -6); 
&nbsp;
    if (!in_array($last, $ignore)) 
        $list .= &quot;{$UPDATE_SERVER}$match\r\n&quot;; 
} */</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#file_put_contents('list.txt', $list); 
</span><span style="color: #000088;">$handle</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;list.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span><span style="color: #339933;">,</span> <span style="color: #000088;">$list</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$WGET</span> --http-user=<span style="color: #006699; font-weight: bold;">$USER</span> --http-passwd=<span style="color: #006699; font-weight: bold;">$PASS</span> -t 15  -T 60 -m -nH -P <span style="color: #006699; font-weight: bold;">$LOCALDIR</span> -i list.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$output</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ret</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ret</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Failed while downloading files.'</span><span style="color: #339933;">;</span> 
    <span style="color: #990000;">exit</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> 
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Updated successfully.'</span><span style="color: #339933;">;</span> 
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>　　现在从浏览器访问v3.php（这两个脚本无所谓放在哪里，只要是能通过apache访问到的目录就行，建议单独设置目录以便我们下面说的安全保护），就已经可以成功下载文件了。</p>
<p>　　三、安全保护<br />
　　为了不让普通用户主动运行升级脚本，也不让别人可以查看你的上层升级服务器的地址，我选择了密码保护，直接在HostMonster的控制面板里设置就行了，否则自己写文件有点麻烦。对你存放v3.php和nod32.php的目录设置一个用户名和密码，我们这里假设用户名是abc，密码是123。将一个单独的子域名（例如abc.a.com）指向这个目录。用浏览器访问就会弹出提示输入用户名密码的对话框。这无所谓，反正我们只要用lynx就行——一个Linux命令行下的浏览器（其实wget也行）。<br />
　　运行这个命令</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">lynx</span> <span style="color: #660033;">-cfg</span>=<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #660033;">-source</span> <span style="color: #660033;">-auth</span>=abc:<span style="color: #000000;">123</span> http:<span style="color: #000000; font-weight: bold;">//</span>abc.a.com<span style="color: #000000; font-weight: bold;">/</span>v3.php</pre></div></div>

<p>　　其中-cfg参数是指定配置文件，这里指定为空（否则会出错），-source表示纯字符串输出，-auth是密码验证的功能。<br />
　　可以看到输出一串结果，说明下载成功或者文件已存在不用下载。<br />
　　然后用同样的方法对下载来的文件存放的目录即本例中的/home/public_html/nod32/设置一个密码，是用来发布给别人升级时用的，记得不要和前面那个一样哦。</p>
<p>　　四、定时运行任务<br />
　　要让php脚本定时运行，虽然也可以用CGI方式运行php，但是我还是倾向于用浏览器，这样较为安全。<br />
　　编写一个nod32.sh文件（假设你的sh在/bin/，lynx在/usr/bin/，不清楚的话可以用whereis sh查到），同样放在apache无法取到的目录下，假设还是放在/home/rar/</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">lynx</span> <span style="color: #660033;">-cfg</span>=<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #660033;">-source</span> <span style="color: #660033;">-auth</span>=abc:<span style="color: #000000;">123</span> http:<span style="color: #000000; font-weight: bold;">//</span>abc.a.com<span style="color: #000000; font-weight: bold;">/</span>v3.php</pre></div></div>

<p>　　然后在虚拟主机的控制面板里设置Cron任务，更新频率每12小时吧，命令为</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">sh</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>rar<span style="color: #000000; font-weight: bold;">/</span>nod32.sh</pre></div></div>

<p>　　这样就完成了，你的程序会自动定时去上层服务器下载升级文件并存放在/home/public_html/nod32/，你只需要设置nod32.a.com指向该目录，就可以公开发布这个地址了。</p>
<p>　　最后，公布一下我自己建的<a href="http://blog.williamgates.biz/2009/02/wg-nod32-update-server/">NOD32升级服务器</a><br />
　　</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/11/reload/' rel='bookmark' title='Permanent Link: Reload'>Reload</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2009/02/setup-nod32-update-server-on-hostmonster/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>让WordPress的私有文章（private post）所属的tags和categories显示出来</title>
		<link>http://blog.williamgates.biz/2008/12/show-tags-and-categories-only-have-private-post-in-wordpress/</link>
		<comments>http://blog.williamgates.biz/2008/12/show-tags-and-categories-only-have-private-post-in-wordpress/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 08:23:21 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=182</guid>
		<description><![CDATA[　　Wordpress有private post的功能，但是一个post一旦作为private被save而不是public，则不会在数据库中进行计数（不算在已发的文章中）。这里讨论了这个问题。 　　现在问题在于，如果一个tag或者category只含有private post，那么它的计数是0，被认为是不含有文章从而不会被显示出来，哪怕是登录以后有权限看private post的情况下也是如此。这里，Wordpress的support forum的一个Moderator建议应该修改wp-includes中的taxonomy.php里的此处 function _update_post_term_count&#40; $terms &#41; &#123; global $wpdb; &#160; foreach &#40; &#40;array&#41; $terms as $term &#41; &#123; $count = $wpdb-&#62;get_var&#40; $wpdb-&#62;prepare&#40; &#34;SELECT COUNT(*) FROM $wpdb-&#62;term_relationships, $wpdb-&#62;posts WHERE $wpdb-&#62;posts.ID = $wpdb-&#62;term_relationships.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = %d&#34;, $term &#41; &#41;; $wpdb-&#62;update&#40; $wpdb-&#62;term_taxonomy, compact&#40; 'count' &#41;, [...]]]></description>
			<content:encoded><![CDATA[<p>　　Wordpress有private post的功能，但是一个post一旦作为private被save而不是public，则不会在数据库中进行计数（不算在已发的文章中）。<a href="http://trac.wordpress.org/ticket/5270">这里</a>讨论了这个问题。<br />
　　现在问题在于，如果一个tag或者category只含有private post，那么它的计数是0，被认为是不含有文章从而不会被显示出来，哪怕是登录以后有权限看private post的情况下也是如此。<a href="http://wordpress.org/support/topic/221210">这里</a>，Wordpress的support forum的一个Moderator建议应该修改wp-includes中的taxonomy.php里的此处</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> _update_post_term_count<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$terms</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$terms</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$term</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_var</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;SELECT COUNT(*) FROM <span style="color: #006699; font-weight: bold;">$wpdb-&gt;term_relationships</span>, <span style="color: #006699; font-weight: bold;">$wpdb-&gt;posts</span> WHERE <span style="color: #006699; font-weight: bold;">$wpdb-&gt;posts</span>.ID = <span style="color: #006699; font-weight: bold;">$wpdb-&gt;term_relationships</span>.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = <span style="color: #009933; font-weight: bold;">%d</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$term</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">update</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">term_taxonomy</span><span style="color: #339933;">,</span> <span style="color: #990000;">compact</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'count'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'term_taxonomy_id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$term</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>　　看起来似乎在 <code>post_status = 'publish'</code> 后面加一个 <code>OR post_status = 'private'</code> 就行了，但实际上没效果。为什么呢？这是往数据库中写的时候用来计数的，不是用来显示的；当我们已经有private post，修改这里并不会让本来被认为是空着的tag和category变得有数字。<br />
<span id="more-182"></span><br />
　　解决方案在<a href="http://wordpress.org/support/topic/175406">这里</a>，修改wp-includes中的category-template.php，<code>function wp_tag_cloud( $args = '' )</code> 中的</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$tags</span> <span style="color: #339933;">=</span> get_tags<span style="color: #009900;">&#40;</span> <span style="color: #990000;">array_merge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$args</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'orderby'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'count'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'order'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'DESC'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Always query top tags</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$tags</span> <span style="color: #339933;">=</span> get_tags<span style="color: #009900;">&#40;</span> <span style="color: #990000;">array_merge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$args</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'hide_empty'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'orderby'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'count'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'order'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'DESC'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Always query top tags</span></pre></div></div>

<p>　　也就是给 <code>get_tags()</code> （这其实是taxonomy.php里 <code>get_term()</code> 的一个封装，所以参数也一样)加上一个参数 <code>'hide_empty' => 0</code> ，即显示被认为是空的tag。<br />
　　category也一样做就可以了，同样是category-template.php里，修改 <code>function wp_list_categories( $args = '' ) </code> 中的</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$defaults</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'show_option_all'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'orderby'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'name'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'order'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'ASC'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'show_last_update'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'style'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'list'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'show_count'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'hide_empty'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'use_desc_for_title'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'child_of'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'feed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'feed_type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'feed_image'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'exclude'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'current_category'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'hierarchical'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'title_li'</span> <span style="color: #339933;">=&gt;</span> __<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Categories'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'echo'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'depth'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>　　把 <code>'hide_empty' => 1</code> 改成0即可。<br />
　　当然，如果需要只让有权限看private post的用户看到这些变化，只要给前面两处修改加上 <code>if(current_user_can("read_private_posts")) </code> 这样的判断就行了。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/12/show-tags-and-categories-only-have-private-post-in-wordpress/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>WordPress+WP-SuperCache之中文tag的Permalink问题全解析</title>
		<link>http://blog.williamgates.biz/2008/08/url-encoding-problem-in-wordpress-with-wp-super-cache/</link>
		<comments>http://blog.williamgates.biz/2008/08/url-encoding-problem-in-wordpress-with-wp-super-cache/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 04:50:17 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=152</guid>
		<description><![CDATA[　　WordPress的中文支持有问题，特别是在使用Permalink的时候，这个大家都知道。本文将分析其中的原因和网上流传的多种解决方案，并给出一个具体的解决结论。 　　这个问题主要表现为，在默认情况下，Wordpress对于形如这样的链接（链接1）： 　　 www.example.com/tag/中文 　　不能正常访问，会产生404或500错误，或者其他的错误。 　　而对于这样的链接（链接2）： 　　 www.example.com/?tag=中文 　　WordPress就能够正确解析。 　　原因：参见这篇文章和这篇文章，这是URL编码问题造成的。对于上面的链接1，这是一个PathInfo，对于链接2，这是一个QueryString。事实证明，对于UTF-8的页面，IE和FF都会正确发送PathInfo和QueryString（而不像有些文章中说的，他们在不同的设置下会有错误的反应），但服务器端，IIS会将PathInfo转换成GBK编码从而造成错误，于是Windows下的此类问题只需要转回来就行了；但是Linux下，Apache不支持中文PathInfo，要么通过这篇文章中的方法来对Apache进行改造，要么只能像我一样，Linux主机无法使用中文permalink。于是，我们只能寻找绕路的方法。 　　解决方案分析： 　　一、转换编码（参见这篇文章） 　　原理是，IIS会将PathInfo中的UTF-8转换成GBK，而QueryString中就不会转换，故而为了使用Permalink，采用以下方法： 　　打开wp-includesclasses.php文件，找到第44行和第50行： if &#40; isset&#40;$_SERVER&#91;'PATH_INFO'&#93;&#41; &#41; $pathinfo = $_SERVER&#91;'PATH_INFO'&#93;; else $pathinfo = ''; $pathinfo_array = explode&#40;'?', $pathinfo&#41;; $pathinfo = str_replace&#40;&#34;%&#34;, &#34;%25&#34;, $pathinfo_array&#91;0&#93;&#41;; $req_uri = $_SERVER&#91;'REQUEST_URI'&#93;; 改为 if &#40; isset&#40;$_SERVER&#91;'PATH_INFO'&#93;&#41; &#41; $pathinfo = mb_convert_encoding&#40;$_SERVER&#91;'PATH_INFO'&#93;, &#34;UTF-8&#34;, &#34;GBK&#34;&#41;; else $pathinfo = ''; $pathinfo_array = explode&#40;'?', $pathinfo&#41;; [...]]]></description>
			<content:encoded><![CDATA[<p>　　WordPress的中文支持有问题，特别是在使用Permalink的时候，这个大家都知道。本文将分析其中的原因和网上流传的多种解决方案，并给出一个具体的解决结论。<br />
　　这个问题主要表现为，在默认情况下，Wordpress对于形如这样的链接（链接1）：<br />
　　</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">www.example.com/tag/中文</pre></div></div>

<p>　　不能正常访问，会产生404或500错误，或者其他的错误。<br />
　　而对于这样的链接（链接2）：<br />
　　</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">www.example.com/?tag=中文</pre></div></div>

<p>　　WordPress就能够正确解析。</p>
<p>　　原因：参见<a href="http://akun-007.javaeye.com/blog/222624">这篇文章</a>和这篇文章，这是URL编码问题造成的。对于上面的链接1，这是一个PathInfo，对于链接2，这是一个QueryString。事实证明，对于UTF-8的页面，IE和FF都会正确发送PathInfo和QueryString（而不像有些文章中说的，他们在不同的设置下会有错误的反应），但服务器端，IIS会将PathInfo转换成GBK编码从而造成错误，于是Windows下的此类问题只需要转回来就行了；但是Linux下，Apache不支持中文PathInfo，要么通过<a href="http://www.iceboy.cn/show-15-1.html">这篇文章</a>中的方法来对Apache进行改造，要么只能像我一样，<strong>Linux主机无法使用中文permalink</strong>。于是，我们只能寻找绕路的方法。<br />
<span id="more-152"></span><br />
　　解决方案分析：<br />
　　一、转换编码（参见<a href="http://www.bolarn.com/index.php/2008/01/26/52/">这篇文章</a>）<br />
　　原理是，IIS会将PathInfo中的UTF-8转换成GBK，而QueryString中就不会转换，故而为了使用Permalink，采用以下方法：<br />
　　打开wp-includesclasses.php文件，找到第44行和第50行：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PATH_INFO'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
  <span style="color: #000088;">$pathinfo</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PATH_INFO'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span>
  <span style="color: #000088;">$pathinfo</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pathinfo_array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'?'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pathinfo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pathinfo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;%25&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pathinfo_array</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$req_uri</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PATH_INFO'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
  <span style="color: #000088;">$pathinfo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mb_convert_encoding</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PATH_INFO'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;UTF-8&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;GBK&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span>
  <span style="color: #000088;">$pathinfo</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pathinfo_array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'?'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pathinfo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pathinfo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;%25&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pathinfo_array</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$req_uri</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mb_convert_encoding</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;UTF-8&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;GBK&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>　　局限：只对Windows主机、且必须是Windows下的IIS主机有效。</p>
<p>　　二、修改rewrite.php（参见<a href="http://www.allove.org/index.php/archives/wordpress-tags.html">这篇文章</a>）<br />
　　这是网上最常见的方法，原理是，让WordPress在对其他内容使用Permalink的时候，对tag不使用，而使用链接2的QueryString模式发送中文编码：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> get_tag_permastruct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tag_structure</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tag_structure</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">permalink_structure</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//-----this line need change------</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tag_structure</span> <span style="color: #339933;">=</span> ”<span style="color: #339933;">;</span>
<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>把第5行改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">permalink_structure</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></div></div>

<p>　　局限：没有起到Permalink的“漂亮”作用，如果不能自己修改WP的文件就没办法了。</p>
<p>　　三、修改tag base（参见<a href="http://www.myfcys.cn/blog/index.php/2008.05/15">这篇文章</a>，经过我研究改造）<br />
　　原理同上，只要让WordPress在打开了Permalink功能后继续对tag不理不问就行了。那么，欺骗WordPress，让它用链接2的格式来显示Permalink，可行么？可行，因为WordPress可以自定义Permalink的形式：<br />
　　在WordPress的 Settings &#8211; Permalinks &#8211; Tag base 中填上<br />
　　</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">/</span>?tag<span style="color: #339933;">=</span></pre></div></div>

<p>　　注意&#8221;"不能少，引用原文中的写法不对。另外要注意每次输入&#8221;"，WP都会再次转义为&#8221;\&#8221;，所以每次点提交都会把&#8221;"翻一倍，点两次就是&#8221;\\&#8221;，所以不要多点，一次就对了。<br />
　　这个方法的结果是使得链接变成这个样子<br />
 　　</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">www.example.com/?tag=/中文/</pre></div></div>

<p>　　多出来的斜杠对于服务器丝毫没有影响，还是被视为QueryString，效果同上。<br />
　　局限是链接变得更加不好看了，更为致命的是插件生成的Sitemap中，tag链接会变成错误的形式，如果你很在乎Sitemap，请不要使用这个方法，除非你真的无法修改自己的rewrite.php文件。</p>
<p>　　但是当你使用WP-SuperCache或者类似的缓存插件时，它会加入自己的rewrite规则，所有请求先由自己判断，不在缓存中或者不符合缓存规则才交由WordPress处理。但问题在于，它不支持中文URL的解析，哪怕是QueryString也不行。于是我们必须绕过它。<br />
　　这是WP-SuperCache在.htaccess文件里所添加的rewrite规则</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">RewriteEngine On
RewriteBase /
&nbsp;
RewriteCond %<span class="br0">&#123;</span>REQUEST_METHOD<span class="br0">&#125;</span> !=POST
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*s=.*
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*p=.*
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*attachment_id=.*
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*wp-subscription-manager=.*
RewriteCond %<span class="br0">&#123;</span>HTTP_COOKIE<span class="br0">&#125;</span> !^.*<span class="br0">&#40;</span>comment_author_|wordpress|wp-postpass_<span class="br0">&#41;</span>.*$
RewriteCond %<span class="br0">&#123;</span>HTTP:Accept-Encoding<span class="br0">&#125;</span> gzip
RewriteCond %<span class="br0">&#123;</span>DOCUMENT_ROOT<span class="br0">&#125;</span>/wp-content/cache/supercache/%<span class="br0">&#123;</span>HTTP_HOST<span class="br0">&#125;</span>/$<span style="color: #cc66cc;">1</span>/index.html.gz -f
RewriteRule ^<span class="br0">&#40;</span>.*<span class="br0">&#41;</span> /wp-content/cache/supercache/%<span class="br0">&#123;</span>HTTP_HOST<span class="br0">&#125;</span>/$<span style="color: #cc66cc;">1</span>/index.html.gz <span class="br0">&#91;</span>L<span class="br0">&#93;</span>
&nbsp;
RewriteCond %<span class="br0">&#123;</span>REQUEST_METHOD<span class="br0">&#125;</span> !=POST
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*s=.*
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*p=.*
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*wp-subscription-manager=.*
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*attachment_id=.*
RewriteCond %<span class="br0">&#123;</span>HTTP_COOKIE<span class="br0">&#125;</span> !^.*<span class="br0">&#40;</span>comment_author_|wordpress|wp-postpass_<span class="br0">&#41;</span>.*$
RewriteCond %<span class="br0">&#123;</span>DOCUMENT_ROOT<span class="br0">&#125;</span>/wp-content/cache/supercache/%<span class="br0">&#123;</span>HTTP_HOST<span class="br0">&#125;</span>/$<span style="color: #cc66cc;">1</span>/index.html -f
RewriteRule ^<span class="br0">&#40;</span>.*<span class="br0">&#41;</span> /wp-content/cache/supercache/%<span class="br0">&#123;</span>HTTP_HOST<span class="br0">&#125;</span>/$<span style="color: #cc66cc;">1</span>/index.html <span class="br0">&#91;</span>L<span class="br0">&#93;</span></pre></div></div>

<p>　　我们要做的就是不让它去判断中文tag链接，在两个 RewriteCond %{REQUEST_METHOD} !=POST 后面分别加入这样一句：</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*tag=.*</pre></div></div>

<p>　　含义是如果QueryString中含有tag字样，请不要解析（交给下一条规则，一般来说就是WordPress的index.php了）。</p>
<p>　　结论：<br />
　　Windows+IIS主机下，通过方案一可以完美解决中文tag问题<br />
　　Linux+Apache主机下，<strong>不能使用中文Permalink</strong>，除非修改Apache，否则只有用方案二和方案三绕行。<br />
　　方案二是较为推荐的方法，但是搭配WP-SuperCache使用的时候，需要自己在.htaccess文件中加入一条不处理tag链接的规则。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/08/url-encoding-problem-in-wordpress-with-wp-super-cache/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>一个优秀的php相册系统——Coppermine Photo Gallery(三)日常使用</title>
		<link>http://blog.williamgates.biz/2008/04/coppermine-photo-gallery-03/</link>
		<comments>http://blog.williamgates.biz/2008/04/coppermine-photo-gallery-03/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 06:45:29 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[CPG]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=132</guid>
		<description><![CDATA[　　第一眼看到CPG的界面，会觉得像一个论坛，这也是它的多层分类的结构决定的。与一些相册网站不同，CPG可以有无限级的分类，这样就如同与一个论坛有诸多版面，版面还有子版面，等等。理解了这个概念，我们才能开始日常的管理和使用。 　　作为管理员登录CPG的时候，有两种模式，一种是让你观看普通会员的界面的会员模式，另一种则是默认的管理模式，只有在管理模式才可以看到类别、相册、会员等管理按钮。下面主要就来讲讲这些管理功能。 　　一、类别 　　要上传图片，要选择所传到的相册；要建立相册，首先要建立类别。在“类别”菜单中，我们可以建立、修改类别，还可以修改类别在页面中显示的顺序，还可以修改类别的详细属性（点击类别后面的“e”图标），其中很重要的一点是类别缩略图，是该类别显示时的标题缩略图，如果不想你的类别是自动的最后一幅上传图作为标题图，就自己修改一下吧。 　　二、相册 　　在此界面建立和修改相册。先选择一个类别，会显示出其下现有的相册。点新增，然后在下面的文本框输入相册名，把所有的相册都建立和修改好，再点修改，这样比较方便。注意，普通会员不能建立相册更不能建立分类，只能上传到管理员预先建好的相册（须打开群设置中的“允许公用相册上传”，并且该特定的相册必须在属性中“允许访客上传图片”）或者会员自己所有的相册中。 　　三、用户管理 　　群、会员、限制会员这三项都是用来进行用户管理的，第一个“群”应该译作“用户组”更为合适。在这里你可以修改各个用户组的设置，其中默认的四个组是不能被删除的；空间配额可以决定该组可以上传的所有图片总容量；上传方法中的字段数量表示一次可以上传多少个文件。会员界面也是大概的用法，把组和会员的关系刚好理解为分类与相册的关系就好了。 　　四、批量上传 　　这可能是最常用的功能之一了，因为除非你拥有很快的网络速度，并且要传的图片不太多，否则用普通的上传功能是非常麻烦的。在这里首先要说一说CPG的文件管理结构，CPG的数据库记录加入其中的图片的路径，而具体图片怎样存放是用户管理的。默认所有的相册都在CPG自己目录下的albums目录下，其中userpics目录是默认的用户个人相册的目录，而我在albums目录下又自己建了一个albums目录，用来存放公用相册。个人建议严格地按照你的类型、相册的结构来布置文件夹结构，另外注意尽量不要使用双字节目录名（中文、日文都不可以）。 　　建好目录结构之后，向欲存放某相册的目录上传这个相册的所有文件，然后到CPG中点击批量上传（只有管理员才有此功能），会出现你CPG目录下的目录结构，一层层找到你刚刚上传的目录（不用选择任何文件），点击OK，就开始自动建立图片的缩略图和中型图（这两者的设置请见上一篇文章）缩略图和中型图都保存在原图同样的目录下，有设置项里规定的名字。要提醒的是，如果你的主机支持使用ImageMagicK，会大幅度提高生成缩略图的速度，而且还能突破GD2的内存极限（GD2在我的主机上对付4096*4096的图就常常生成不了，另外有传闻说php5+Zend对GD2支持不好）。等表格的右边一栏中所有图片都显示完，在右上角选择你要加入这些图片的相册，点击确定，则开始写入数据库的工作。每一个图片成功加入后，表格右边会显示OK，这与上一步是速度差不多的过程，我一般添加100多幅漫画要2-3分钟不等。等全部都显示出OK的图样后，就完成了批量上传，去相册目录看看吧。 　　五、管理功能 　　这里是进行批量的数据库处理的界面，可以批量更新图片的信息、批量重新生成缩略图，这对于更改过缩略图设置的人来说非常有用，所有旧的图片的缩略图也将按照你的新设置重新生成一遍。其他功能也都写得很清楚，就不详述了。 　　六、会员模式 　　普通会员的功能，大致包括向自己的相册上传图片，向允许上传的功用相册上传图片等。这些上传方式与普通的相册系统、论坛系统都差别不大，而普通会员的相册管理功能其实就是简化了的管理员的管理界面，就不再介绍了。 　　还是做个广告，大家可以到photo.williamgates.biz去看这样经过多层分类的相册系统，如果在使用中有什么不懂的可以给我留言，我发现CPG的中文材料实在是太少了，只有一两个中文论坛以及官方论坛中的中文版面，内容都不太多。 　　下次将真正进入有技术含量的部分，介绍mod和plugin以及我使用并且修改过的几个Mod。 No related posts.]]></description>
			<content:encoded><![CDATA[<p>　　第一眼看到CPG的界面，会觉得像一个论坛，这也是它的多层分类的结构决定的。与一些相册网站不同，CPG可以有无限级的分类，这样就如同与一个论坛有诸多版面，版面还有子版面，等等。理解了这个概念，我们才能开始日常的管理和使用。<br />
　　作为管理员登录CPG的时候，有两种模式，一种是让你观看普通会员的界面的会员模式，另一种则是默认的管理模式，只有在管理模式才可以看到类别、相册、会员等管理按钮。下面主要就来讲讲这些管理功能。<br />
<span id="more-132"></span><br />
　　一、类别<br />
　　要上传图片，要选择所传到的相册；要建立相册，首先要建立类别。在“类别”菜单中，我们可以建立、修改类别，还可以修改类别在页面中显示的顺序，还可以修改类别的详细属性（点击类别后面的“e”图标），其中很重要的一点是类别缩略图，是该类别显示时的标题缩略图，如果不想你的类别是自动的最后一幅上传图作为标题图，就自己修改一下吧。</p>
<p>　　二、相册<br />
　　在此界面建立和修改相册。先选择一个类别，会显示出其下现有的相册。点新增，然后在下面的文本框输入相册名，把所有的相册都建立和修改好，再点修改，这样比较方便。注意，普通会员不能建立相册更不能建立分类，只能上传到管理员预先建好的相册（须打开群设置中的“允许公用相册上传”，并且该特定的相册必须在属性中“允许访客上传图片”）或者会员自己所有的相册中。</p>
<p>　　三、用户管理<br />
　　群、会员、限制会员这三项都是用来进行用户管理的，第一个“群”应该译作“用户组”更为合适。在这里你可以修改各个用户组的设置，其中默认的四个组是不能被删除的；空间配额可以决定该组可以上传的所有图片总容量；上传方法中的字段数量表示一次可以上传多少个文件。会员界面也是大概的用法，把组和会员的关系刚好理解为分类与相册的关系就好了。</p>
<p>　　四、批量上传<br />
　　这可能是最常用的功能之一了，因为除非你拥有很快的网络速度，并且要传的图片不太多，否则用普通的上传功能是非常麻烦的。在这里首先要说一说CPG的文件管理结构，CPG的数据库记录加入其中的图片的路径，而具体图片怎样存放是用户管理的。默认所有的相册都在CPG自己目录下的albums目录下，其中userpics目录是默认的用户个人相册的目录，而我在albums目录下又自己建了一个albums目录，用来存放公用相册。个人建议严格地按照你的类型、相册的结构来布置文件夹结构，另外注意尽量不要使用双字节目录名（中文、日文都不可以）。<br />
　　建好目录结构之后，向欲存放某相册的目录上传这个相册的所有文件，然后到CPG中点击批量上传（只有管理员才有此功能），会出现你CPG目录下的目录结构，一层层找到你刚刚上传的目录（不用选择任何文件），点击OK，就开始自动建立图片的缩略图和中型图（这两者的设置请见<a href="http://blog.williamgates.biz/2008/03/coppermine-photo-gallery-02/">上一篇文章</a>）缩略图和中型图都保存在原图同样的目录下，有设置项里规定的名字。要提醒的是，如果你的主机支持使用ImageMagicK，会大幅度提高生成缩略图的速度，而且还能突破<a href="http://www.boutell.com/gd/">GD2</a>的内存极限（GD2在我的主机上对付4096*4096的图就常常生成不了，另外有传闻说php5+Zend对GD2支持不好）。等表格的右边一栏中所有图片都显示完，在右上角选择你要加入这些图片的相册，点击确定，则开始写入数据库的工作。每一个图片成功加入后，表格右边会显示OK，这与上一步是速度差不多的过程，我一般添加100多幅漫画要2-3分钟不等。等全部都显示出OK的图样后，就完成了批量上传，去相册目录看看吧。</p>
<p>　　五、管理功能<br />
　　这里是进行批量的数据库处理的界面，可以批量更新图片的信息、批量重新生成缩略图，这对于更改过缩略图设置的人来说非常有用，所有旧的图片的缩略图也将按照你的新设置重新生成一遍。其他功能也都写得很清楚，就不详述了。</p>
<p>　　六、会员模式<br />
　　普通会员的功能，大致包括向自己的相册上传图片，向允许上传的功用相册上传图片等。这些上传方式与普通的相册系统、论坛系统都差别不大，而普通会员的相册管理功能其实就是简化了的管理员的管理界面，就不再介绍了。</p>
<p>　　还是做个广告，大家可以到<a href="http://photo.williamgates.biz">photo.williamgates.biz</a>去看这样经过多层分类的相册系统，如果在使用中有什么不懂的可以给我留言，我发现CPG的中文材料实在是太少了，只有一两个中文论坛以及官方论坛中的中文版面，内容都不太多。<br />
　　下次将真正进入有技术含量的部分，介绍mod和plugin以及我使用并且修改过的几个Mod。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/04/coppermine-photo-gallery-03/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>升级WordPress到2.5</title>
		<link>http://blog.williamgates.biz/2008/04/update-wordpress-to-ver25/</link>
		<comments>http://blog.williamgates.biz/2008/04/update-wordpress-to-ver25/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 13:04:48 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[折腾]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=131</guid>
		<description><![CDATA[　　我们可爱可恨的主机商终于解决了MySQL的问题，他们终于肯掏钱往集群里填服务器了……连续大概一个月的巨慢速度终于告别，我也可以升级WordPress了。 　　其实这个Blog的WordPress是在主机速度最慢的时候升级的，另一个Blog才是今天升级的。具体升级步骤我就不说了，网上到处都是，把两次升级的经验并在一起说说吧。 　　一、修改文件 　　解决中文Tag支持的mod依然可用（也就是说WordPress依然不准备解决这个问题），即修改wp-includes目录下的rewrite.php中的 function get_tag_permastruct() 中的 if &#40;empty&#40;$this-&#62;permalink_structure&#41;&#41; &#123; 改为 if &#40;!empty&#40;$this-&#62;permalink_structure&#41;&#41; &#123; 　　我自创的“让text widget在标题中显示图标”，需要有一些改变： wp-includes目录下的widgets.php中的 function wp_widget_text_control($widget_args) 中的 $title = strip_tags&#40;stripslashes&#40;$widget_text&#91;'title'&#93;&#41;&#41;; 改为 $title = stripslashes&#40;$widget_text&#91;'title'&#93;&#41;; 而把这句 $title = attribute_escape&#40;$options&#91;$number&#93;&#91;'title'&#93;&#41;; 改为 $title = format_to_edit&#40;$options&#91;$number&#93;&#91;'title'&#93;&#41;; 　　可以看出来，函数的参数和语句都与2.3.3不同了。 　　二、自动升级插件 　　这个插件叫做wordpress-automatic-upgrade，它可以大幅度简化你升级WordPress的过程，对我们这种上传下载都缓慢的国内用户更是如此。 　　它的全部操作都在WordPress的控制面板中完成，只要激活该插件，然后在Manage的wordpress automatic upgrade项里一直点下一步就好了。它会自动备份好你的文件、数据库并提供链接给你下载；会自动禁用你的所有插件、关闭你的blog并且自动下载最新版本的wordpress，更新所有的文件，最后恢复所有的插件和被暂时关闭的blog。一切都按照指引做就好了，完全不用从FTP上传下载任何东西，非常方便快捷。 　　要注意的是，它的备份文件功能只备份WordPress本身的文件，也就是说不包括content目录。你自己上传的插件、图片和其他内容还请自己下载备份。 　　好了，来享用你的WP 2.5吧，我觉得最好用的功能是插件自动升级和tag管理，另外后台管理界面的大变脸让人觉得很不错，并且后台似乎也加上了一定的缓存，可能是SQL查询缓存等，后台的速度和整个网站的速度都有一定提高。 No related posts.]]></description>
			<content:encoded><![CDATA[<p>　　我们可爱可恨的主机商终于解决了MySQL的问题，他们终于肯掏钱往集群里填服务器了……连续大概一个月的巨慢速度终于告别，我也可以升级WordPress了。<br />
　　其实这个Blog的WordPress是在主机速度最慢的时候升级的，另一个Blog才是今天升级的。具体升级步骤我就不说了，网上到处都是，把两次升级的经验并在一起说说吧。</p>
<p>　　一、修改文件<br />
　　解决中文Tag支持的mod依然可用（也就是说WordPress依然不准备解决这个问题），即修改wp-includes目录下的rewrite.php中的 <code>function get_tag_permastruct()</code> 中的</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">permalink_structure</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">permalink_structure</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></div></div>

<p>　　我自创的<a href="http://blog.williamgates.biz/2008/02/goodbye-icp-records-05/">“让text widget在标题中显示图标”</a>，需要有一些改变：<br />
<span id="more-131"></span><br />
wp-includes目录下的widgets.php中的 <code>function wp_widget_text_control($widget_args)</code> 中的</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strip_tags</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$widget_text</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$widget_text</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>而把这句</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> attribute_escape<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> format_to_edit<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>　　可以看出来，函数的参数和语句都与2.3.3不同了。</p>
<p>　　二、自动升级插件<br />
　　这个插件叫做<a href="http://wordpress.org/extend/plugins/wordpress-automatic-upgrade/">wordpress-automatic-upgrade</a>，它可以大幅度简化你升级WordPress的过程，对我们这种上传下载都缓慢的国内用户更是如此。<br />
　　它的全部操作都在WordPress的控制面板中完成，只要激活该插件，然后在Manage的wordpress automatic upgrade项里一直点下一步就好了。它会自动备份好你的文件、数据库并提供链接给你下载；会自动禁用你的所有插件、关闭你的blog并且自动下载最新版本的wordpress，更新所有的文件，最后恢复所有的插件和被暂时关闭的blog。一切都按照指引做就好了，完全不用从FTP上传下载任何东西，非常方便快捷。<br />
　　要注意的是，它的备份文件功能只备份WordPress本身的文件，也就是说不包括content目录。你自己上传的插件、图片和其他内容还请自己下载备份。</p>
<p>　　好了，来享用你的WP 2.5吧，我觉得最好用的功能是插件自动升级和tag管理，另外后台管理界面的大变脸让人觉得很不错，并且后台似乎也加上了一定的缓存，可能是SQL查询缓存等，后台的速度和整个网站的速度都有一定提高。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/04/update-wordpress-to-ver25/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>一个优秀的php相册系统——Coppermine Photo Gallery(二)部署与设置</title>
		<link>http://blog.williamgates.biz/2008/03/coppermine-photo-gallery-02/</link>
		<comments>http://blog.williamgates.biz/2008/03/coppermine-photo-gallery-02/#comments</comments>
		<pubDate>Sat, 08 Mar 2008 07:10:03 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[CPG]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2008/03/08/128</guid>
		<description><![CDATA[　　从今天开始介绍我安装CPG（开发者自己喜欢用这个简称，我也乐得）和配置为己用的整个过程。先说基本的部署与配置（今天不涉及代码修改）。 　　一、部署 　　从sourceforge下载CPG，解压缩，全部上传至你的主机，把albums和include两个目录chmod为777（官方文档说这很重要，但是对于IPower这样脚本执行者权限很高的主机是无所谓的）。建好数据库，最后运行http://your_server/coppermine_dir/install.php这个页面进行安装。都是安装php程序常见的步骤，很简单。 　　二、设置 　　作为管理员登录后，可以看到比普通用户多出来的一层菜单，其中第一项就是“设定”。这个设置菜单异常庞杂（因为不像WordPress有多层设置页面，CPG只有这一个）。下面我们就来讲解一下设置，主要是对一些重要的、可能需要自定义的选项。 基本设定 请根据自己情况修改：相册名称，CPG 的网址，时区跟 GMT 的差别 语言 &#038; 编码设定 语言：Chinese_gb，注意对非IE浏览器可能默认语言无效，用户可能需要自己在页面上选择语言 如果翻译的字句不存在使用英文替回：请务必打开 文字编码：保持UTF-8不要改变 显示语言列表：建议打开，CPG的lang目录下的语言文件不用全部上传，上传你认为需要的即可，上传了的会显示在这个列表里 风格设定 风格：选择所用的theme，上传在CPG的themes目录，可以用前面提到的下载页面下载更多的theme 自定义的菜单连接/自定义菜单的网址：可以在菜单中添加自定义项，前者是显示的名称，后者是实际的URL，既可以是CPG系统内的链接（如链接向插件控制面板，默认这个面板只能手动在浏览器栏输入网址访问），也可以链接到其他的网站，例如其他的附属站点 自定义标头的路径/自定义页尾的路径：可以在页首和页尾插入自定义html内容，最常见的用法应该是放置广告 相册目录显示 类别显示的层次数量：“catalist”也就是”类别“这个table里面显示的分类层次，例如我的相册这个值就是3，显示3层分类级别 缩略图像素：显示缩略图的框子的大小，取长宽中的较大者。这个值推荐跟下面要提到的生成缩略图的像素一样 主页的内容：自定义主体table中的内容，例如类别列表，相册列表，随机图片，热门图片等等。其中“anycontent”可以用于显示你自己所需要的内容（事先保存好的“anycontent.php”文件），最常见的用法仍然是广告，但是不能用于单张图片浏览界面，所以我干脆采用了另一种方法加入广告，在这个系列以后的文章中会提到 图片及缩略图设定 缩略图最大尺寸：生成缩略图时的最大尺寸（长宽中较大者），不同于前面的显示尺寸 建立中级图片：是否生成Normal文件，即中型图（类似于Yupoo等网站的功能），对于像我这样要传大型图片的使用还是很方便的，在其他论坛分享或者在相册中浏览的时候使用中型图，点击进入才能看到原图，这样速度和效果都能达到最好 中级图片/影片的最大尺寸：我把这里设成了1024，这样直接在论坛贴中型图地址就可以了，很方便 　　通过以上的修改，你的CPG应该就可以正常使用了。下一篇将讲解上传、修改和管理图片等日常功能。 No related posts.]]></description>
			<content:encoded><![CDATA[<p>　　从今天开始介绍我安装CPG（开发者自己喜欢用这个简称，我也乐得）和配置为己用的整个过程。先说基本的部署与配置（今天不涉及代码修改）。</p>
<p>　　一、部署<br />
　　从<a href="http://sourceforge.net/project/showfiles.php?group_id=89658">sourceforge</a>下载CPG，解压缩，全部上传至你的主机，把albums和include两个目录chmod为777（官方文档说这很重要，但是对于IPower这样脚本执行者权限很高的主机是无所谓的）。建好数据库，最后运行http://your_server/coppermine_dir/install.php这个页面进行安装。都是安装php程序常见的步骤，很简单。</p>
<p>　　二、设置<br />
　　作为管理员登录后，可以看到比普通用户多出来的一层菜单，其中第一项就是“设定”。这个设置菜单异常庞杂（因为不像WordPress有多层设置页面，CPG只有这一个）。下面我们就来讲解一下设置，主要是对一些重要的、可能需要自定义的选项。<br />
<span id="more-128"></span></p>
<ul>基本设定</p>
<li>请根据自己情况修改：相册名称，CPG 的网址，时区跟 GMT 的差别</li>
</ul>
<ul>语言 &#038; 编码设定</p>
<li>语言：Chinese_gb，注意对非IE浏览器可能默认语言无效，用户可能需要自己在页面上选择语言</li>
<li>如果翻译的字句不存在使用英文替回：请务必打开</li>
<li>文字编码：保持UTF-8不要改变</li>
<li>显示语言列表：建议打开，CPG的lang目录下的语言文件不用全部上传，上传你认为需要的即可，上传了的会显示在这个列表里</li>
</ul>
<ul>风格设定</p>
<li>风格：选择所用的theme，上传在CPG的themes目录，可以用前面提到的下载页面下载更多的theme</li>
<li>自定义的菜单连接/自定义菜单的网址：可以在菜单中添加自定义项，前者是显示的名称，后者是实际的URL，既可以是CPG系统内的链接（如链接向插件控制面板，默认这个面板只能手动在浏览器栏输入网址访问），也可以链接到其他的网站，例如其他的附属站点</li>
<li>自定义标头的路径/自定义页尾的路径：可以在页首和页尾插入自定义html内容，最常见的用法应该是放置广告</li>
</ul>
<ul>相册目录显示</p>
<li>类别显示的层次数量：“catalist”也就是”类别“这个table里面显示的分类层次，例如我的相册这个值就是3，显示3层分类级别</li>
<li>缩略图像素：显示缩略图的框子的大小，取长宽中的较大者。这个值推荐跟下面要提到的生成缩略图的像素一样</li>
<li>主页的内容：自定义主体table中的内容，例如类别列表，相册列表，随机图片，热门图片等等。其中“anycontent”可以用于显示你自己所需要的内容（事先保存好的“anycontent.php”文件），最常见的用法仍然是广告，但是不能用于单张图片浏览界面，所以我干脆采用了另一种方法加入广告，在这个系列以后的文章中会提到</li>
</ul>
<ul>图片及缩略图设定</p>
<li>缩略图最大尺寸：生成缩略图时的最大尺寸（长宽中较大者），不同于前面的显示尺寸</li>
<li>建立中级图片：是否生成Normal文件，即中型图（类似于Yupoo等网站的功能），对于像我这样要传大型图片的使用还是很方便的，在其他论坛分享或者在相册中浏览的时候使用中型图，点击进入才能看到原图，这样速度和效果都能达到最好</li>
<li>中级图片/影片的最大尺寸：我把这里设成了1024，这样直接在论坛贴中型图地址就可以了，很方便</li>
</ul>
<p>　　通过以上的修改，你的CPG应该就可以正常使用了。下一篇将讲解上传、修改和管理图片等日常功能。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/03/coppermine-photo-gallery-02/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>一个优秀的php相册系统——Coppermine Photo Gallery(一)基本介绍</title>
		<link>http://blog.williamgates.biz/2008/02/coppermine-photo-gallery-01/</link>
		<comments>http://blog.williamgates.biz/2008/02/coppermine-photo-gallery-01/#comments</comments>
		<pubDate>Sat, 23 Feb 2008 15:32:24 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[CPG]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2008/02/23/127</guid>
		<description><![CDATA[　　有了限制较少的虚拟主机，就琢磨着搞一个php的相册系统玩玩。经过在SF上查找比对，找到一个符合我要求的：Coppermine Photo Gallery。 基本架构/系统要求： PHP (4.1.0 or better) MySQL (3.23.23 or better; 4.x recommended) either GD or ImageMagick (any version) 基本特性： 自动生成缩略图、缩略图可设置大小、中型图功能（中等大小的预览图，非常有用） 多种上传方式，可以FTP批量上传再用网页导入，也可以上传压缩包 强大的皮肤、模板和自定义显示功能，页面上每个元素都可以轻松用配置文件修改 相册无限层分类 多用户，权限、组功能 公开、私人相册，密码保护相册 多语言，包括中文 支持多种媒体格式，包括视频 留言、投票、评分系统 对收藏的图片批量打包下载 　　还有重要的一点是较为广泛的用户群，产生了较多的mod、plugin，有些非常有用（这个系列的后续文章会介绍）。 　　我最看重的功能包括批量上传、自定义缩略图大小、中型图功能（对于论坛贴图，贴中型图，链接到原图，是非常好的方式，类似于yupoo等网站的分享功能）、中文界面、多用户（包括权限、组、密码保护相册等）。 　　今天就这么简单一说吧，明天再来详细介绍安装部署和一些修改技巧。大家可以到我的相册photo.williamgates.biz来看看效果 No related posts.]]></description>
			<content:encoded><![CDATA[<p>　　有了限制较少的虚拟主机，就琢磨着搞一个php的相册系统玩玩。经过在SF上查找比对，找到一个符合我要求的：<a href="http://coppermine-gallery.net/">Coppermine Photo Gallery</a>。
<ul>基本架构/系统要求：</p>
<li>PHP (4.1.0 or better)</li>
<li>MySQL (3.23.23 or better; 4.x recommended)</li>
<li>either GD or ImageMagick (any version)</li>
</ul>
<ul>基本特性：	</p>
<li>自动生成缩略图、缩略图可设置大小、<strong>中型图功能</strong>（中等大小的预览图，非常有用）</li>
<li>多种上传方式，可以<strong>FTP批量上传</strong>再用网页导入，也可以上传压缩包</li>
<li>强大的<strong>皮肤、模板</strong>和自定义显示功能，页面上每个元素都可以轻松用配置文件修改</li>
<li>相册无限层分类</li>
<li>多用户，权限、组功能</li>
<li>公开、<strong>私人相册，密码保护相册</strong></li>
<li>多语言，包括<strong>中文</strong></li>
<li>支持多种媒体格式，包括视频</li>
<li>留言、投票、评分系统</li>
<li>对收藏的图片批量打包下载</li>
</ul>
<p>　　还有重要的一点是较为广泛的用户群，产生了较多的mod、plugin，有些非常有用（这个系列的后续文章会介绍）。<br />
　　我最看重的功能包括批量上传、自定义缩略图大小、中型图功能（对于论坛贴图，贴中型图，链接到原图，是非常好的方式，类似于yupoo等网站的分享功能）、中文界面、多用户（包括权限、组、密码保护相册等）。<br />
　　今天就这么简单一说吧，明天再来详细介绍安装部署和一些修改技巧。大家可以到我的相册<a href="http://photo.williamgates.biz/">photo.williamgates.biz</a>来看看效果</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/02/coppermine-photo-gallery-01/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>再见了,ICP备(五)WordPress的优化、修复、备份和其他技巧</title>
		<link>http://blog.williamgates.biz/2008/02/goodbye-icp-records-05/</link>
		<comments>http://blog.williamgates.biz/2008/02/goodbye-icp-records-05/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 05:09:44 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2008/02/01/120</guid>
		<description><![CDATA[　　经过前几篇的过程，现在的WordPress已经能正常使用了，但是也许我们还需要进一步优化一下，解决一些问题。 　　一、WordPress的非必要插件 　　主要是指对Blog进行美化或者SEO的插件，我用了以下几个： All in One SEO Pack：通过自动修改你的页面title，自动添加meta等功能来实现搜索引擎优化 Google XML Sitemaps：通过自动生成XML Sitemaps（不仅仅针对Google）而对搜索引擎进行优化 WP-DownloadManager：非常强大的下载管理工具，我最喜欢的功能是可以随意添加服务器上存在的文件进行管理（从而不必通过http上传，FTP上传也可）；生成统一的下载页面等等 　　Blog的人气除了来自于朋友的访问，搜索引擎也是很重要的一点，我的Blog就常年有一半左右的访问来自Google的链接，主要关键字是Squid和百合驿站 :) 　　二、WordPress的复杂化 　　什么是复杂化，看到classicning的blog你就明白了……这里指的就是添加各种widgets，在WordPress 2.3中，通过后台管理方便地添加widgets已经是不需要任何技术的事情，但是你想不想让各网站的widgets以及你blog内置的widgets风格统一？请看几点注意事项： 　　1、内置>Javascript>Flash 　　对于web2.0网站，往往提供Flash和Javascript的widgets，但是由于新版本的Flash浏览器插件的安全设置，一般的嵌入方法会导致出现一层虚框，既影响美观又可能导致页面排版问题，而特殊的嵌入方法不仅麻烦，兼容也可能有一点点小问题。所以尽量使用内置的RSS widget达到你要的效果（如饭否就提供消息的RSS，直接用内置RSS widget读取最好），如果rss不能满足你的需要（例如饭否的“好友信息“，我现在用的就是），或者根本不提供rss（例如豆瓣），非要嵌入该网站自己的widget的时候，请尽量使用Javascript的版本。 　　2、注意网站widget的格式 　　很多网站（例如豆瓣）都提供了自定义widget的功能，这里要注意配置好自己的widget，要和sidebar风格协调统一，例如底色、长宽等。我现在的豆瓣插件就设置成尽量长宽和sidebar协调，看起来比classicning那个就要舒服一些…… 　　3、修改代码让text widget显示图标 　　想像我一样让各个网站的图标显示在WordPress内置的text widget的标题中？请打开wp-includes下的widgets.php文件（建议用WordPress自己的编辑工具），修改这个函数 function wp_widget_text_control($number) 的内容，把 $newoptions&#91;$number&#93;&#91;'title'&#93; = strip_tags&#40;stripslashes&#40;$_POST&#91;&#34;text-title-$number&#34;&#93;&#41;&#41;; 改为 $newoptions&#91;$number&#93;&#91;'title'&#93; = stripslashes&#40;$_POST&#91;&#34;text-title-$number&#34;&#93;&#41;; 把 $title = attribute_escape&#40;$options&#91;$number&#93;&#91;'title'&#93;&#41;; 改为 $title = format_to_edit&#40;$options&#91;$number&#93;&#91;'title'&#93;&#41;; 　　试试看，在text widget的标题中，输入 &#60;img src='你的ico文件地址' /&#62; 你需要的标题（例如 ”WilliamGates的豆瓣”） 　　就可以显示图标了。图标可以通过用FireFox打开该网站，右键点击页面，选”查看页面信息“里面的”媒体“来获得。 　　三、WordPress的修复 [...]]]></description>
			<content:encoded><![CDATA[<p>　　经过前几篇的过程，现在的WordPress已经能正常使用了，但是也许我们还需要进一步优化一下，解决一些问题。</p>
<p>　　一、WordPress的非必要插件<br />
　　主要是指对Blog进行美化或者SEO的插件，我用了以下几个：
<ul>
<li><a href="http://wp.uberdose.com/2007/03/24/all-in-one-seo-pack/">All in One SEO Pack</a>：通过自动修改你的页面title，自动添加meta等功能来实现搜索引擎优化</li>
<li><a href="http://www.arnebrachhold.de/redir/sitemap-home/">Google XML Sitemaps</a>：通过自动生成XML Sitemaps（不仅仅针对Google）而对搜索引擎进行优化</li>
<li><a href="http://lesterchan.net/portfolio/programming.php">WP-DownloadManager</a>：非常强大的下载管理工具，我最喜欢的功能是可以随意添加服务器上存在的文件进行管理（从而不必通过http上传，FTP上传也可）；生成统一的下载页面等等</li>
</ul>
<p>　　Blog的人气除了来自于朋友的访问，搜索引擎也是很重要的一点，我的Blog就常年有一半左右的访问来自Google的链接，主要关键字是Squid和百合驿站 :)</p>
<p>　　二、WordPress的复杂化<br />
　　什么是复杂化，看到<a href="http://www.classicning.com/blog/">classicning</a>的blog你就明白了……这里指的就是添加各种widgets，在WordPress 2.3中，通过后台管理方便地添加widgets已经是不需要任何技术的事情，但是你想不想让各网站的widgets以及你blog内置的widgets风格统一？请看几点注意事项：<br />
<span id="more-120"></span><br />
　　1、内置>Javascript>Flash<br />
　　对于web2.0网站，往往提供Flash和Javascript的widgets，但是由于新版本的Flash浏览器插件的安全设置，一般的嵌入方法会导致出现一层虚框，既影响美观又可能导致页面排版问题，而特殊的嵌入方法不仅麻烦，兼容也可能有一点点小问题。所以尽量使用内置的RSS widget达到你要的效果（如饭否就提供消息的RSS，直接用内置RSS widget读取最好），如果rss不能满足你的需要（例如<a href="http://www.fanfou.com">饭否</a>的“好友信息“，我现在用的就是），或者根本不提供rss（例如<a href="http://www.douban.com">豆瓣</a>），非要嵌入该网站自己的widget的时候，请尽量使用Javascript的版本。</p>
<p>　　2、注意网站widget的格式<br />
　　很多网站（例如豆瓣）都提供了自定义widget的功能，这里要注意配置好自己的widget，要和sidebar风格协调统一，例如底色、长宽等。我现在的豆瓣插件就设置成尽量长宽和sidebar协调，看起来比<a href="http://www.classicning.com/blog/">classicning</a>那个就要舒服一些……</p>
<p>　　3、修改代码让text widget显示图标<br />
　　想像我一样让各个网站的图标显示在WordPress内置的text widget的标题中？请打开wp-includes下的widgets.php文件（建议用WordPress自己的编辑工具），修改这个函数 <code>function wp_widget_text_control($number)</code> 的内容，把</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$newoptions</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strip_tags</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;text-title-<span style="color: #006699; font-weight: bold;">$number</span>&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$newoptions</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;text-title-<span style="color: #006699; font-weight: bold;">$number</span>&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>把</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> attribute_escape<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> format_to_edit<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>　　试试看，在text widget的标题中，输入</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'你的ico文件地址'</span> <span style="color: #66cc66;">/</span>&gt;</span> 你需要的标题（例如 ”WilliamGates的豆瓣”）</pre></div></div>

<p>　　就可以显示图标了。图标可以通过用FireFox打开该网站，右键点击页面，选”查看页面信息“里面的”媒体“来获得。</p>
<p>　　三、WordPress的修复<br />
　　昨天<a href="http://www.dlzm.net">DlzM</a>突然告诉我他的blog无法登陆了，进入后台管理就一片空白，页面无输出。我一开始怀疑是UTF8标题的问题（网上搜索都这么说），检查了所有的文件，都是WordPress原版，没有修改的痕迹。在数据库里把blog标题改成英文，也没有效果。DlzM坚持说是他的theme的问题，我就抱着试试看的心理，在数据库里把theme改成了default，没想到真的可以了。<br />
　　国外的很多theme对中文的支持都有问题，而且据说现在开始流行在WordPress Theme中放置恶意代码的阴险行为，所以有人建议大家不要随意下载第三方Theme和Plugin……我的建议是，尽量到这个theme或者plugin的作者网站，或者wordpress.org去下载；下载来之后，看一看head.php里面有没有什么特别的代码，以防万一。</p>
<p>　　四、WordPress的备份<br />
　　有了上次丢数据的惨痛经历，以后决定好好备份WordPress。备份方法有很多种，我推荐这几个一起使用：<br />
　　1、WordPress Database Backup<br />
　　这是一个WordPress的插件，主页在<a href="http://www.ilfilosofo.com/blog/wp-db-backup">www.ilfilosofo.com/blog/wp-db-backup</a>，它会自动加入WordPress的原始表，并且询问你是否要加入统一数据库下面的其他表（主要为其他插件自己建立的表，建议一起备份）；利用WordPress内建的Cron模块，可以定时备份（但有传言说这个功能有Bug，会导致莫名其妙的极高的CPU占用率，慎用）；可以选择备份文件是下载到本地、保存在服务器还是发到邮箱。个人建议手动备份，每个月一次就够了。</p>
<p>　　2、WordPress内建导出功能<br />
　　WordPress自己的导出功能可以导出整个数据库中的文章、留言、分类和Blogroll为一个XML文件（WordPress称之为WXR），基本上和备份数据库差不多了；导入的时候是一个全新的干净的数据库，符合我的数据洁癖；一个特殊的应用是，在进行批量帖子修改（例如前面提到过的批量修改帖子内的链接）时，直接对这个文件进行查找替换就可以了，比数据库的修改要方便，也安全。另外就是编码问题上，比数据库容易修改，毕竟对一个文本文件彻底转编码比对一个数据库转编码要方便（数据库导出时如果就是乱码，很可能再也无法正确导入）。这个功能用起来很方便，建议每周备份。</p>
<p>　　3、phpMyAdmin的备份功能<br />
　　这是最传统的方法，当然还有更传统的Dump命令，省省吧（在我<a href="http://blog.williamgates.biz/2006/11/01/38">以前的文章</a>中提到过用命令的方式导出和导入数据库，特殊情况下必须用那样的方法）。我推荐用WP-phpMyAdmin插件来备份，虽然没有什么理论根据，但实践证明它备份出来的数据库是我以前诸次导入中最容易成功的。这个最麻烦，建议每次升级WordPress的时候备份，备份之后一定要在本地导入试试看，确保不是乱码再动手升级。</p>
<p>　　我知道这篇是这个系列中最没什么营养的……下一篇是IPower空间的一些固有问题和解决方案。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/02/goodbye-icp-records-05/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Gregarius+Resco Neeews打造Palm上的RSS阅读解决方案</title>
		<link>http://blog.williamgates.biz/2007/11/gregarius-neeews-read-rss/</link>
		<comments>http://blog.williamgates.biz/2007/11/gregarius-neeews-read-rss/#comments</comments>
		<pubDate>Tue, 20 Nov 2007 12:46:53 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Palm]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Gregarius]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[treo]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2007/11/20/115</guid>
		<description><![CDATA[　　想从Palm上看瘾科技？想用手机关注三表和和菜头？Palm上的RSS阅读软件不多，中文阅读更是困难无比。中国人用Palm上阅读中文RSS FEED，最主要的难题在于： 　　1、Palm内核不支持UTF-8，无法读取UTF-8编码的RSS。 　　2、国内手机上网慢、贵、限流量，如果下载所有的图片，简直就是自虐和烧钱行为（特别是看瘾科技的时候）。 　　3、Palm上的Java支持很差，很多现在流行的方式，例如维信(我没用过，挺感兴趣)，以及各种大众化的Java软件均不适用于Palm，即使有Palm版本的(如掌讯通)也只有极少的功能。 　　在Palm上阅读RSS，常用的方法不外乎： 　　方案一：Blazer+Google Reader 　　Blazer就是Palm上官方自带的Web浏览器，它与鲜果不兼容，而且考虑到技术水平和翻墙的用途，Google Reader无疑是最好的选择。 　　优点： 　　1、阅读进度与PC同步，在手机上看过的PC上就不会再提示你没看过 　　2、可以标记某些Item为Starred，这样就加强了与PC的同步（DlzM提供的方法，例如你看到一篇文章，想看其中的图片，可以加星然后到电脑上看） 　　3、对RSS Feed的兼容性最强 　　缺点： 　　1、虽然可以控制某副图片是否下载，但如果该图片带链接，点击后就直接访问了该链接，无法控制该图片的下载 　　2、加星看图片的方式毕竟不方便 　　3、毕竟是浏览器阅读，Google Reader并非是为移动设备设计的，版面不好看，且操纵不方便，最关键的是不能管理来源，即不能修改也不能添加RSS Feed 　　方案二：QuickNews 　　QuickNews是Palm上的老牌RSS阅读软件，特性包括图片的单独下载、Podcast支持（在中国用手机下载Podcast简直就是给移动注资）、代理支持（也就是说支持CMWAP）以及对不同Feed较好的兼容性。 　　缺点非常明显，由于绝对不支持UTF-8，除非在源上作处理，否则根本无法阅读绝大部分中文RSS。 　　方案三：Gregarius+Resco Neeews 　　这才是我们要说的重头戏，既然QuickNews什么都好，就是不能读UTF-8的中文页面，那我们就需要找一个能解决这一问题、还能拥有它其他功能的方案来。 　　Gregarius是著名的基于php的RSS聚合器，功能就是将你所设定的来源聚合在一起，以HTM或者XML方式输出，对于普通用户来说，其实作用和Google Reader差不多，但是Google Reader不提供XML输出。 　　Resco Neeews是Palm 上RSS阅读软件的后起之秀，我是从它最初的测试版一直跟进到现在的，直到前段时间它的最新版本支持了图片的单独下载（点击图片可以选择），我才决定构建这一套解决方案。他最大的特点，是可以读取经过某种处理的UTF-8的RSS，具体是什么原理，我也没有明白，不排除是我所说的“某种处理”会根据 HTTP Request中的编码请求决定发出的编码吧。这种“处理”就是第三方的Feed托管，例如FeedBurner，但是它被盾了；FeedSky我没试过，不清楚是否有效。求人不如求己，我决定自己搭建一个Feed托管，最方便的办法就是用Gregarius了。我们来看看步骤 Gregarius部分： 　　1、你需要一个php空间，最好有Cron Job的功能（Linux下的定时执行）。我用了英国的STRATO空间，因为便宜啊（一英镑一年……），而且在国外的好处还在于，我们的聚合器可以随意读取任何Feed（例如FeedBurner的）而不受大墙的限制，这也是新式的翻墙方式吧…… 　　2、下载最新版本的Gregarius，并且上传到服务器，不用修改任何配置文件，安装程序会帮你做一切，它会询问你数据库用户名和密码，管理员用户名和密码等等。 　　3、假设你上传到的地址是http://example.com/Gregarius,则访问http://example.com/Gregarius/install.php进行安装。 　　4、如果出现500错误，说明你的空间可能跟我一样没有打开mod_rewrite，请你删除服务器上Gregarius目录下的.htaccess 文件，并且访问http://example.com/gregarius/admin/index.php?domain=config，把 rss.output.usemodrewrite关掉。 　　5、访问Gregarius，修改配置（可以用中文），加入Feed（可以导入OPML），然后你就获得了一个运作正常的RSS聚合器，一个你自己的Blog门户（你可以用它来代替Google Reader等阅读器，平时在PC上也可以阅读）。 　　6、打开RSS输出。Gregarius默认不提供RSS输出，请到Gregarius的插件中打开RSS View插件，这样在页面的底部就会出现RSS和ATOM链接，整个聚合器、每个分类和每个源都分别有一个RSS输出。 　　7、你需要有一个自动更新的方式。Gregarius默认的更新方式是，每当浏览器打开它的页面长达一定时间的时候，就开始更新。这个值可以在设置中通过rss.config.refreshafter来修改。但由于我们要用手机阅读，这显然不是一个好的办法。最笨的办法莫过于用手机访问Gregarius的首页，然后点一下更新，不过如果你没有Cron Job（或者其他任何可以定时访问某个地址的服务器），可能也只能这样了。 　　利用Cron Job自动更新的方法：设置一个Cron命令为 wget -O - -q [...]]]></description>
			<content:encoded><![CDATA[<p>　　想从Palm上看<a href="http://cn.engadget.com/">瘾科技</a>？想用手机关注<a href="http://www.wangxiaofeng.net/">三表</a>和<a href="http://www.hecaitou.net/">和菜头</a>？Palm上的RSS阅读软件不多，中文阅读更是困难无比。中国人用Palm上阅读中文RSS FEED，最主要的难题在于：</p>
<p>    　　1、Palm内核不支持UTF-8，无法读取UTF-8编码的RSS。<br />
    　　2、国内手机上网慢、贵、限流量，如果下载所有的图片，简直就是自虐和烧钱行为（特别是看瘾科技的时候）。<br />
    　　3、Palm上的Java支持很差，很多现在流行的方式，例如<a href="https://cn.widsets.com/">维信</a>(我没用过，挺感兴趣)，以及各种大众化的Java软件均不适用于Palm，即使有Palm版本的(如掌讯通)也只有极少的功能。</p>
<p>　　在Palm上阅读RSS，常用的方法不外乎：<br />
<span id="more-115"></span><br />
　　<strong>方案一：Blazer+Google Reader</strong><br />
　　Blazer就是Palm上官方自带的Web浏览器，它与<a href="http://www.xianguo.com/">鲜果</a>不兼容，而且考虑到技术水平和翻墙的用途，Google Reader无疑是最好的选择。</p>
<p>    　　优点：<br />
    　　1、阅读进度与PC同步，在手机上看过的PC上就不会再提示你没看过<br />
    　　2、可以标记某些Item为Starred，这样就加强了与PC的同步（<a href="http://www.dlzm.net/">DlzM</a>提供的方法，例如你看到一篇文章，想看其中的图片，可以加星然后到电脑上看）<br />
    　　3、对RSS Feed的兼容性最强</p>
<p>    　　缺点：<br />
    　　1、虽然可以控制某副图片是否下载，但如果该图片带链接，点击后就直接访问了该链接，无法控制该图片的下载<br />
    　　2、加星看图片的方式毕竟不方便<br />
    　　3、毕竟是浏览器阅读，Google Reader并非是为移动设备设计的，版面不好看，且操纵不方便，最关键的是不能管理来源，即不能修改也不能添加RSS Feed</p>
<p>　　<strong>方案二：QuickNews</strong><br />
　　<a href="http://standalone.com/palmos/quick_news/">QuickNews</a>是Palm上的老牌RSS阅读软件，特性包括图片的单独下载、Podcast支持（在中国用手机下载Podcast简直就是给移动注资）、代理支持（也就是说支持CMWAP）以及对不同Feed较好的兼容性。<br />
　　缺点非常明显，由于绝对不支持UTF-8，除非在源上作处理，否则根本无法阅读绝大部分中文RSS。</p>
<p>　　<strong>方案三：Gregarius+Resco Neeews</strong><br />
　　这才是我们要说的重头戏，既然QuickNews什么都好，就是不能读UTF-8的中文页面，那我们就需要找一个能解决这一问题、还能拥有它其他功能的方案来。<br />
　　<a href="http://gregarius.net/">Gregarius</a>是著名的基于php的RSS聚合器，功能就是将你所设定的来源聚合在一起，以HTM或者XML方式输出，对于普通用户来说，其实作用和Google Reader差不多，但是Google Reader不提供XML输出。<br />
　　<a href="http://www.resco.net/palm/neeews/">Resco Neeews</a>是Palm 上RSS阅读软件的后起之秀，我是从它最初的测试版一直跟进到现在的，直到前段时间它的最新版本支持了图片的单独下载（点击图片可以选择），我才决定构建这一套解决方案。他最大的特点，是可以读取经过某种处理的UTF-8的RSS，具体是什么原理，我也没有明白，不排除是我所说的“某种处理”会根据 HTTP Request中的编码请求决定发出的编码吧。这种“处理”就是第三方的Feed托管，例如<a href="http://www.feedburner.com/">FeedBurner</a>，但是它被盾了；<a href="http://www.feedsky.com/">FeedSky</a>我没试过，不清楚是否有效。求人不如求己，我决定自己搭建一个Feed托管，最方便的办法就是用Gregarius了。我们来看看步骤</p>
<p>Gregarius部分：<br />
　　1、你需要一个php空间，最好有Cron Job的功能（Linux下的定时执行）。我用了英国的STRATO空间，因为便宜啊（一英镑一年……），而且在国外的好处还在于，我们的聚合器可以随意读取任何Feed（例如FeedBurner的）而不受大墙的限制，这也是新式的翻墙方式吧……<br />
　　2、下载最新版本的Gregarius，并且上传到服务器，不用修改任何配置文件，安装程序会帮你做一切，它会询问你数据库用户名和密码，管理员用户名和密码等等。<br />
　　3、假设你上传到的地址是http://example.com/Gregarius,则访问http://example.com/Gregarius/install.php进行安装。<br />
　　4、如果出现500错误，说明你的空间可能跟我一样没有打开mod_rewrite，请你删除服务器上Gregarius目录下的.htaccess 文件，并且访问http://example.com/gregarius/admin/index.php?domain=config，把 rss.output.usemodrewrite关掉。<br />
　　5、访问Gregarius，修改配置（可以用中文），加入Feed（可以导入OPML），然后你就获得了一个运作正常的RSS聚合器，一个你自己的Blog门户（你可以用它来代替Google Reader等阅读器，平时在PC上也可以阅读）。<br />
　　6、打开RSS输出。Gregarius默认不提供RSS输出，请到Gregarius的插件中打开RSS View插件，这样在页面的底部就会出现RSS和ATOM链接，整个聚合器、每个分类和每个源都分别有一个RSS输出。<br />
　　7、你需要有一个自动更新的方式。Gregarius默认的更新方式是，每当浏览器打开它的页面长达一定时间的时候，就开始更新。这个值可以在设置中通过rss.config.refreshafter来修改。但由于我们要用手机阅读，这显然不是一个好的办法。最笨的办法莫过于用手机访问Gregarius的首页，然后点一下更新，不过如果你没有Cron Job（或者其他任何可以定时访问某个地址的服务器），可能也只能这样了。<br />
　　利用Cron Job自动更新的方法：设置一个Cron命令为</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-O</span> - <span style="color: #660033;">-q</span> http:<span style="color: #000000; font-weight: bold;">//</span>example.com<span style="color: #000000; font-weight: bold;">/</span>gregarius<span style="color: #000000; font-weight: bold;">/</span>update.php</pre></div></div>

<p>　　其中wget是一个简易http/ftp Client，-O表示输出到特定文件，-表示输出到的这个文件不存在（即不输出），-q表示安静模式（不在shell下返回结果）。然后设置更新频率（我设为四小时一次），其他的自己看着办就行了。如果是需要你自己输入完整命令的方式（shell下的方式），大家可以上网去搜索Cron php，可以找到Cron命令的完整使用方式。</p>
<p>Neeews部分：<br />
　　1、你需要有一台能上网的Palm设备（废话），我的是Treo680。<br />
　　2、安装Neeews（网上到处都有Resco全套软件的Keygen，而且Resco财大气粗，多年不换key的生成方式……Keygen我不方便提供）<br />
　　3、新建Newspaper，加入相应的Feed，我个人建议对你在Gregarius中的每个分类建立一个Newspaper，这样不需要添加很多 Feed，也不需要把所有Feed堆在一起造成难以阅读。例如我的分类就是Blogs（朋友的Blog）,Blogs-other（名人的Blog）， tech（瘾科技和奇趣发现），等等等等。<br />
　　4、修改设置，记得设置所有的Newspaper都为“Show Images”，在全局设置中的“Image Options”中，选上“Offline mode”。前者的作用是在更新的时候显示出图片的图标，后者的作用是只要没有进行更新，每次进入Newspaper的时候不重新下载图片。<br />
　　5、每次更新的时候，记得在更新完内容、开始下载图片的时候，点左上角的小叉停止下载图片，然后在浏览的时候看到想要看的图片，点击图标，然后选择Download Image即可。</p>
<p>　　Ok，现在你可以在手机上享受阅读RSS的乐趣了。我的Gregarius的地址：rss.williamgates.biz ，大家可以去看看效果。</p>
<p>　　当然还有更好的办法，自己写一个聚合器，可以转换编码，可以针对不同的来源Feed做不同的处理，还可以下载图片到聚合器的服务器上并且修改大小来适应手机（可以避免163等的反盗链，又可以减少手机的流量）。我已经用C#写了一个并且成功运行了一年多了，但是服务器在我们校园网内，暂时无法从校外访问，我在校外也没有asp.net的服务器，所以也就没有使用这个办法。而且我的程序也有一些不足，其中我说的修改图片大小的功能还没做，对某些来源的处理不如Gregarius优秀，有的时候还要借用FeedBurner和FeedSky进行一次预转换才能完美读取。明年等我考过研，我会重新和完善这个程序，到时候也许我们就拥有更好的解决方案了。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2007/11/gregarius-neeews-read-rss/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
