<?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/"
	>

<channel>
	<title>醉爱PHP</title>
	<atom:link href="http://www.php5x.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.php5x.com</link>
	<description>专注与坚持不懈</description>
	<pubDate>Tue, 02 Mar 2010 17:29:59 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>在OpenVZ下的VPS安装OpenVPN（CentOS 5）</title>
		<link>http://www.php5x.com/?p=28</link>
		<comments>http://www.php5x.com/?p=28#comments</comments>
		<pubDate>Tue, 02 Mar 2010 17:29:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[centos openvpn openVZ]]></category>

		<guid isPermaLink="false">http://www.php5x.com/?p=28</guid>
		<description><![CDATA[朋友Sheneyan买了一个burst.net的VPS，想用它来做一个VPN，就不用为翻墙发愁了。是OpenVZ做的VPS (ad: https://www.burst.net/linvps.shtml ) ，据说用起来挺爽，有多种流行的Linux系统可供选择。然后选择了服务器也比较热门的CentOS系统。并且他购买的产品，可在控制面板自己打开 VPS的tun/tap，使得VPN能上网还要有iptable的。（默认的系统里就有）结合网上的多个教程，整理如下：
参考1：http://westlife.me.uk/459.html
参考2：http://www.lenghost.cn/site-news/burstnet-vps-openvpn-install/
安装步骤开始：
一：服务器
1.用Putty登录你的VPS（额 地球人都知道）
2. 下载LZO和OpenVPN （我用的OpenVPN是2.1.rc15版）





1
2


wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
wget http://openvpn.net/release/openvpn-2.1_rc22.tar.gz





3.安装OpenSSL





1


yum install -y openssl-devel





4.安装Gcc ，这是用来编译后面的C语言的（我用的VPS默认没安装，如果已经安装的会有提示）





1


 yum install gcc





5. 安装LZO和OpenVPN





1
2
3
4
5
6
7
8
9
10
11
12
13


tar zxvf lzo-2.03.tar.gz //解压
cd lzo-2.03
./configure
make
make install //安装
cd ..
tar zxvf openvpn-2.1_rc15.tar.gz //解压
cd openvpn-2.1_rc15
./configure
make
make install //安装
cd ..
cp /root/openvpn-2.1_rc15/easy-rsa/ -r /etc/openvpn //拷贝文件





6.生成证书
初始化PKI





1
2
3
4
5
6
7
8
9
10
11


cd /etc/openvpn/2.0/
export D=`pwd`
export KEY_CONFIG=$D/openssl.cnf
export KEY_DIR=$D/keys
export KEY_SIZE=1024
export KEY_COUNTRY=Cn
export KEY_PROVINCE=FJ
export KEY_CITY=FZ
export KEY_ORG="Rex"  //引号要用英文半角符号
export KEY_EMAIL="mail@mail.com"   //引号要用英文半角符号
. vars





7.创建证书颁发机构(CA)





1
2


./clean-all //这行命令是清空Keys文件夹下的所有文件
./build-ca





接下来的信息你可以自己填写
8. 建立server key





1


./build-key-server server





接下来的信息你可以自己填写
9. [...]]]></description>
			<content:encoded><![CDATA[<p>朋友Sheneyan买了一个burst.net的VPS，想用它来做一个VPN，就不用为翻墙发愁了。是OpenVZ做的VPS (ad: <a href="https://www.burst.net/linvps.shtml">https://www.burst.net/linvps.shtml</a> ) ，据说用起来挺爽，有多种流行的Linux系统可供选择。然后选择了服务器也比较热门的CentOS系统。并且他购买的产品，可在控制面板自己打开 VPS的tun/tap，使得VPN能上网还要有iptable的。（默认的系统里就有）结合网上的多个教程，整理如下：</p>
<p>参考1：<a href="http://westlife.me.uk/459.html">http://westlife.me.uk/459.html</a><br />
参考2：<a href="http://www.lenghost.cn/site-news/burstnet-vps-openvpn-install/">http://www.lenghost.cn/site-news/burstnet-vps-openvpn-install/</a></p>
<p>安装步骤开始：</p>
<p>一：服务器</p>
<p>1.用Putty登录你的VPS（额 地球人都知道）</p>
<p>2. 下载LZO和OpenVPN （我用的OpenVPN是2.1.rc15版）</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2</pre>
</td>
<td class="code">
<pre class="php">wget http<span>:</span><span>//www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz</span>
wget http<span>:</span><span>//openvpn.net/release/openvpn-2.1_rc22.tar.gz</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>3.安装OpenSSL</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1</pre>
</td>
<td class="code">
<pre class="php">yum install <span>-</span>y openssl<span>-</span>devel</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>4.安装Gcc ，这是用来编译后面的C语言的（我用的VPS默认没安装，如果已经安装的会有提示）</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1</pre>
</td>
<td class="code">
<pre class="php"> yum install gcc</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>5. 安装LZO和OpenVPN</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2
3
4
5
6
7
8
9
10
11
12
13</pre>
</td>
<td class="code">
<pre class="php">tar zxvf lzo<span>-</span>2<span>.</span>03<span>.</span>tar<span>.</span>gz <span>//解压</span>
cd lzo<span>-</span><span>2.03</span>
<span>./</span>configure
make
make install <span>//安装</span>
cd <span>..</span>
tar zxvf openvpn<span>-</span><span>2.1</span>_rc15<span>.</span>tar<span>.</span>gz <span>//解压</span>
cd openvpn<span>-</span><span>2.1</span>_rc15
<span>./</span>configure
make
make install <span>//安装</span>
cd <span>..</span>
cp <span>/</span>root<span>/</span>openvpn<span>-</span><span>2.1</span>_rc15<span>/</span>easy<span>-</span>rsa<span>/</span> <span>-</span>r <span>/</span>etc<span>/</span>openvpn <span>//拷贝文件</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>6.生成证书</p>
<p>初始化PKI</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2
3
4
5
6
7
8
9
10
11</pre>
</td>
<td class="code">
<pre class="php">cd <span>/</span>etc<span>/</span>openvpn<span>/</span><span>2.0</span><span>/</span>
export D<span>=</span>`pwd`
export KEY_CONFIG<span>=</span><span>$D</span><span>/</span>openssl<span>.</span>cnf
export KEY_DIR<span>=</span><span>$D</span><span>/</span>keys
export KEY_SIZE<span>=</span><span>1024</span>
export KEY_COUNTRY<span>=</span>Cn
export KEY_PROVINCE<span>=</span>FJ
export KEY_CITY<span>=</span>FZ
export KEY_ORG<span>=</span><span>"Rex"</span>  <span>//引号要用英文半角符号</span>
export KEY_EMAIL<span>=</span><span>"mail@mail.com"</span>   <span>//引号要用英文半角符号</span>
<span>.</span> vars</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>7.创建证书颁发机构(CA)</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2</pre>
</td>
<td class="code">
<pre class="php"><span>./</span>clean<span>-</span>all <span>//这行命令是清空Keys文件夹下的所有文件</span>
<span>./</span>build<span>-</span>ca</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>接下来的信息你可以自己填写</p>
<p>8. 建立server key</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1</pre>
</td>
<td class="code">
<pre class="php"><span>./</span>build<span>-</span>key<span>-</span>server server</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>接下来的信息你可以自己填写</p>
<p>9. 生成客户端 key</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1</pre>
</td>
<td class="code">
<pre class="php"><span>./</span>build<span>-</span><span>key</span> client1 <span>// client1 可以自定义 这个是客户的名字</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>接下来的信息你可以自己填写</p>
<p>10.以此类推建立其他客户端 key，当然你也可以不用，也可以在使用中在添加，不过比较麻烦，文章后会有教程</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2</pre>
</td>
<td class="code">
<pre class="php"><span>./</span>build<span>-</span><span>key</span> client2
<span>./</span>build<span>-</span><span>key</span> client3</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>注意在进入 Common Name (eg, your name or your server’s hostname) []: 的输入时, 每个证书输入的名字必须不同.</p>
<p>11. 生成Diffie Hellman参数 <span>（这个很重要）</span></p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1</pre>
</td>
<td class="code">
<pre class="php"><span>./</span>build<span>-</span>dh</pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="wp_syntax">(如果这里发生错误，请尝试：openssl dhparam -out ./keys/dh1024.pem 1024)</div>
<p>12. 将 keys 下的所有文件打包下载到本地(可以通过winscp,http,ftp等等……)</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1</pre>
</td>
<td class="code">
<pre class="php">tar zcvf yourkeys<span>.</span>tar<span>.</span>gz keys<span>/</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>13. 创建服务端配置文件</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2</pre>
</td>
<td class="code">
<pre class="php"><span>mkdir</span> <span>/</span>etc<span>/</span>openvpn<span>/</span><span>2.0</span><span>/</span>conf
cp <span>/</span>root<span>/</span>openvpn<span>-</span><span>2.1</span>_rc15<span>/</span>sample<span>-</span>config<span>-</span>files<span>/</span>server<span>.</span>conf <span>/</span>etc<span>/</span>openvpn<span>/</span><span>2.0</span><span>/</span>conf<span>/</span>server<span>.</span>conf</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>14.服务端配置文件(server.conf) 我建议使用winscp 把/etc/openvpn/2.0/conf/server.conf 下的server.conf 文件下载到本地用Notepad++工具编辑。这里给个参考</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22</pre>
</td>
<td class="code">
<pre class="php">port <span>1194</span>
proto udp
dev tun
ca <span>/</span>etc<span>/</span>openvpn<span>/</span><span>2.0</span><span>/</span>keys<span>/</span>ca<span>.</span>crt        <span>//这个需要按照具体目录设置</span>
cert <span>/</span>etc<span>/</span>openvpn<span>/</span><span>2.0</span><span>/</span>keys<span>/</span>server<span>.</span>crt  <span>//这个需要按照具体目录设置</span>
<span>key</span> <span>/</span>etc<span>/</span>openvpn<span>/</span><span>2.0</span><span>/</span>keys<span>/</span>server<span>.</span><span>key</span>   <span>//这个需要按照具体目录设置</span>
dh <span>/</span>etc<span>/</span>openvpn<span>/</span><span>2.0</span><span>/</span>keys<span>/</span>dh1024<span>.</span>pem    <span>//这个需要按照具体目录设置</span>
server 10<span>.</span>8<span>.</span>0<span>.</span>0 255<span>.</span>255<span>.</span>255<span>.</span>0
ifconfig<span>-</span>pool<span>-</span>persist ipp<span>.</span>txt
push <span>"redirect-gateway def1 bypass-dhcp"</span>
push <span>"dhcp-option DNS 10.8.0.1"</span>
push <span>"dhcp-option DNS 208.67.222.222"</span>
push <span>"dhcp-option DNS 208.67.220.220"</span>
client<span>-</span>to<span>-</span>client
keepalive <span>10</span> <span>120</span>
comp<span>-</span>lzo
user nobody
group nobody
persist<span>-</span><span>key</span>
persist<span>-</span>tun
status openvpn<span>-</span>status<span>.</span><span>log</span>
verb <span>3</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>15.启动OpenVPN</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2</pre>
</td>
<td class="code">
<pre class="php">setsid <span>/</span>usr<span>/</span>local<span>/</span>sbin<span>/</span>openvpn <span>--</span>config <span>/</span>etc<span>/</span>openvpn<span>/</span><span>2.0</span><span>/</span>conf<span>/</span>server<span>.</span>conf   <span>// 这个命令是能在你退出Putty继续让服务工作</span>
<span>/</span>etc<span>/</span>rc<span>.</span>d<span>/</span>init<span>.</span>d<span>/</span>iptables start</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>16. OpenVPN 访问外网的设置（如果不设置，你连上后只能在你和VPS之间建立VPN）</p>
<p>关闭Putty后重新登录   输入</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1</pre>
</td>
<td class="code">
<pre class="php">ifconfig</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>输出：如：</p>
<p>venet0:1  Link en</p>
<p>cap:UNSPEC</p>
<p>Hwaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00</p>
<p>inet addr:你的VPSIP地址  P-t-P: 你的VPSIP地址  Bcast: 你的VPSIP地址  Mask:255.255.255.255</p>
<p><span> “venet0”要记录下来！（不同的地方不一样）</span></p>
<p>继续输入</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1</pre>
</td>
<td class="code">
<pre class="php">iptables <span>-</span>t nat <span>-</span>A POSTROUTING <span>-</span>s 10<span>.</span>8<span>.</span>0<span>.</span>0<span>/</span><span>24</span> <span>-</span>o venet0 <span>-</span>j MASQUERADE</pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="wp_syntax">（如果你运行上面的出现 iptables: Unknown error 4294967295 这样的错误，可以尝试下面的）</div>
<div class="wp_syntax">/sbin/iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -j SNAT &#8211;to-source [你的IP地址]</div>
<p>其中的venet0 按情况更改</p>
<p>继续输入</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2</pre>
</td>
<td class="code">
<pre class="php"><span>/</span>etc<span>/</span>init<span>.</span>d<span>/</span>iptables save
<span>/</span>etc<span>/</span>init<span>.</span>d<span>/</span>iptables restart</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>17.查看</p>
<p>输入</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1</pre>
</td>
<td class="code">
<pre class="php">sysctl <span>-</span>a <span>|</span> grep <span>for</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>查看结果 如：</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2
3
4
5
6
7
8
9
10
11</pre>
</td>
<td class="code">
<pre class="php">net<span>.</span>ipv4<span>.</span>conf<span>.</span>tun0<span>.</span>mc_forwarding <span>=</span> <span>0</span>
net<span>.</span>ipv4<span>.</span>conf<span>.</span>tun0<span>.</span>forwarding <span>=</span> <span>1</span>
net<span>.</span>ipv4<span>.</span>conf<span>.</span> venet0<span>.</span>mc_forwarding <span>=</span> <span>0</span>
net<span>.</span>ipv4<span>.</span>conf<span>.</span> venet0<span>.</span>forwarding <span>=</span> <span>1</span>
net<span>.</span>ipv4<span>.</span>conf<span>.</span>lo<span>.</span>mc_forwarding <span>=</span> <span>0</span>
net<span>.</span>ipv4<span>.</span>conf<span>.</span>lo<span>.</span>forwarding <span>=</span> <span>1</span>
net<span>.</span>ipv4<span>.</span>conf<span>.</span><span>default</span><span>.</span>mc_forwarding <span>=</span> <span>0</span>
net<span>.</span>ipv4<span>.</span>conf<span>.</span><span>default</span><span>.</span>forwarding <span>=</span> <span>1</span>
net<span>.</span>ipv4<span>.</span>conf<span>.</span>all<span>.</span>mc_forwarding <span>=</span> <span>0</span>
net<span>.</span>ipv4<span>.</span>conf<span>.</span>all<span>.</span>forwarding <span>=</span> <span>1</span>
net<span>.</span>ipv4<span>.</span>ip_forward <span>=</span> <span>1</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>如果你的主机上列数值不是为1, 则要将其改成1, 用这个命令</p>
<p>如：</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1</pre>
</td>
<td class="code">
<pre class="php">sysctl <span>-</span>w net<span>.</span>ipv4<span>.</span>ip_forward<span>=</span><span>1</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>18. 设置 OpenVPN 服务器 reboot后自动启动 openvpn</p>
<div class="wp_syntax">
<table border="0">
<tbody>
<tr>
<td class="line_numbers">
<pre>1
2</pre>
</td>
<td class="code">
<pre class="php">vi <span>/</span>etc<span>/</span>rc<span>.</span>local
<span>/</span>usr<span>/</span>local<span>/</span>sbin<span>/</span>openvpn <span>--</span>config <span>/</span>etc<span>/</span>openvpn<span>/</span><span>2.0</span><span>/</span>conf<span>/</span>server<span>.</span>conf <span>&amp;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>19.到此 基本就可以链接上去试试了，访问下如ip138.com 这类的网站，看看你的IP哦～</p>
<p>二：客户端配置</p>
<p>1. 下载 openvpn-2.1_rc22-install.exe(此版本集成 OpenVPN  GUI)<br />
下载地址：http<span>:</span><span>//openvpn.net/release/openvpn-2.1_rc22-install.exe </span></p>
<p>2.安装OpenVPN GUI（用默认安装）</p>
<p>3.配置</p>
<p>将上面yourkeys.tar.gz中的下列证书文件解压到 你的OpenVPN GUI安装路径\OpenVPN\config文件夹下</p>
<p>ca.crt client1.key client1.crt</p>
<p>记住ca.key 千万别泄露哦</p>
<p>4. 修改client.ovpn</p>
<p>把你的OpenVPN安装路径\OpenVPN\sample-config下的client.ovpn文件复制到你的OpenVPN安装路径\OpenVPN\config文件夹下,用记事本打开client.ovpn</p>
<p>找到remote my-server-1 1194,把my-server-1改成你的VPS IP地址<br />
找到 cert client.crt 把 client.crt改为client1.crt<br />
找到 key client.key 把 client.key 改为 client1.key</p>
<p>5. 双击 client.ovpn 即可启动 openvpn, 或者通过 OpenVPN 的控制启动 VPN</p>
<p>6.出现 Initialization Sequence Completed 表示成功</p>
<p>三、添加一个小脚本，用于继续添加客户端的KEY</p>
<p>cd /etc/openvpn/2.0/<br />
vim bc.sh</p>
<p>#!/bin/bash</p>
<p>export D=`pwd`</p>
<p>export KEY_CONFIG=$D/openssl.cnf</p>
<p>export KEY_DIR=$D/keys</p>
<p>export KEY_SIZE=1024</p>
<p>export KEY_COUNTRY=Cn</p>
<p>export KEY_PROVINCE=FJ</p>
<p>export KEY_CITY=FZ</p>
<p>export KEY_ORG=&#8221;Rex&#8221;</p>
<p>export KEY_EMAIL=&#8221;mail@mail.com&#8221;</p>
<p>./vars</p>
<p>./build-key $1</p>
<p>使用方法：./bc.sh client2</p>
]]></content:encoded>
			<wfw:commentRss>http://www.php5x.com/?feed=rss2&amp;p=28</wfw:commentRss>
		</item>
		<item>
		<title>更换iBus五笔的左与右Shift快捷键</title>
		<link>http://www.php5x.com/?p=26</link>
		<comments>http://www.php5x.com/?p=26#comments</comments>
		<pubDate>Thu, 19 Nov 2009 08:35:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[ibus shift table]]></category>

		<guid isPermaLink="false">http://www.php5x.com/?p=26</guid>
		<description><![CDATA[习惯了windows下的极点输入法，在linux下的ibus的五笔，切换中英文时，要按左shift，总是不习惯。既然是开源的输入法，就自己动手改了吧。
cd /usr/share/ibus-table/engine/
sudo vim table.py
搜索 &#8220;Match mode switch hotkey&#8221;
# Match mode switch hotkey
if not self._editor._t_chars and ( self._match_hotkey (key, keysyms.Shift_L, modifier.SHIFT_MASK + modifier.RELEASE_MASK)):
把 Shift_L 改为 Shift_R
搜索 &#8220;because we ignore all Release event below&#8221;
# because we ignore all Release event below.
if self._match_hotkey (key, keysyms.Shift_R, modifier.SHIFT_MASK + modifier.RELEASE_MASK) and self._ime_py:
把 Shift_R 改为 Shift_L
保存。
重启ibus输入法
]]></description>
			<content:encoded><![CDATA[<p>习惯了windows下的极点输入法，在linux下的ibus的五笔，切换中英文时，要按左shift，总是不习惯。既然是开源的输入法，就自己动手改了吧。</p>
<p>cd /usr/share/ibus-table/engine/</p>
<p>sudo vim table.py</p>
<p>搜索 &#8220;Match mode switch hotkey&#8221;</p>
<p># Match mode switch hotkey<br />
if not self._editor._t_chars and ( self._match_hotkey (key, keysyms.Shift_L, modifier.SHIFT_MASK + modifier.RELEASE_MASK)):</p>
<p>把 Shift_L 改为 Shift_R</p>
<p>搜索 &#8220;because we ignore all Release event below&#8221;</p>
<p># because we ignore all Release event below.<br />
if self._match_hotkey (key, keysyms.Shift_R, modifier.SHIFT_MASK + modifier.RELEASE_MASK) and self._ime_py:</p>
<p>把 Shift_R 改为 Shift_L</p>
<p>保存。</p>
<p>重启ibus输入法</p>
]]></content:encoded>
			<wfw:commentRss>http://www.php5x.com/?feed=rss2&amp;p=26</wfw:commentRss>
		</item>
		<item>
		<title>让apache也支持shtml</title>
		<link>http://www.php5x.com/?p=25</link>
		<comments>http://www.php5x.com/?p=25#comments</comments>
		<pubDate>Mon, 08 Jun 2009 14:40:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[apache]]></category>

		<category><![CDATA[apache setting]]></category>

		<guid isPermaLink="false">http://www.php5x.com/?p=25</guid>
		<description><![CDATA[朋友发了一堆他网站的文件过来，一看扩展名，shtml。好家伙，以前使用IIS的时候，默认安装就有这个选择。
先来了解一下，什么是shtml，其实就是服务端包含的html，英文简称为SSI =&#62; Server Side Include
默认的apache是不支持这个东东的，毕竟在服务端包含，还是要费点资源的。不过自己做测试的时候，也是省得把重复的模块重写。
打开 httpd.conf 
查找： shtml
就会找到类似下面这样的设置
#   # Filters allow you to process content before it is sent to the client.    #    # To parse .shtml files for server-side includes (SSI):    # (You will also need to add &#34;Includes&#34; to the &#34;Options&#34; directive.) [...]]]></description>
			<content:encoded><![CDATA[<p>朋友发了一堆他网站的文件过来，一看扩展名，shtml。好家伙，以前使用IIS的时候，默认安装就有这个选择。</p>
<p>先来了解一下，什么是shtml，其实就是服务端包含的html，英文简称为SSI =&gt; Server Side Include</p>
<p>默认的apache是不支持这个东东的，毕竟在服务端包含，还是要费点资源的。不过自己做测试的时候，也是省得把重复的模块重写。</p>
<p>打开 httpd.conf </p>
<p>查找： shtml</p>
<p>就会找到类似下面这样的设置</p>
<p>#   <br /># Filters allow you to process content before it is sent to the client.    <br />#    <br /># To parse .shtml files for server-side includes (SSI):    <br /># (You will also need to add &quot;Includes&quot; to the &quot;Options&quot; directive.)    <br />#    <br />#AddType text/html .shtml    <br />#AddOutputFilter INCLUDES .shtml</p>
<p>把上面的最后两行前面的“#”号去掉，重新启动apache，它就支持shtml了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.php5x.com/?feed=rss2&amp;p=25</wfw:commentRss>
		</item>
		<item>
		<title>PHP判断字符串编码并且获取字符串中的中文</title>
		<link>http://www.php5x.com/?p=24</link>
		<comments>http://www.php5x.com/?p=24#comments</comments>
		<pubDate>Mon, 11 May 2009 07:09:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[regexp php encoding]]></category>

		<guid isPermaLink="false">http://www.php5x.com/?p=24</guid>
		<description><![CDATA[判断字符串的编码，使用正则表达式匹配是否为UTF-8编码
参考URL：http://www.w3.org/International/questions/qa-forms-utf-8.en.php
$result = preg_match(&#8217;%^(?:   &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [\x09\x0A\x0D\x20-\x7E] # ASCII    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#124; [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#124; \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#124; [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#124; \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#124; \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3  [...]]]></description>
			<content:encoded><![CDATA[<p>判断字符串的编码，使用正则表达式匹配是否为UTF-8编码</p>
<p>参考URL：<a title="http://www.w3.org/International/questions/qa-forms-utf-8.en.php" href="http://www.w3.org/International/questions/qa-forms-utf-8.en.php">http://www.w3.org/International/questions/qa-forms-utf-8.en.php</a></p>
<p>$result = preg_match(&#8217;%^(?:   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [\x09\x0A\x0D\x20-\x7E] # ASCII    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; )*$%xs&#8217;, $string);</p>
<p>如果$result为真，则是UTF-8编码的字符串，否为ANSI</p>
<p>以上面为条件，匹配出字符串中的中文</p>
<p>if ($result) {   <br />&#160;&#160;&#160; preg_match_all(&quot;/[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}/&quot;, $str, $arr);    <br />&#160;&#160;&#160; print_r($arr[0]);    <br />} else {    <br />&#160;&#160;&#160; preg_match_all(&quot;/[\x80-\xFF]./&quot;, $str, $arr);    <br />&#160;&#160;&#160; print_r($arr[0]);    <br />}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.php5x.com/?feed=rss2&amp;p=24</wfw:commentRss>
		</item>
		<item>
		<title>在windows下安装python2.6的setuptools</title>
		<link>http://www.php5x.com/?p=23</link>
		<comments>http://www.php5x.com/?p=23#comments</comments>
		<pubDate>Wed, 06 May 2009 07:40:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.php5x.com/?p=23</guid>
		<description><![CDATA[想在windows下安装个trac试试，结果，它需要有setuptools才可以继续下去。
然后跑到 http://pypi.python.org/pypi/setuptools#downloads 想去下载个windows下的setuptools，但眼睛扫描了两遍，也只是看到有python2.5 for windows版本的。但我已经安装了python2.6了。不想换来换去。google了一下，找到如下的解决方法：
1. 下载 setuptools-0.6c9.tar.gz   2. 下载 setuptools-0.6c9-py2.6.egg （放在同一个目录）    3. 用7-zip或者其他解压工具打开 setuptools-0.6c9.tar.gz ，并且把里面的 ez_setup.py 文件解压到同一个目录里。    4. 打开cmd窗口，并进入你刚才下载和解压文件的目录里。（例如： d:\downloads\）    5. 输入 python ez_setup.py setuptools-0.6c9-py2.6.egg 
完成setuptools在windows下python2.6版本的安装
]]></description>
			<content:encoded><![CDATA[<p>想在windows下安装个trac试试，结果，它需要有setuptools才可以继续下去。</p>
<p>然后跑到 <a href="http://pypi.python.org/pypi/setuptools#downloads">http://pypi.python.org/pypi/setuptools#downloads</a> 想去下载个windows下的setuptools，但眼睛扫描了两遍，也只是看到有python2.5 for windows版本的。但我已经安装了python2.6了。不想换来换去。google了一下，找到如下的解决方法：</p>
<p>1. 下载 setuptools-0.6c9.tar.gz   <br />2. 下载 setuptools-0.6c9-py2.6.egg （放在同一个目录）    <br />3. 用7-zip或者其他解压工具打开 setuptools-0.6c9.tar.gz ，并且把里面的 ez_setup.py 文件解压到同一个目录里。    <br />4. 打开cmd窗口，并进入你刚才下载和解压文件的目录里。（例如： d:\downloads\）    <br />5. 输入 python ez_setup.py setuptools-0.6c9-py2.6.egg </p>
<p>完成setuptools在windows下python2.6版本的安装</p>
]]></content:encoded>
			<wfw:commentRss>http://www.php5x.com/?feed=rss2&amp;p=23</wfw:commentRss>
		</item>
		<item>
		<title>Windows Live Writer发的第一篇日志</title>
		<link>http://www.php5x.com/?p=22</link>
		<comments>http://www.php5x.com/?p=22#comments</comments>
		<pubDate>Mon, 04 May 2009 05:58:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[windows]]></category>

		<category><![CDATA[windows live writer]]></category>

		<guid isPermaLink="false">http://www.php5x.com/?p=22</guid>
		<description><![CDATA[我的神啊，它怎么做得比wp后台发布的还好看啊！
]]></description>
			<content:encoded><![CDATA[<p>我的神啊，它怎么做得比wp后台发布的还好看啊！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.php5x.com/?feed=rss2&amp;p=22</wfw:commentRss>
		</item>
		<item>
		<title>Smarty逼我要这样去显示日期</title>
		<link>http://www.php5x.com/?p=20</link>
		<comments>http://www.php5x.com/?p=20#comments</comments>
		<pubDate>Wed, 22 Apr 2009 06:28:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[php smarty]]></category>

		<guid isPermaLink="false">http://www.php5x.com/?p=20</guid>
		<description><![CDATA[php中smarty对于日期的异常处理]]></description>
			<content:encoded><![CDATA[<div>
<p>设计者说，页面中的月与日的日期显示没有前导0。例如：2009年4月22日 而并不能显示为 2009年04月22日</p>
<p>可smarty的date_format插件却没怎么也找不到月份没有前导0的。google之也没找出来。</p>
<p>折衷一下，只好这样做处理了。</p>
<p>$datetime|date_format:&#8221;%Y-%m-%d&#8221;|regex_replace:&#8221;(\d+)\-0*(\d+)\-0*(\d+)&#8221;:&#8221;\\1年\\2月\\3日&#8221;</p>
<p>呼~~~，搞定，收工！不过这样跑的程序真的好累。</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.php5x.com/?feed=rss2&amp;p=20</wfw:commentRss>
		</item>
		<item>
		<title>PHP关于GBK下针对中文的替换全角空格</title>
		<link>http://www.php5x.com/?p=18</link>
		<comments>http://www.php5x.com/?p=18#comments</comments>
		<pubDate>Wed, 10 Sep 2008 02:25:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[全角空格 空格 PHP]]></category>

		<guid isPermaLink="false">http://www.php5x.com/?p=16</guid>
		<description><![CDATA[对于我来说，这是一个难题，屹今为止，我还没有找到解决方法。所以先发到日志里，容日后灵光现的时候，或者能找到解决方法。
问题是这样的：在GBK编码下，要把这个全角的空格替换掉而不会出现乱码。每字节循环判断是可以做到的。但效率低，所以我也不写这个丑陋的方法了。
字符串是这样的：“我的单元测验”
echo str_replace(&#8217;&#8217;, &#8221;, &#8216;我的单元测验&#8217;); //在GBK的编码存储下，这样的替换会出现乱码。
]]></description>
			<content:encoded><![CDATA[<p>对于我来说，这是一个难题，屹今为止，我还没有找到解决方法。所以先发到日志里，容日后灵光现的时候，或者能找到解决方法。</p>
<p>问题是这样的：在GBK编码下，要把这个全角的空格替换掉而不会出现乱码。每字节循环判断是可以做到的。但效率低，所以我也不写这个丑陋的方法了。</p>
<p>字符串是这样的：“我的单元测验”</p>
<p>echo str_replace(&#8217;&#8217;, &#8221;, &#8216;我的单元测验&#8217;); //在GBK的编码存储下，这样的替换会出现乱码。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.php5x.com/?feed=rss2&amp;p=18</wfw:commentRss>
		</item>
		<item>
		<title>优化PHP代码的40条建议</title>
		<link>http://www.php5x.com/?p=17</link>
		<comments>http://www.php5x.com/?p=17#comments</comments>
		<pubDate>Tue, 19 Aug 2008 08:34:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[optimization php]]></category>

		<guid isPermaLink="false">http://www.php5x.com/?p=15</guid>
		<description><![CDATA[简介
英文版权归Reinhold  Weber所有，中译文作者yangyang（aka  davidkoree）。双语版可用于非商业传播，但须注明英文版作者、版权信息，以及中译文作者。翻译水平有限，请广大PHPer指正。


1.如果一个方法可静态化，就对它做静态声明。速率可提升至4倍。
2.echo 比 print 快。
3.使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接。
4.在执行for循环之前确定最大循环数，不要每循环一次都计算最大值。
5.注销那些不用的变量尤其是大数组，以便释放内存。
6.尽量避免使用__get，__set，__autoload。
7.require_once()代价昂贵。
8.在包含文件时使用完整路径，解析操作系统路径所需的时间会更少。
9.如果你想知道脚本开始执行（译注：即服务器端收到客户端请求）的时刻，使用$_SERVER[‘REQUEST_TIME’]要好于time()。
10.函数代替正则表达式完成相同功能。
11.str_replace函数比preg_replace函数快，但strtr函数的效率是str_replace函数的四倍。
12.如果一个字符串替换函数，可接受数组或字符作为参数，并且参数长度不太长，那么可以考虑额外写一段替换代码，使得每次传递参数是一个字符，而不是只写一行代码接受数组作为查询和替换的参数。
13.使用选择分支语句（译注：即switch case）好于使用多个if，else if语句。
14.用@屏蔽错误消息的做法非常低效。
15.打开apache的mod_deflate模块。
16.数据库连接当使用完毕时应关掉。
17.$row[‘id’]的效率是$row[id]的7倍。
18.错误消息代价昂贵。
19.尽量不要在for循环中使用函数，比如for ($x=0; $x &#60; count($array); $x)每循环一次都会调用count()函数。
20.在方法中递增局部变量，速度是最快的。几乎与在函数中调用局部变量的速度相当。
21.递增一个全局变量要比递增一个局部变量慢2倍。
22.递增一个对象属性（如：$this-&#62;prop++）要比递增一个局部变量慢3倍。
23.递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
24.仅定义一个局部变量而没在函数中调用它，同样会减慢速度（其程度相当于递增一个局部变量）。PHP大概会检查看是否存在全局变量。
25.方法调用看来与类中定义的方法的数量无关，因为我（在测试方法之前和之后都）添加了10个方法，但性能上没有变化。
26.派生类中的方法运行起来要快于在基类中定义的同样的方法。
27.调用带有一个参数的空函数，其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
28.用单引号代替双引号来包含字符串，这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量，单引号则不会。当然，只有当你不需要在字符串中包含变量时才可以这么做。
29.输出多个字符串时，用逗号代替句点来分隔字符串，速度更快。注意：只有echo能这么做，它是一种可以把多个字符串当作参数的“函数”（译注：PHP手册中说echo是语言结构，不是真正的函数，故把函数加上了双引号）。
30.Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面，少用脚本。
31.除非脚本可以缓存，否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能，以免除编译开销。
32.尽量做缓存，可使用memcached。memcached是一款高性能的内存对象缓存系统，可用来加速动态Web应用程序，减轻数据库负载。对运算码 (OP code)的缓存很有用，使得脚本不必为每个请求做重新编译。
33.当操作字符串并需要检验其长度是否满足某种要求时，你想当然地会使用strlen()函数。此函数执行起来相当快，因为它不做任何计算，只返回在 zval 结构（C的内置数据结构，用于存储PHP变量）中存储的已知字符串长度。但是，由于strlen()是函数，多多少少会有些慢，因为函数调用会经过诸多步 骤，如字母小写化（译注：指函数名小写化，PHP不区分函数名大小写）、哈希查找，会跟随被调用的函数一起执行。在某些情况下，你可以使用isset() 技巧加速执行你的代码。
（举例如下）
if (strlen($foo) &#60; 5) { echo &#8220;Foo is too short&#8221;$$ }
（与下面的技巧做比较）
if (!isset($foo{5})) { echo &#8220;Foo is too short&#8221;$$ }
调用isset()恰巧比strlen()快，因为与后者不同的是，isset()作为一种语言结构，意味着它的执行不需要函数查找和字母小写化。也就是说，实际上在检验字符串长度的顶层代码中你没有花太多开销。
34.当执行变量$i的递增或递减时，$i++会比++$i慢一些。这种差异是PHP特有的，并不适用于其他语言，所以请不要修改你的C或Java代码并 指望它们能立即变快，没用的。++$i更快是因为它只需要3条指令(opcodes)，$i++则需要4条指令。后置递增实际上会产生一个临时变量，这个 临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种，正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意，因为并不是所有的指令优化器都会做同样的优化处理，并且存在大量没有装配指令优化器的互联网服务提供商（ISPs）和服务器。
35.并不是事必面向对象(OOP)，面向对象往往开销很大，每个方法和对象调用都会消耗很多内存。
36.并非要用类实现所有的数据结构，数组也很有用。
37.不要把方法细分得过多，仔细想想你真正打算重用的是哪些代码？
38.当你需要时，你总能把代码分解成方法。
39.尽量采用大量的PHP内置函数。
40.如果在代码中存在大量耗时的函数，你可以考虑用C扩展的方式实现它们。
41.评估检验(profile)你的代码。检验器会告诉你，代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序，评估检验总体上可以显示出代码的瓶颈。
42.mod_zip可作为Apache模块，用来即时压缩你的数据，并可让数据传输量降低80%。


]]></description>
			<content:encoded><![CDATA[<p class="bold">简介</p>
<p class="inner">英文版权归Reinhold  Weber所有，中译文作者yangyang（aka  davidkoree）。双语版可用于非商业传播，但须注明英文版作者、版权信息，以及中译文作者。翻译水平有限，请广大PHPer指正。</p>
<div class="itembody" style="padding: 0px;">
<div>
<p><span style="font-size: small;"><span style="font-size: x-small;">1.如果一个方法可静态化，就对它做静态声明。速率可提升至4倍。</span></span></p>
<p>2.echo 比 print 快。</p>
<p>3.使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接。</p>
<p>4.在执行for循环之前确定最大循环数，不要每循环一次都计算最大值。</p>
<p>5.注销那些不用的变量尤其是大数组，以便释放内存。</p>
<p>6.尽量避免使用__get，__set，__autoload。</p>
<p>7.require_once()代价昂贵。</p>
<p>8.在包含文件时使用完整路径，解析操作系统路径所需的时间会更少。</p>
<p>9.如果你想知道脚本开始执行（译注：即服务器端收到客户端请求）的时刻，使用$_SERVER[‘REQUEST_TIME’]要好于time()。</p>
<p>10.函数代替正则表达式完成相同功能。</p>
<p>11.str_replace函数比preg_replace函数快，但strtr函数的效率是str_replace函数的四倍。</p>
<p>12.如果一个字符串替换函数，可接受数组或字符作为参数，并且参数长度不太长，那么可以考虑额外写一段替换代码，使得每次传递参数是一个字符，而不是只写一行代码接受数组作为查询和替换的参数。</p>
<p>13.使用选择分支语句（译注：即switch case）好于使用多个if，else if语句。</p>
<p>14.用@屏蔽错误消息的做法非常低效。</p>
<p>15.打开apache的mod_deflate模块。</p>
<p>16.数据库连接当使用完毕时应关掉。</p>
<p>17.$row[‘id’]的效率是$row[id]的7倍。</p>
<p>18.错误消息代价昂贵。</p>
<p>19.尽量不要在for循环中使用函数，比如for ($x=0; $x &lt; count($array); $x)每循环一次都会调用count()函数。</p>
<p>20.在方法中递增局部变量，速度是最快的。几乎与在函数中调用局部变量的速度相当。</p>
<p>21.递增一个全局变量要比递增一个局部变量慢2倍。</p>
<p>22.递增一个对象属性（如：$this-&gt;prop++）要比递增一个局部变量慢3倍。</p>
<p>23.递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。</p>
<p>24.仅定义一个局部变量而没在函数中调用它，同样会减慢速度（其程度相当于递增一个局部变量）。PHP大概会检查看是否存在全局变量。</p>
<p>25.方法调用看来与类中定义的方法的数量无关，因为我（在测试方法之前和之后都）添加了10个方法，但性能上没有变化。</p>
<p>26.派生类中的方法运行起来要快于在基类中定义的同样的方法。</p>
<p>27.调用带有一个参数的空函数，其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。</p>
<p>28.用单引号代替双引号来包含字符串，这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量，单引号则不会。当然，只有当你不需要在字符串中包含变量时才可以这么做。</p>
<p>29.输出多个字符串时，用逗号代替句点来分隔字符串，速度更快。注意：只有echo能这么做，它是一种可以把多个字符串当作参数的“函数”（译注：PHP手册中说echo是语言结构，不是真正的函数，故把函数加上了双引号）。</p>
<p>30.Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面，少用脚本。</p>
<p>31.除非脚本可以缓存，否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能，以免除编译开销。</p>
<p>32.尽量做缓存，可使用memcached。memcached是一款高性能的内存对象缓存系统，可用来加速动态Web应用程序，减轻数据库负载。对运算码 (OP code)的缓存很有用，使得脚本不必为每个请求做重新编译。</p>
<p>33.当操作字符串并需要检验其长度是否满足某种要求时，你想当然地会使用strlen()函数。此函数执行起来相当快，因为它不做任何计算，只返回在 zval 结构（C的内置数据结构，用于存储PHP变量）中存储的已知字符串长度。但是，由于strlen()是函数，多多少少会有些慢，因为函数调用会经过诸多步 骤，如字母小写化（译注：指函数名小写化，PHP不区分函数名大小写）、哈希查找，会跟随被调用的函数一起执行。在某些情况下，你可以使用isset() 技巧加速执行你的代码。</p>
<p>（举例如下）<br />
if (strlen($foo) &lt; 5) { echo &#8220;Foo is too short&#8221;$$ }<br />
（与下面的技巧做比较）<br />
if (!isset($foo{5})) { echo &#8220;Foo is too short&#8221;$$ }</p>
<p>调用isset()恰巧比strlen()快，因为与后者不同的是，isset()作为一种语言结构，意味着它的执行不需要函数查找和字母小写化。也就是说，实际上在检验字符串长度的顶层代码中你没有花太多开销。</p>
<p>34.当执行变量$i的递增或递减时，$i++会比++$i慢一些。这种差异是PHP特有的，并不适用于其他语言，所以请不要修改你的C或Java代码并 指望它们能立即变快，没用的。++$i更快是因为它只需要3条指令(opcodes)，$i++则需要4条指令。后置递增实际上会产生一个临时变量，这个 临时变量随后被递增。而前置递增直接在原值上递增。这是最<a class="bodytag" href="http://www.yeeyan.com/articles/tag/%E4%BC%98%E5%8C%96" target="_blank"><span style="color: #335533; font-size: x-small;">优化</span></a><span style="font-size: x-small;">处理的一种，正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意，因为并不是所有的指令优化器都会做同样的优化处理，并且存在大量没有装配指令优化器的互联网服务提供商（ISPs）和服务器。</span></p>
<p>35.并不是事必面向对象(OOP)，面向对象往往开销很大，每个方法和对象调用都会消耗很多内存。</p>
<p>36.并非要用类实现所有的数据结构，数组也很有用。</p>
<p>37.不要把方法细分得过多，仔细想想你真正打算重用的是哪些代码？</p>
<p>38.当你需要时，你总能把代码分解成方法。</p>
<p>39.尽量采用大量的PHP内置函数。</p>
<p>40.如果在代码中存在大量耗时的函数，你可以考虑用C扩展的方式实现它们。</p>
<p>41.评估检验(profile)你的代码。检验器会告诉你，代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序，评估检验总体上可以显示出代码的瓶颈。</p>
<p>42.mod_zip可作为Apache模块，用来即时压缩你的数据，并可让数据传输量降低80%。</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.php5x.com/?feed=rss2&amp;p=17</wfw:commentRss>
		</item>
		<item>
		<title>修改Windows下的Memcached下的服务端口</title>
		<link>http://www.php5x.com/?p=16</link>
		<comments>http://www.php5x.com/?p=16#comments</comments>
		<pubDate>Mon, 23 Jun 2008 09:19:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[linux]]></category>

		<category><![CDATA[windows]]></category>

		<category><![CDATA[memcached]]></category>

		<guid isPermaLink="false">http://www.php5x.com/?p=14</guid>
		<description><![CDATA[一直耿耿于本地的Memcached端口与服务器的不一样，老是要修改配置文件。
看了N久memcached.exe的帮助，在安装服务的时候，都没有办法指定参数。
在命令模式下，可以使用 memcached -p 12345 去指定端口，可服务安装后，却总是只有 -d runservice 的参数。
后来想到，可以通过修改注册表来达到这个修改端口的目的。
然后在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server 下面找到一个 ImagePath 的字符串项，正好是服务的执行路径的字符串，双击该串，在后面加入 -m 45 -p 12345 （使用45M内存，12345为端口），再启动服务。
搞掂！
]]></description>
			<content:encoded><![CDATA[<p>一直耿耿于本地的Memcached端口与服务器的不一样，老是要修改配置文件。</p>
<p>看了N久memcached.exe的帮助，在安装服务的时候，都没有办法指定参数。</p>
<p>在命令模式下，可以使用 memcached -p 12345 去指定端口，可服务安装后，却总是只有 -d runservice 的参数。</p>
<p>后来想到，可以通过修改注册表来达到这个修改端口的目的。</p>
<p>然后在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server 下面找到一个 ImagePath 的字符串项，正好是服务的执行路径的字符串，双击该串，在后面加入 -m 45 -p 12345 （使用45M内存，12345为端口），再启动服务。</p>
<p>搞掂！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.php5x.com/?feed=rss2&amp;p=16</wfw:commentRss>
		</item>
	</channel>
</rss>
