<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>微风实验室</title>
		<link>http://dev.meettea.com/</link>
		<description>Design,Develop,Program,SEO and UED</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<lastBuildDate>Mon, 21 May 2012 00:02:15 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<guid>http://dev.meettea.com/show-104-1.html</guid>
			<title>迁移到PHP5.4的备注</title>
			<author>shiny</author>
			<description><![CDATA[<p>报错一：GBK编码下的htmlspecialchars异常：使用htmlspecialchars会输出空白。htmlspecialchars</p>
<pre>string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $charset [, bool $double_encode = true ]]] )</pre>
<p>第三个参数支持传入编码，但是参照手册，中文仅仅支持GB2312，而一些生僻字就不能正常显示了。如果传入GBK则会提示如下错误：</p>
<pre><b>Warning</b>:  htmlspecialchars(): charset `gbk' not supported, assuming utf-8 in </pre>
<p>正确的解决办法是：</p>
<pre>
ini_set('default_charset','gbk');
htmlspecialchars($str,ENT_COMPAT,'');
</pre>
<p>
An empty string activates detection from script encoding (Zend multibyte), default_charset and current locale (see nl_langinfo() and setlocale()), in this order. Not recommended. (中文手册未翻译) 传入空字符串则使用default_charset的编码。
</p>
<p>报错二：mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.</p>
<p>在<a href="http://stackoverflow.com/questions/8831183/mysqlnd-cannot-connect-to-mysql-4-1-using-the-old-insecure-authentication">stackoverflow</a>有解决办法的说明。需要注意的是：my.cnf要在正确的配置段加；navicat默认生成的函数是OLD_PASSWORD。</p>
]]></description>
			<link>http://dev.meettea.com/show-104-1.html</link>
			<category domain="http://dev.meettea.com/category-8-1.html">后端那些事</category>
			<pubDate>2012-04-14 17:58</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-103-1.html</guid>
			<title>PHP繁体转简体性能的改善</title>
			<author>shiny</author>
			<description><![CDATA[<p>大约上个月在PHPChina上接到一次求助：</p>
<p>用PHP将繁体转换为简体，一篇文章会超时。</p>
<p>采用网上流传的版本是针对文章的每个字进行循环查找表，这样带来的问题有：</p>
<p>当文章字数多时，时间开销大；</p>
<p>重复的字也会重复查找；</p>
<p>不在表内的字符也会被查找。</p>
<p>&nbsp;</p>
<p>一篇千余字的文章甚至会让PHP超时，那么如何改善性能呢？</p>
<p>换个思路就可以了：</p>
<p>循环文章每个字改为循环字符表。这样的好处有：</p>
<p>文章字数再多，也只循环表包含的字符数；</p>
<p>文章字符重复则一次性替换完，性能和只替换一次几乎没有什么差别；</p>
<p>不会循环不需要替换的字符。</p>
<p>&nbsp;</p>
<p>性能的差异是非常明显的。更换方法后时间开销以ms计，之前是以s计。</p>
<p>代码见附件。[attach=77]</p>
<p>附注：</p>
<p>1、附件里的代码针对gbk作了编码转换，如果是UTF-8则不需要转换；</p>
<p>2、此代码依赖于mbstring扩展。</p>
<p>3、正体字不能这么简简单单直接转成简体字，会有很多地方出错，正式场合使用的内容请校对后再使用。</p>]]></description>
			<link>http://dev.meettea.com/show-103-1.html</link>
			<category domain="http://dev.meettea.com/category-8-1.html">后端那些事</category>
			<pubDate>2011-12-27 16:27</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-102-1.html</guid>
			<title>开源模板引擎ns-template</title>
			<author>shiny</author>
			<description><![CDATA[开源模板引擎ns-template
<p>ns-template是一年多前开始设计制作的一款PHP模板引擎，拥有的功能除了常见的if/loop/include之外还支持修改器、自定义修改器、自定义标签。
在一年多来线上运行后，修复了大量BUG，稳定性和性能都达到了理想水平。</p>
<p>2010年大约5月份时，感受到DEDE标签主动调用数据理念适合CMS，所以开发了一些Smarty自定义修改器和自定义标签，但是在执行过程中性能低下，开销以s计，这是无法容忍的。分析跟踪，受自定义标签实现的原理限制不可能快。于是在dz模板的基础上加入了不少smarty语法以及自定义标签功能。</p>
<p>所以在此以MIT协议来源，欢迎使用。</p>

<p><a href="http://www.pandaidea.com/opensource/ns-template/">项目首页</a></p>
<p><a href="http://www.pandaidea.com/opensource/ns-template/latest.zip"><img src="http://www.pandaidea.com/opensource/ns-template/download.png" align="absmiddle" />下载最新源码包</a> <br /><a href="http://www.pandaidea.com/opensource/ns-template/latest.chm"><img src="http://www.pandaidea.com/opensource/ns-template/download.png" align="absmiddle" />下载最新CHM手册</a></p>
]]></description>
			<link>http://dev.meettea.com/show-102-1.html</link>
			<category domain="http://dev.meettea.com/category-8-1.html">后端那些事</category>
			<pubDate>2011-10-08 17:42</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-101-1.html</guid>
			<title>Nginx + PHP5.3中的虚拟主机功能加强</title>
			<author>shiny</author>
			<description><![CDATA[<p>如果你使用的是Nginx，在一台服务器上使用多个网站，就有可能对服务器的安全感到担心，也会觉得Nginx+php不适合多站点的部署：没有Apache php_admin_value对open_basedir的限制，也没有.htaccess对php.ini的自定义。</p>
<p>PHP5.3及时地对这方面进行弥补，可能很多系统管理员还没有意识，php5.3内置了对nginx这类软件类apache的支持：</p>
<p><strong>使用[PATH]和[HOST]对php.ini进行自定义</strong></p>
<p>举例：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>[HOST=www.pandaidea.com] &nbsp;&nbsp;</span></span></li>
    <li><span>open_basedir=/var/www/www.pandaidea.com:/tmp &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>[PATH=/var/www/www.tincoco.org] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>open_basedir=/var/www/www.tincoco.org:/tmp &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>[PATH=/var/www/www.xiayucha.com] &nbsp;&nbsp;</span></li>
    <li><span>open_basedir=/var/www/www.xiayucha.com:/tmp&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>这段配置放在php.ini即可实现主机之间权限的隔离。</p>
<p>Notice:这些设置仅仅在CGI/FastCGI中生效，并且不能设置extension和zend_extension指令。</p>
<p><strong>.user.ini的支持</strong></p>
<p>根据PHP手册，php在CGI/FastCGI模式中会从当前的PHP脚本目录中开始层层扫描，直到抵达<span style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: italic 14px verdana, arial, helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">$_SERVER['DOCUMENT_ROOT']</span>。除非当前脚本是在DOCUMENT_ROOT之外执行，只会扫描当前目录。</p>
<p>读取.user.ini后会缓存起来，根据<span style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px verdana, arial, helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><em>user_ini.cache_ttl</em></span>确定重新读取的时间，默认是5分钟。</p>
<p>不过<em>PHP_INI_SYSTEM</em> 级别的不能在.user.ini中设置。</p>
<p>有这两个功能的支持，nginx + php-fpm的安全程度以及功能已经和Apache类似。也看到一些公司开始推出一些nginx虚拟主机，毕竟，Nginx虚拟主机更容易超售；服务器/VPS上放多个站点也不用担心某个使用开源程序的站点成了害群马。</p>]]></description>
			<link>http://dev.meettea.com/show-101-1.html</link>
			<category domain="http://dev.meettea.com/category-7-1.html">运维</category>
			<pubDate>2011-09-09 15:19</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-100-1.html</guid>
			<title>[翻译]案例学习：仅使用Redis+PHP设计实现一个简单的Twitter</title>
			<author>shiny</author>
			<description><![CDATA[<p>译者注：</p>
<p>原文位于Redis官网<a href="http://redis.io/topics/twitter-clone">http://redis.io/topics/twitter-clone</a></p>
<p>Redis是NoSQL数据库中一个知名数据库，在新浪微博中亦有部署，适合固定数据量的热数据的访问。</p>
<p>作为入门，这是一篇很好的教材，简单描述了如何使用KV数据库进行数据库的设计。新的项目<a href="http://www.xiayucha.com">www.xiayucha.com</a>亦采用Redis + MySQL进行开发，考虑Redis文档比较少，故翻译了此文。</p>
<p>其他参考资料：</p>
<ul>
    <li>
    <div><a href="http://redis.readthedocs.org/en/latest/index.html">Redis命令参考中文版(Redis Command Reference)</a>    </li>
    <li>
    <div><a href="http://try.redis-db.com/">Try Redis</a></div>
    <div>&nbsp;</div>
    </li>
</ul>
<p>&nbsp;</p>
<p>我会在此文中描述如何使用PHP以及仅使用Redis来设计实现一个简单的Twitter克隆。<br />
很多编程社区常认为KV储存是一个特别的数据库，在web应用中不能替代关系数据库。<br />
本文尝试证明这恰恰相反。</p>
<p>这个twitter克隆名为Retwis，结构简单，性能优异，能很轻易地用N个web服务器和Redis服务器以分布式架构。<br />
在此获取源码<a href="http://code.google.com/p/redis/downloads/list">http://code.google.com/p/redis/downloads/list</a>。<br />
我们使用PHP作为例子是因为它能被每个人读懂，也能使用Ruby、Python、Erlang或其他语言获取同样(或者更佳)的效果。</p>
<p>注意：Retwis-RB是一个由Daniel Lucraft用Ruby与Sinatra写的Retwis分支！<br />
此文全部代码在本页尾部的Git repository链接里。<br />
此文以PHP为例，但是Ruby程序员也能检出其他源码。他们很相似。</p>
<p>注意Retwis-J是Retwis的一个分支，由Costin Leau以Java和Spring框架写成。<br />
源码能在GitHub找到，并且在springsource.org有综合的文档。</p>
<p><br />
<font size="5">Key-value 数据库基础</font></p>
<p>KV数据的精髓，是能够把value储存在key里，此后该数据仅能够通过确切的key来获取，无法搜索一个值。<br />
确切的来讲，它更像一个大型HASH/字典，但它是持久化的，比如，当你的程序终止运行，数据不会消失。<br />
比如我们能用SET命令以key foo 来储存值 bar<br />
&nbsp;SET foo bar<br />
Redis会永久储存我们的数据，所以之后我们可以问Redis：&ldquo;储存在key foo里的数据是什么？&rdquo;，Redis会返回一个值：bar<br />
&nbsp;GET foo =&gt; bar<br />
KV数据库提供的其他常见操作有:DEL，用于删除指定的key和关联的value；<br />
SET-if-not-exists (在Redis上称为SETNX )仅会在key不存在的时候设置一个值；<br />
INCR能够对指定的key里储存的数字进行自增。<br />
&nbsp;SET foo 10<br />
&nbsp;INCR foo =&gt; 11<br />
&nbsp;INCR foo =&gt; 12<br />
&nbsp;INCR foo =&gt; 13</p>
<p><font size="5">原子操作<br />
</font>目前为止它是相当简单的，但是INCR有些不同。设想一下，为什么要提供这个操作？毕竟我们自己能用以下简单的命令实现这个功能：<br />
&nbsp;x = GET foo<br />
&nbsp;x = x + 1<br />
&nbsp;SET foo x<br />
问题在于要使上面的操作正常进行，同时只能有一个客户端操作x的值。看看如果两台电脑同时操作这个值会发生什么：<br />
&nbsp;x = GET foo (返回10)<br />
&nbsp;y = GET foo (返回10)<br />
&nbsp;x = x + 1 (x现在是11)<br />
&nbsp;y = y + 1 (y现在是11)<br />
&nbsp;SET foo x (foo现在是11)<br />
&nbsp;SET foo y (foo现在是11)<br />
问题发生了！我们增加了值两次，本应该从10变成12，现在却停留在了11。这是因为用GET和SET来实现INCR不是一个原子操作(atomic operation)。<br />
所以Redis\memcached之类提供了一个原子的INCR命令，服务器会保护get-increment-set操作，以防止同时的操作。<br />
让Redis与众不同的是它提供了更多类似INCR的方案，用于解决模型复杂的问题。<br />
因此你可以不使用任何SQL数据库、仅用Redis写一个完整的web应用，而不至于抓狂。</p>
<p><br />
<font size="5">超越Ke-Value数据库<br />
</font>本节我们会看到构建一个Twitter克隆所需Redis的功能。首先需要知道的是，Redis的值不仅仅可以是字符串(String)。<br />
Redis的值可以是列表(Lists)也可以是集合(Sets)，在操作更多类型的值时也是原子的，所以多方操作同一个KEY的值也是安全的。<br />
让我们从一个Lists开始：<br />
&nbsp;LPUSH mylist a (现在mylist含有一个元素:'a'的list)<br />
&nbsp;LPUSH mylist b (现在mylist含有元素'b,a')<br />
&nbsp;LPUSH mylist c (现在mylist含有'c,b,a')<br />
LPUSH的意思是Left Push， 就是把一个元素加在列表(list)的左边(或者说头上)。<br />
在PUSH操作之前，如果mylist这个键(key)不存在，Redis会自动创建一个空的list。<br />
就像你能想到的一样，同样有个RPUSH操作可以把元素加在列表(list)的右边(尾部)。<br />
这对我们复制一个twitter非常有用，例如我们可以把用户的更新储存在username:updates里。<br />
当然，我们也有相应的操作来获取数据或者信息。比如LRANGE返回列表(list)的一个范围内的元素，或者所有元素<br />
&nbsp;LRANGE mylist 0 1 =&gt; c,b<br />
LRANGE使用从零开始的索引(zero-based indexes)，第一个元素的索引是0，第二个是1，以此类推。该命令的参数是：LRANGE key first-index last-index<br />
参数last index可以是负数，具有特殊的意义：-1是列表(list)的最后一个元素，-2是倒数第二个，以此类推。<br />
所以，如果要获取整个list，我们能使用以下命令：<br />
&nbsp;LRANGE mylist 0 -1 =&gt; c,b,a<br />
其他重要的操作有LLEN，返回列表(list)的长度，LTRIM类似于LRANGE，但不仅仅会返回指定范围内的元素，而且还会原子地把列表(list)的值设置这个新的值。<br />
我们将会使用这些list操作，但是注意阅读Redis文档来浏览所有redis支持的list操作。</p>
<p><br />
<font size="5">数据类型：集合(set)<br />
</font>除了列表(list)，Redis还提供了集合(sets)的支持，是不排序(unsorted)的元素集合。<br />
它能够添加、删除、检查元素是否存在，并且获取两个结合之间的交集。当然它也能请求获取集合（set）里一个或者多个元素。<br />
几个例子可以使概念更为清晰。记住：SADD是往集合(set)里添元素；SREM是从集合(set)里删除元素；SISMEMBER是检测一个元素是否包含在集合里；SINTER用于显示两个集合的交集。<br />
其他操作有，SCARD用于获取集合的基数(集合中元素的数量)；SMEMBERS返回集合中所有的元素<br />
&nbsp;SADD myset a<br />
&nbsp;SADD myset b<br />
&nbsp;SADD myset foo<br />
&nbsp;SADD myset bar<br />
&nbsp;SCARD myset =&gt; 4<br />
&nbsp;SMEMBERS myset =&gt; bar,a,foo,b<br />
注意SMEMBERS不会以我们添加的顺序返回元素，因为集合(Sets)是一个未排序的元素集合。如果你要储存顺序，最好使用列表(Lists)取而代之。以下是基于集合的一些操作：<br />
&nbsp;SADD mynewset b<br />
&nbsp;SADD mynewset foo<br />
&nbsp;SADD mynewset hello<br />
&nbsp;SINTER myset mynewset =&gt; foo,b<br />
SINTER能够返回集合之间的交集，但并不仅限于两个集合(Sets)，你能获取4个、5个甚至1000个集合(sets)的交集。<br />
最后，让我们看下SISMEMBER是如何工作的：<br />
&nbsp;SISMEMBER myset foo =&gt; 1<br />
&nbsp;SISMEMBER myset notamember =&gt; 0<br />
Okay，我觉得我们可以开始coding啦！</p>
<p><br />
<font size="5">先决条件<br />
</font>如果你还没下载，请前往&lt;<a href="http://code.google.com/p/redis/downloads/list">http://code.google.com/p/redis/downloads/list</a>&gt;下载Retwis的源码。它包含几个PHP文件，是个简单的tar.gz文件。<br />
实现的非常简单，你会在里面找到PHP客户端(redis.php)，用于redis与PHP的交互。该库由Ludovico Magnocavallo(<a href="http://qix.it/">http://qix.it/</a> )编写，你可以在自己的项目中免费使用。<br />
但如果要更新库的版本请下载Redis的发行版。(注意:现在有更好的PHP库了，请检查我们的客户端页面&lt;<a href="http://redis.io/clients">http://redis.io/clients</a>&gt;)<br />
你需要的另一个东西是正常运行的Redis服务器。仅需要获取源码、用make编译、用./redis-server就完工了，点儿也不须配置就可以在你的电脑上运行Retwis。</p>
<p>&nbsp;</p>
<p><font size="5">数据结构规划<br />
</font>当使用关系数据库的时候，这一步往往是在设计数据表、索引的表单里处理。我们没有表，那我们设计什么呢？ 我们需要确认物体使用的key以及key采用的类型。<br />
让我们从用户这块开始设计。当然了，首先需要展示用户的username, userid, password, followers，自己follow的用户等。第一个问题是：如何在我们的系统中标识一个用户？<br />
username是个好主意，因为它是唯一的。不过它太大了，我们想要降低内存的使用。如果我们的数据库是关系数据库，我们能关联唯一ID到每一个用户。每一个对用户的引用都通过ID来关联。<br />
做起来很简单，因为我们有我们的原子的INCR命令！当我们创建一个新用户，我们假设这个用户叫&quot;antirez&quot;：<br />
&nbsp;INCR global:nextUserId =&gt; 1000<br />
&nbsp;SET uid:1000:username antirez<br />
&nbsp;SET uid:1000:password p1pp0<br />
我们使用global:nextUserId为键(Key)是为了给每个新用户分配一个唯一ID，然后用这个唯一ID来加入其他key，以识别保存用户的其他数据。这就是kv数据库的设计模式!请牢记于心，<br />
除了已经定义的KEY，我们还需要更多的来完整定义一个用户，比如有时需要通过用户名来获取用户ID，所以我们也需要设置这么一个键(Key)<br />
&nbsp;SET username:antirez:uid 1000<br />
一开始看上去这样很奇怪，但请记住我们只能通过key来获取数据!这不可能告诉Redis返回包含某值的Key，这也是我们的强处。<br />
用关系数据库方式来讲，这个新实例强迫我们组织数据，以便于仅使用primary key访问任何数据。</p>
<p><br />
<font size="5">关注\被关注与更新<br />
</font>这也是在我们系统中另一个重要需求.每个用户都有follower，也有follow的用户.对此我们有最佳的数据结构!那就是.....集合(Sets).那就让我们在结构中加入两个新字段:<br />
&nbsp;uid:1000:followers =&gt; Set of uids of all the followers users<br />
&nbsp;uid:1000:following =&gt; Set of uids of all the following users<br />
另一个重要的事情是我们需要有个地方来放用户主页上的更新。这个要以时间顺序排序，最新的排在旧的前面。所以，最佳的类型是列表(List)。<br />
基本上每个更新都会被LPUSH到该用户的updates key.多亏了LRANGE，我们能够实现分页等功能。请注意更新(updates)和帖子(posts)讲的是同一个东西，实际上更新(updates)是有点小的帖子(posts)。<br />
&nbsp;uid:1000:posts =&gt; a List of post ids, every new post is LPUSHed here.</p>
<p>&nbsp;</p>
<p><font size="5">验证<br />
</font>OK，除了验证，或多或少我们已经有了关于该用户的一切东西。我们处理验证用一个简单而健壮(鲁棒)的办法:我们不使用PHP的session或者其他类似方式。<br />
我们的系统必须是能够在不同不同服务器上分布式部署的，所以一切状态都必须保存在Redis里。所以我们所需要的一个保存在已验证用户cookie里的随机字符串。<br />
包含同样随机字符串的一个key告诉我们用户的ID。我们需要使用两个key来保证这个验证机制的健壮性:<br />
&nbsp;SET uid:1000:auth fea5e81ac8ca77622bed1c2132a021f9<br />
&nbsp;SET auth:fea5e81ac8ca77622bed1c2132a021f9 1000<br />
为了验证一个用户，我们需要做一些简单的工作(login.php):<br />
* 从登录表单获取用户的用户名和密码<br />
* 检查是否存在一个键 username:&lt;username&gt;:uid<br />
* 如果这个user id存在(假设1000)<br />
* 检查 uid:1000:password 是否匹配，如果不匹配，显示错误信息<br />
* 匹配则设置cookie为字符串&quot;fea5e81ac8ca77622bed1c2132a021f9&quot;(uid:1000:auth的值)<br />
实例代码:</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">include</span><span>(</span><span class="string">&quot;retwis.php&quot;</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>#&nbsp;Form&nbsp;sanity&nbsp;checks &nbsp;&nbsp;</span></li>
    <li><span class="keyword">if</span><span>&nbsp;(!gt(</span><span class="string">&quot;username&quot;</span><span>)&nbsp;||&nbsp;!gt(</span><span class="string">&quot;password&quot;</span><span>)) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;goback(</span><span class="string">&quot;You&nbsp;need&nbsp;to&nbsp;enter&nbsp;both&nbsp;username&nbsp;and&nbsp;password&nbsp;to&nbsp;login.&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>#&nbsp;The&nbsp;form&nbsp;is&nbsp;OK,&nbsp;check&nbsp;</span><span class="keyword">if</span><span>&nbsp;the&nbsp;username&nbsp;is&nbsp;available &nbsp;&nbsp;</span></li>
    <li><span class="vars">$username</span><span>&nbsp;=&nbsp;gt(</span><span class="string">&quot;username&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$password</span><span>&nbsp;=&nbsp;gt(</span><span class="string">&quot;password&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span class="vars">$r</span><span>&nbsp;=&nbsp;redisLink(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$userid</span><span>&nbsp;=&nbsp;</span><span class="vars">$r</span><span>-&gt;get(</span><span class="string">&quot;username:$username:id&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span class="keyword">if</span><span>&nbsp;(!</span><span class="vars">$userid</span><span>) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;goback(</span><span class="string">&quot;Wrong&nbsp;username&nbsp;or&nbsp;password&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span class="vars">$realpassword</span><span>&nbsp;=&nbsp;</span><span class="vars">$r</span><span>-&gt;get(</span><span class="string">&quot;uid:$userid:password&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$realpassword</span><span>&nbsp;!=&nbsp;</span><span class="vars">$password</span><span>) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;goback(</span><span class="string">&quot;Wrong&nbsp;useranme&nbsp;or&nbsp;password&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>#&nbsp;Username&nbsp;/&nbsp;password&nbsp;OK,&nbsp;set&nbsp;the&nbsp;cookie&nbsp;</span><span class="keyword">and</span><span>&nbsp;redirect&nbsp;to&nbsp;index.php &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$authsecret</span><span>&nbsp;=&nbsp;</span><span class="vars">$r</span><span>-&gt;get(</span><span class="string">&quot;uid:$userid:auth&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>setcookie(</span><span class="string">&quot;auth&quot;</span><span>,</span><span class="vars">$authsecret</span><span>,time()+3600*24*365); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>header(</span><span class="string">&quot;Location:&nbsp;index.php&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
每次用户登录都会运行，但我们需要一个函数isLoggedIn用于检验一个用户是否已经验证。<br />
这些是isLoggedIn的逻辑步骤<br />
* 从用户获取cookie里auth的值。如果没有cookie，该用户未登录。我们称这个cookie为&lt;authcookie&gt;<br />
* 检查auth:&lt;authcookie&gt;是否存在，存在则获取值(例子里是1000)<br />
* 为了再次确认，检查uid:1000:auth是否匹配<br />
* 用户已验证，在全局变量$User中载入一点信息<br />
也许代码比描述更短:</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;isLoggedIn()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">global</span><span>&nbsp;</span><span class="vars">$User</span><span>,&nbsp;</span><span class="vars">$_COOKIE</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(isset(</span><span class="vars">$User</span><span>))&nbsp;</span><span class="keyword">return</span><span>&nbsp;true; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(isset(</span><span class="vars">$_COOKIE</span><span>[</span><span class="string">'auth'</span><span>]))&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$r</span><span>&nbsp;=&nbsp;redisLink(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$authcookie</span><span>&nbsp;=&nbsp;</span><span class="vars">$_COOKIE</span><span>[</span><span class="string">'auth'</span><span>]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$userid</span><span>&nbsp;=&nbsp;</span><span class="vars">$r</span><span>-&gt;get(</span><span class="string">&quot;auth:$authcookie&quot;</span><span>))&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$r</span><span>-&gt;get(</span><span class="string">&quot;uid:$userid:auth&quot;</span><span>)&nbsp;!=&nbsp;</span><span class="vars">$authcookie</span><span>)&nbsp;</span><span class="keyword">return</span><span>&nbsp;false; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadUserInfo(</span><span class="vars">$userid</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;true; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;false; &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">function</span><span>&nbsp;loadUserInfo(</span><span class="vars">$userid</span><span>)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">global</span><span>&nbsp;</span><span class="vars">$User</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$r</span><span>&nbsp;=&nbsp;redisLink(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$User</span><span>[</span><span class="string">'id'</span><span>]&nbsp;=&nbsp;</span><span class="vars">$userid</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$User</span><span>[</span><span class="string">'username'</span><span>]&nbsp;=&nbsp;</span><span class="vars">$r</span><span>-&gt;get(</span><span class="string">&quot;uid:$userid:username&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;true; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>把loadUserInfo作为一个独立函数对于我们的应用而言有点杀鸡用牛刀了，但是对于复杂的应用而言这是一个不错的模板。<br />
作为一个完整的验证，还剩下logout还没实现。在logout的时候我们怎么做呢？<br />
很简单，仅仅改变uid:1000:auth里的随机字符串，删除旧的auth:&lt;oldauthstring&gt;并增加一个新的auth:&lt;newauthstring&gt;<br />
重要:logout过程解释了为什么我们不仅仅查找auth:&lt;randomstring&gt;而是再次检查了uid:1000:auth。真正的验证字符串是后者，auth:&lt;randomstring&gt;是易变的.<br />
假设程序中有BUGs或者脚本被意外中断，那么就有可能有多个auth:&lt;something&gt;指向同一个用户id。<br />
logout代码如下:(logout.php)</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">include</span><span>(</span><span class="string">&quot;retwis.php&quot;</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">if</span><span>&nbsp;(!isLoggedIn())&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;header(</span><span class="string">&quot;Location:&nbsp;index.php&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">exit</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span class="vars">$r</span><span>&nbsp;=&nbsp;redisLink(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$newauthsecret</span><span>&nbsp;=&nbsp;getrand(); &nbsp;&nbsp;</span></li>
    <li><span class="vars">$userid</span><span>&nbsp;=&nbsp;</span><span class="vars">$User</span><span>[</span><span class="string">'id'</span><span>]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$oldauthsecret</span><span>&nbsp;=&nbsp;</span><span class="vars">$r</span><span>-&gt;get(</span><span class="string">&quot;uid:$userid:auth&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$r</span><span>-&gt;set(</span><span class="string">&quot;uid:$userid:auth&quot;</span><span>,</span><span class="vars">$newauthsecret</span><span>); &nbsp;&nbsp;</span></li>
    <li><span class="vars">$r</span><span>-&gt;set(</span><span class="string">&quot;auth:$newauthsecret&quot;</span><span>,</span><span class="vars">$userid</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$r</span><span>-&gt;</span><span class="func">delete</span><span>(</span><span class="string">&quot;auth:$oldauthsecret&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>header(</span><span class="string">&quot;Location:&nbsp;index.php&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>以上是我们所描述过的，应该比较易于理解。</p>
<p><font size="5">更新(Updates)<br />
</font>更新，或者称为帖子(posts)的实现则更为简单。为了在数据库里创建一个新的帖子，我们做了以下工作:<br />
&nbsp;INCR global:nextPostId =&gt; 10343<br />
&nbsp;SET post:10343 &quot;$owner_id|$time|I'm having fun with Retwis&quot;<br />
就像你看到的一样，帖子的用户id和时间直接储存在了字符串里。<br />
在这个例子中我们不需要根据时间或者用户id来查找帖子，所以把他们紧凑地挤在一个post字符串里更佳。<br />
在新建一个帖子之后，我们获得了帖子的id。需要LPUSH这个帖子的id到每一个follow了作者的用户里去，当然还有作者的帖子列表。<br />
update.php这个文件展示了这个工作是如何完成的:</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">include</span><span>(</span><span class="string">&quot;retwis.php&quot;</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">if</span><span>&nbsp;(!isLoggedIn()&nbsp;||&nbsp;!gt(</span><span class="string">&quot;status&quot;</span><span>))&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;header(</span><span class="string">&quot;Location:index.php&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">exit</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span class="vars">$r</span><span>&nbsp;=&nbsp;redisLink(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$postid</span><span>&nbsp;=&nbsp;</span><span class="vars">$r</span><span>-&gt;incr(</span><span class="string">&quot;global:nextPostId&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span class="vars">$status</span><span>&nbsp;=&nbsp;</span><span class="func">str_replace</span><span>(</span><span class="string">&quot;\n&quot;</span><span>,</span><span class="string">&quot;&nbsp;&quot;</span><span>,gt(</span><span class="string">&quot;status&quot;</span><span>)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$post</span><span>&nbsp;=&nbsp;</span><span class="vars">$User</span><span>[</span><span class="string">'id'</span><span>].</span><span class="string">&quot;|&quot;</span><span>.time().</span><span class="string">&quot;|&quot;</span><span>.</span><span class="vars">$status</span><span>; &nbsp;&nbsp;</span></li>
    <li><span class="vars">$r</span><span>-&gt;set(</span><span class="string">&quot;post:$postid&quot;</span><span>,</span><span class="vars">$post</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$followers</span><span>&nbsp;=&nbsp;</span><span class="vars">$r</span><span>-&gt;smembers(</span><span class="string">&quot;uid:&quot;</span><span>.</span><span class="vars">$User</span><span>[</span><span class="string">'id'</span><span>].</span><span class="string">&quot;:followers&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$followers</span><span>&nbsp;===&nbsp;false)&nbsp;</span><span class="vars">$followers</span><span>&nbsp;=&nbsp;Array(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$followers</span><span>[]&nbsp;=&nbsp;</span><span class="vars">$User</span><span>[</span><span class="string">'id'</span><span>];&nbsp;</span><span class="comment">/*&nbsp;Add&nbsp;the&nbsp;post&nbsp;to&nbsp;our&nbsp;own&nbsp;posts&nbsp;too&nbsp;*/</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">foreach</span><span>(</span><span class="vars">$followers</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$fid</span><span>)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$r</span><span>-&gt;push(</span><span class="string">&quot;uid:$fid:posts&quot;</span><span>,</span><span class="vars">$postid</span><span>,false); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li><span>#&nbsp;Push&nbsp;the&nbsp;post&nbsp;on&nbsp;the&nbsp;timeline,&nbsp;</span><span class="keyword">and</span><span>&nbsp;trim&nbsp;the&nbsp;timeline&nbsp;to&nbsp;the &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#&nbsp;newest&nbsp;1000&nbsp;elements. &nbsp;&nbsp;</span></li>
    <li><span class="vars">$r</span><span>-&gt;push(</span><span class="string">&quot;global:timeline&quot;</span><span>,</span><span class="vars">$postid</span><span>,false); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$r</span><span>-&gt;ltrim(</span><span class="string">&quot;global:timeline&quot;</span><span>,0,1000); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>header(</span><span class="string">&quot;Location:&nbsp;index.php&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
函数的核心是foreach。 通过SMEMBERS获取当前用户的所有follower，然后循环会把帖子(post)LPUSH到每一个用户的 uid:&lt;userid&gt;:posts里<br />
注意我们同时维护了一个所有帖子的时间线。为此我们还需要LPUSH到global:timeline里。<br />
面对这个现实，你是否开始觉得:SQL里面用ORDER BY来按时间排序有一点儿奇怪? 我确实是这么想的。</p>
<p>&nbsp;</p>
<p><font size="5">分页<br />
</font>现在很清楚，我们能用LRANGE来获取帖子的范围，并在屏幕上显示。代码很简单:</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;showPost(</span><span class="vars">$id</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$r</span><span>&nbsp;=&nbsp;redisLink(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$postdata</span><span>&nbsp;=&nbsp;</span><span class="vars">$r</span><span>-&gt;get(</span><span class="string">&quot;post:$id&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!</span><span class="vars">$postdata</span><span>)&nbsp;</span><span class="keyword">return</span><span>&nbsp;false; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$aux</span><span>&nbsp;=&nbsp;</span><span class="func">explode</span><span>(</span><span class="string">&quot;|&quot;</span><span>,</span><span class="vars">$postdata</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$id</span><span>&nbsp;=&nbsp;</span><span class="vars">$aux</span><span>[0]; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$time</span><span>&nbsp;=&nbsp;</span><span class="vars">$aux</span><span>[1]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$username</span><span>&nbsp;=&nbsp;</span><span class="vars">$r</span><span>-&gt;get(</span><span class="string">&quot;uid:$id:username&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$post</span><span>&nbsp;=&nbsp;join(</span><span class="func">array_splice</span><span>(</span><span class="vars">$aux</span><span>,2,</span><span class="func">count</span><span>(</span><span class="vars">$aux</span><span>)-2),</span><span class="string">&quot;|&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$elapsed</span><span>&nbsp;=&nbsp;strElapsed(</span><span class="vars">$time</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$userlink</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;&lt;a&nbsp;class=\&quot;username\&quot;&nbsp;href=\&quot;profile.php?u=&quot;</span><span>.urlencode(</span><span class="vars">$username</span><span>).</span><span class="string">&quot;\&quot;&gt;&quot;</span><span>.utf8entities(</span><span class="vars">$username</span><span>).</span><span class="string">&quot;&lt;/a&gt;&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>(</span><span class="string">'&lt;div&nbsp;class=&quot;post&quot;&gt;'</span><span>.</span><span class="vars">$userlink</span><span>.</span><span class="string">'&nbsp;'</span><span>.utf8entities(</span><span class="vars">$post</span><span>).</span><span class="string">&quot;&lt;br&gt;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>(</span><span class="string">'&lt;i&gt;posted&nbsp;'</span><span>.</span><span class="vars">$elapsed</span><span>.</span><span class="string">'&nbsp;ago&nbsp;via&nbsp;web&lt;/i&gt;&lt;/div&gt;'</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;true; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">function</span><span>&nbsp;showUserPosts(</span><span class="vars">$userid</span><span>,</span><span class="vars">$start</span><span>,</span><span class="vars">$count</span><span>)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$r</span><span>&nbsp;=&nbsp;redisLink(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$key</span><span>&nbsp;=&nbsp;(</span><span class="vars">$userid</span><span>&nbsp;==&nbsp;-1)&nbsp;?&nbsp;</span><span class="string">&quot;global:timeline&quot;</span><span>&nbsp;:&nbsp;</span><span class="string">&quot;uid:$userid:posts&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$posts</span><span>&nbsp;=&nbsp;</span><span class="vars">$r</span><span>-&gt;lrange(</span><span class="vars">$key</span><span>,</span><span class="vars">$start</span><span>,</span><span class="vars">$start</span><span>+</span><span class="vars">$count</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$c</span><span>&nbsp;=&nbsp;0; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">foreach</span><span>(</span><span class="vars">$posts</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$p</span><span>)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(showPost(</span><span class="vars">$p</span><span>))&nbsp;</span><span class="vars">$c</span><span>++; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$c</span><span>&nbsp;==&nbsp;</span><span class="vars">$count</span><span>)&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="func">count</span><span>(</span><span class="vars">$posts</span><span>)&nbsp;==&nbsp;</span><span class="vars">$count</span><span>+1; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
当showUserPosts获取帖子的范围并传递给showPost时，showPost会简单输出一篇帖子的HTML代码。</p>
<p>&nbsp;</p>
<p><font size="5">Following users 关注的用户<br />
</font>如果用户id 1000 (antirez)想要follow用户id1000的pippo，我们做到这个仅需两步SADD:<br />
SADD uid:1000:following 1001<br />
SADD uid:1001:followers 1000<br />
再次注意这个相同的模式:在关系数据库里的理论里follow的用户和被follow的用户是一张包含类似following_id和follower_id的单独数据表。<br />
用查询你能明确follow和被follow的每一个用户。在key-value数据里有一点特别，需要我们分别设置1000follow了1001并且1001被1000follow的关系。<br />
这是需要付出的代价，但是另一方面讲，获取这些数据即简单又超快。并且这些是独立的集合，允许我们做一些有趣的事情，比如使用SINTER获取两个不同用户的集合。<br />
这样我们也许可以在我们的twitter复制品中加入一个功能:当你访问某个人的资料页时显示&quot;你和foobar有34个共同关注者&quot;之类的东西。<br />
你能够在follow.php中找到增加或者删除following/folloer关系的代码。它如你所见般平常。</p>
<p><br />
<font size="5">使它能够水平分割<br />
</font>亲爱的读者，如果你看到这里，你已经是一个英雄了，谢谢你。在讲到水平分割之前，看看单台服务器的性能是个不错的主意。<br />
Retwis让人惊讶地快，没有任何缓存。在一台非常缓慢和高负载的服务器上，以100个线程并发请求100000次进行apache基准测试，平均占用5ms。<br />
这意味着你可以仅仅使用一台linux服务器接受每天百万用户的访问，并且慢的跟个傻猴似的，就算用更新的硬件。<br />
虽然，就算你有一堆用户，也许也不需要超过1台服务器来跑应用，但让我们假设我们是Twitter，需要处理海量的访问量呢?该怎么做?</p>
<p><font size="5">Hashing the key<br />
</font>第一件事是把KEY进行hash运算并基于hash在不同服务器上处理请求。有大量知名的hash算法，例如ruby客户端自带的consistent hashing<br />
大致意思是你能把key转换成数字，并除以你的服务器数量<br />
&nbsp;server_id = crc32(key) % number_of_servers<br />
这里还有大量因为添加一台服务器产生的问题，但这仅仅是大致的意思，哪怕使用一个类似consistent hashing的更好索引算法，<br />
是不是key就可以分布式访问了呢?所有用户数据都分布在不同的服务器上，没有inter-keys使用到(比如SINTER，否则你需要注意要在同一台服务器上进行)<br />
这是Redis不像memcached一样强制指定索引算法的原因，需要应用来指定。另外，有几个key访问的比较频繁。</p>
<p><font size="5">特殊的Keys<br />
</font>比如每次发布新帖，我们都需要增加global:nextPostId。单台服务器会有大量增加的请求。如何修复这个问题呢?一个简单的办法是用一台专门的服务器来处理增加请求。<br />
除非你有大量的请求，否则矫枉过正了。另一个小技巧是ID并不需要真正地增加，只要唯一即可。这样你可以使用长度为不太可能发生碰撞的随机字符串(除了MD5这样的大小，几乎是不可能)。<br />
完工，我们成功消除了水平分割带来的问题。</p>
<p>另一个问题是global:timeline。这里有个不是解决办法的解决办法，你可以分别保存在不同服务器上，并且在需要这些数据时从不同的服务器上取出来，或者用一个key来进行排序。<br />
如果你确实每秒有这么多帖子，你能够再次用一台独立服务器专门处理这些请求。请记住，商用硬件的Redis能够以100000/s的速度写入数据。我猜测对于twitter这足够了。<br />
请随意在下面评论处提问以及反馈。</p>
<p>&nbsp;</p>]]></description>
			<link>http://dev.meettea.com/show-100-1.html</link>
			<category domain="http://dev.meettea.com/category-8-1.html">后端那些事</category>
			<pubDate>2011-08-28 17:48</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-99-1.html</guid>
			<title>模板引擎正则表达式调试小技巧</title>
			<author>shiny</author>
			<description><![CDATA[<p>很久没有遇上PHP难题了，这次正则问题占了一点时间，还是老问题最大回溯、递归限制问题。学习透之后其实并不难修改调试有这类问题的正则。主要是以下几点。</p>
<ul>
    <li>
    <div>基于正则表达式替换的模板引擎很容易遇上正则表达式最大回溯/递归的限制。</div>
    </li>
    <li>
    <div>惰性匹配并不可怕，正常情况下模板并不会不够用，往往不会超出限制，discuz的模板引擎就大量使用了。但是因此而不去注意、不去学习，则容易书写错误并遇上问题。</div>
    </li>
    <li>
    <div>当preg_*返回的是null的时候则要注意了 判断函数是is_null</div>
    </li>
    <li>
    <div>出错并不可怕，但是最好把错误都完整的输出，这样调试就很容易了</div>
    </li>
    <li>
    <div>除了输出出错原因，还要输出匹配的文本和使用的正则，这样就很容易调试了</div>
    </li>
</ul>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;?php &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">if</span><span>&nbsp;(</span><span class="func">is_null</span><span>(</span><span class="vars">$tmp</span><span>)){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$error_code</span><span>&nbsp;=&nbsp;preg_last_error(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">switch</span><span>(</span><span class="vars">$error_code</span><span>){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;PREG_NO_ERROR&nbsp;: &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;</span><span class="string">'PREG_NO_ERROR'</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;PREG_INTERNAL_ERROR: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;</span><span class="string">'PREG_INTERNAL_ERROR'</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;PREG_BACKTRACK_LIMIT_ERROR: &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;</span><span class="string">'PREG_BACKTRACK_LIMIT_ERROR'</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;PREG_RECURSION_LIMIT_ERROR: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;</span><span class="string">'PREG_RECURSION_LIMIT_ERROR'</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;PREG_BAD_UTF8_ERROR: &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;</span><span class="string">'PREG_BAD_UTF8_ERROR'</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;PREG_BAD_UTF8_OFFSET_ERROR: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;</span><span class="string">'PREG_BAD_UTF8_OFFSET_ERROR'</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">default</span><span>: &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;</span><span class="string">'UNKNOW&nbsp;ERROR'</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">exit</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><strong>参考资料</strong></p>
<ol>
    <li>
    <div>2010, Laruence&nbsp; <a href="http://www.laruence.com/2010/06/08/1579.html">《深悉正则(pcre)最大回溯/递归限制》</a>&nbsp;</div>
    </li>
    <li>
    <div>2011, PHP中文手册&nbsp;<a href="http://us2.php.net/manual/zh/function.preg-last-error.php">preg_last_error</a></div>
    </li>
</ol>]]></description>
			<link>http://dev.meettea.com/show-99-1.html</link>
			<category domain="http://dev.meettea.com/category-4-1.html">微风笔记</category>
			<pubDate>2011-06-08 15:28</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-98-1.html</guid>
			<title>PHP小工具：FileDownLoader version 1.0</title>
			<author>shiny</author>
			<description><![CDATA[<p>FileDownLoader是一款PHP下的文件下载工具</p>
<p>只有一个PHP文件</p>
<p>您可删除bg()函数来减小体积，不影响功能</p>
<p>功能：</p>
<ul>
    <li>
    <div>列出所有PHP能看到的文件</div>
    </li>
    <li>
    <div>下载web主机上的文件</div>
    </li>
</ul>
<p>在非safemod下可下载上百兆的打包文件</p>
<p>Tested in Lamp</p>
<p>截图</p>
<p>[attach=75]</p>
<p>源码见附件</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">/* </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;Copyright&nbsp;2011,&nbsp;File&nbsp;DownLoader&nbsp;v1.0 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;MIT&nbsp;Licensed </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;shiny&nbsp;&lt;shiny@meettea.com&gt; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;* </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;DO&nbsp;NOT&nbsp;BREAK&nbsp;THE&nbsp;LAWS&nbsp;of&nbsp;THE&nbsp;PEOPLE'S&nbsp;REPULIC&nbsp;OF&nbsp;CHINA </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;* </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;THANK&nbsp;YOU! </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>]]></description>
			<link>http://dev.meettea.com/show-98-1.html</link>
			<category domain="http://dev.meettea.com/category-6-1.html">发布与下载</category>
			<pubDate>2011-05-28 18:49</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-97-1.html</guid>
			<title>Linux Web/DB服务器清理硬盘空间方法小记</title>
			<author>shiny</author>
			<description><![CDATA[<p><strong>mysql binlog</strong></p>
<p>日期越长占用的硬盘越多<br />
1、在mysql命令行里敲</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">SQL代码</div>
<ol class="dp-sql">
    <li class="alt"><span><span>PURGE&nbsp;MASTER&nbsp;LOGS&nbsp;BEFORE&nbsp;DATE_SUB(&nbsp;NOW(),&nbsp;INTERVAL&nbsp;10&nbsp;</span><span class="func">DAY</span><span>);&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>清理N天前的日志 (修改INTERVAL N DAY)</p>
<p><br />
2、在my.cnf里修改expire_logs_day</p>
<p><br />
<strong>web日志<br />
</strong>1、定期分割日志<br />
2、过期日志可删除<br />
3、重要日志备份<br />
可进/var/log目录删除日志</p>
<p>web主目录删除不重要的过期的网站</p>
<p>如果是自己开发的一些小程序可检查下mysql表的占用的空间</p>
<p>有用的命令行</p>
<p>查找当前目录下文件和文件夹的大小</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>du&nbsp;-s&nbsp;*&nbsp;|&nbsp;sort&nbsp;-nr&nbsp;|&nbsp;head&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>查找大于100MB的文件</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>find&nbsp;.&nbsp;-type&nbsp;f&nbsp;-size&nbsp;+1000000k&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>删除编译软件时下载的源码包</p>
<p>&nbsp;</p>
<p>通过上面的几步，我的VPS大概清理了5G多的硬盘空间。欢迎补充。</p>]]></description>
			<link>http://dev.meettea.com/show-97-1.html</link>
			<category domain="http://dev.meettea.com/category-7-1.html">运维</category>
			<pubDate>2011-05-26 20:08</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-96-1.html</guid>
			<title>开源Android应用：12321垃圾短信举报</title>
			<author>shiny</author>
			<description><![CDATA[<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 24px; color: rgb(53,53,53); font-size: 14px" class="Apple-style-span">12321网络不良与垃圾信息举报受理中心为中国互联网协会受工业和信息化部委托（信部电函[2007]459号）设立的举报受理机构。</span></span></p>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 24px; color: rgb(53,53,53); font-size: 14px" class="Apple-style-span">举报垃圾短信费用为运营商网内短信的费用，如果是包月用户则计入优惠项内，无信息费。</span></span></p>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 24px; color: rgb(53,53,53); font-size: 14px" class="Apple-style-span">手工转发垃圾短信费时费心，这个APP就是为了降低举报垃圾短信操作难度而开发的，历时一天，主要使用的功能有：短信读取、短信发送。</span></span></p>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 24px; color: rgb(53,53,53); font-size: 14px" class="Apple-style-span">界面很简单，列出近期陌生号码发来的50条短信，点击垃圾短信并确认后可自动发送到12321。</span></span></p>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 24px; color: rgb(53,53,53); font-size: 14px" class="Apple-style-span">源码见附件。版权放弃，随意使用。</span></span></p>]]></description>
			<link>http://dev.meettea.com/show-96-1.html</link>
			<category domain="http://dev.meettea.com/category-6-1.html">发布与下载</category>
			<pubDate>2011-05-16 22:21</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-95-1.html</guid>
			<title>QQ登录PHP OAuth示例</title>
			<author>shiny</author>
			<description><![CDATA[<ul>
    <li>申请是立即通过的</li>
    <li>目前腾讯仅开放获取昵称和头像的API，以后会陆续推出其他API</li>
    <li>头像是QQ空间的，官方文档都是写QQ空间登录</li>
    <li>根据<a href="http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91OAuth%E7%99%BB%E5%BD%95%E6%96%87%E6%A1%A3">官方文档</a>编写</li>
</ul>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;?php &nbsp;&nbsp;</span></span></li>
    <li><span class="comment">/** </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;申请http://connect.opensns.qq.com/apply </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;列表http://connect.opensns.qq.com/my </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>session_start(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$qq_oauth_config</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>( &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_consumer_key'</span><span>=&gt;</span><span class="string">'*******'</span><span>,</span><span class="comment">//APP&nbsp;ID </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_consumer_secret'</span><span>=&gt;</span><span class="string">'******************'</span><span>,</span><span class="comment">//APP&nbsp;KEY </span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_callback'</span><span>=&gt;</span><span class="string">&quot;http://www.955.cc/qq.php?action=reg&quot;</span><span>,//这里修改为当前脚本,但是要保留?action=reg &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_request_token_url'</span><span>=&gt;</span><span class="string">&quot;http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token&quot;</span><span>, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_authorize_url'</span><span>=&gt;</span><span class="string">'http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize'</span><span>, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_request_access_token_url'</span><span>=&gt;</span><span class="string">'http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token'</span><span>, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'user_info_url'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'http://openapi.qzone.qq.com/user/get_user_info'</span><span>, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>); &nbsp;&nbsp;</span></li>
    <li><span class="vars">$action</span><span>&nbsp;=&nbsp;isset(</span><span class="vars">$_GET</span><span>[</span><span class="string">'action'</span><span>])&nbsp;?&nbsp;</span><span class="vars">$_GET</span><span>[</span><span class="string">'action'</span><span>]&nbsp;:&nbsp;</span><span class="string">''</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="vars">$qq</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;qq_oauth(</span><span class="vars">$qq_oauth_config</span><span>); &nbsp;&nbsp;</span></li>
    <li><span class="keyword">switch</span><span>(</span><span class="vars">$action</span><span>){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//用户登录&nbsp;Step1：请求临时token </span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;</span><span class="string">'login'</span><span>: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$token</span><span>&nbsp;=&nbsp;</span><span class="vars">$qq</span><span>-&gt;oauth_request_token(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$_SESSION</span><span>[</span><span class="string">'oauth_token_secret'</span><span>]&nbsp;=&nbsp;</span><span class="vars">$token</span><span>[</span><span class="string">'oauth_token_secret'</span><span>]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$qq</span><span>-&gt;authorize(</span><span class="vars">$token</span><span>[</span><span class="string">'oauth_token'</span><span>]); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Step4：Qzone引导用户跳转到第三方应用 </span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;</span><span class="string">'reg'</span><span>: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$qq</span><span>-&gt;register_user(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$access_token</span><span>&nbsp;=&nbsp;</span><span class="vars">$qq</span><span>-&gt;request_access_token(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$token</span><span>&nbsp;=&nbsp;</span><span class="vars">$qq</span><span>-&gt;save_access_token(</span><span class="vars">$access_token</span><span>)){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//保存,一般发给用户cookie,以及用户入库 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//var_dump($token); </span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$_SESSION</span><span>[</span><span class="string">'oauth_token'</span><span>]&nbsp;=&nbsp;</span><span class="vars">$token</span><span>[</span><span class="string">'oauth_token'</span><span>]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$_SESSION</span><span>[</span><span class="string">'oauth_token_secret'</span><span>]&nbsp;=&nbsp;</span><span class="vars">$token</span><span>[</span><span class="string">'oauth_token_secret'</span><span>]; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$_SESSION</span><span>[</span><span class="string">'openid'</span><span>]&nbsp;=&nbsp;</span><span class="vars">$token</span><span>[</span><span class="string">'openid'</span><span>]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;header(</span><span class="string">'Content-Type:&nbsp;text/html;&nbsp;charset=utf-8'</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$user_info</span><span>&nbsp;=&nbsp;json_decode(</span><span class="vars">$qq</span><span>-&gt;get_user_info()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$user_info</span><span>-&gt;ret!=0){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">exit</span><span>(</span><span class="string">&quot;获取头像昵称时发生错误&quot;</span><span>.</span><span class="vars">$user_info</span><span>-&gt;msg); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;</span><span class="string">'QQ昵称：'</span><span>,</span><span class="vars">$user_info</span><span>-&gt;nickname, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'&lt;img&nbsp;src=&quot;'</span><span>,</span><span class="vars">$user_info</span><span>-&gt;figureurl,</span><span class="string">'&quot;&nbsp;/&gt;'</span><span>, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'&lt;img&nbsp;src=&quot;'</span><span>,</span><span class="vars">$user_info</span><span>-&gt;figureurl_1,</span><span class="string">'&quot;&nbsp;/&gt;'</span><span>, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'&lt;img&nbsp;src=&quot;'</span><span>,</span><span class="vars">$user_info</span><span>-&gt;figureurl_2,</span><span class="string">'&quot;&nbsp;/&gt;'</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">default</span><span>&nbsp;: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">class</span><span>&nbsp;qq_oauth{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="vars">$config</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;__construct(</span><span class="vars">$config</span><span>){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;config&nbsp;=&nbsp;</span><span class="vars">$config</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;返回配置 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;$name </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;C(</span><span class="vars">$name</span><span>){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;isset(</span><span class="vars">$this</span><span>-&gt;config[</span><span class="vars">$name</span><span>])&nbsp;?&nbsp;&nbsp;</span><span class="vars">$this</span><span>-&gt;config[</span><span class="vars">$name</span><span>]&nbsp;:&nbsp;FALSE; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;构建请求URL </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;$url </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;array&nbsp;$params </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;$oauth_token_secret </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;build_request_uri(</span><span class="vars">$url</span><span>,</span><span class="vars">$params</span><span>=</span><span class="keyword">array</span><span>(),</span><span class="vars">$oauth_token_secret</span><span>=</span><span class="string">''</span><span>){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$oauth_consumer_key</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;C(</span><span class="string">'oauth_consumer_key'</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$oauth_consumer_secret</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;C(</span><span class="string">'oauth_consumer_secret'</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$params</span><span>&nbsp;=&nbsp;</span><span class="func">array_merge</span><span>(</span><span class="keyword">array</span><span>( &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_version'</span><span>=&gt;</span><span class="string">'1.0'</span><span>, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_signature_method'</span><span>=&gt;</span><span class="string">'HMAC-SHA1'</span><span>, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_timestamp'</span><span>=&gt;time(), &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_nonce'</span><span>=&gt;rand(1000,99999999), &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_consumer_key'</span><span>=&gt;</span><span class="vars">$oauth_consumer_key</span><span>, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),</span><span class="vars">$params</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$encode_params</span><span>&nbsp;=&nbsp;</span><span class="vars">$params</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ksort(</span><span class="vars">$encode_params</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$oauth_signature</span><span>&nbsp;=&nbsp;</span><span class="string">'GET&amp;'</span><span>.urlencode(</span><span class="vars">$url</span><span>).</span><span class="string">'&amp;'</span><span>.urlencode(http_build_query(</span><span class="vars">$encode_params</span><span>)); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$oauth_signature</span><span>&nbsp;=&nbsp;</span><span class="func">base64_encode</span><span>(hash_hmac(</span><span class="string">'sha1'</span><span>,</span><span class="vars">$oauth_signature</span><span>,</span><span class="vars">$oauth_consumer_secret</span><span>.</span><span class="string">'&amp;'</span><span>.</span><span class="vars">$oauth_token_secret</span><span>,true)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$params</span><span>[</span><span class="string">'oauth_signature'</span><span>]&nbsp;=&nbsp;</span><span class="vars">$oauth_signature</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$url</span><span>.</span><span class="string">'?'</span><span>.http_build_query(</span><span class="vars">$params</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;校验回调是否返回约定的参数&nbsp; </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;check_callback(){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(isset(</span><span class="vars">$_GET</span><span>[</span><span class="string">'oauth_token'</span><span>])) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(isset(</span><span class="vars">$_GET</span><span>[</span><span class="string">'openid'</span><span>])) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(isset(</span><span class="vars">$_GET</span><span>[</span><span class="string">'oauth_signature'</span><span>])) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(isset(</span><span class="vars">$_GET</span><span>[</span><span class="string">'timestamp'</span><span>])) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(isset(</span><span class="vars">$_GET</span><span>[</span><span class="string">'oauth_vericode'</span><span>])) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;true; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;false; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;get_contents(</span><span class="vars">$url</span><span>){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$curl</span><span>&nbsp;=&nbsp;curl_init(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt(</span><span class="vars">$curl</span><span>,CURLOPT_RETURNTRANSFER,true); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt(</span><span class="vars">$curl</span><span>,CURLOPT_URL,</span><span class="vars">$url</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;curl_exec(</span><span class="vars">$curl</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Step1：请求临时token、Step2：生成未授权的临时token </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;oauth_request_token(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$url</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;build_request_uri(</span><span class="vars">$this</span><span>-&gt;C(</span><span class="string">'oauth_request_token_url'</span><span>)); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$tmp_oauth_token</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;get_contents(</span><span class="vars">$url</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">parse_str</span><span>(</span><span class="vars">$tmp_oauth_token</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/* </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oauth_token&nbsp;未授权的临时token </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oauth_token_secret&nbsp;&nbsp;token的密钥，该密钥仅限于临时token </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error_code&nbsp;&nbsp;错误码 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(isset(</span><span class="vars">$error_code</span><span>))&nbsp;</span><span class="func">exit</span><span>(</span><span class="vars">$error_code</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">array</span><span>( &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_token'</span><span>=&gt;</span><span class="vars">$oauth_token</span><span>, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_token_secret'</span><span>=&gt;</span><span class="vars">$oauth_token_secret</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Step3：引导用户到Qzone的登录页 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;$oauth_token&nbsp;未授权的临时token </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;authorize(</span><span class="vars">$oauth_token</span><span>){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$str</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;HTTP/1.1&nbsp;302&nbsp;Found&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;header(</span><span class="vars">$str</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$url</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;C(</span><span class="string">'oauth_authorize_url'</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$query_strings</span><span>&nbsp;=&nbsp;http_build_query(</span><span class="keyword">array</span><span>( &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_consumer_key'</span><span>=&gt;</span><span class="vars">$this</span><span>-&gt;C(</span><span class="string">'oauth_consumer_key'</span><span>), &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_token'</span><span>=&gt;</span><span class="vars">$oauth_token</span><span>, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_callback'</span><span>=&gt;</span><span class="vars">$this</span><span>-&gt;C(</span><span class="string">'oauth_callback'</span><span>), &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;header(</span><span class="string">'Location:&nbsp;'</span><span>.</span><span class="vars">$url</span><span>.</span><span class="string">'?'</span><span>.</span><span class="vars">$query_strings</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Step4：Qzone引导用户跳转到第三方应用 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;bool&nbsp;验证是否有效&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;register_user(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/* </span>&nbsp;</li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;oauth_token&nbsp;&nbsp;已授权的临时token </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;openid&nbsp;&nbsp;&nbsp;腾讯用户对外的统一ID，该OpenID与用户QQ号码一一对应 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;oauth_signature&nbsp;&nbsp;签名值，方便第三方来验证openid以及来源的可靠性。 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用HMAC-SHA1算法： </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;源串：openid+timestamp（串中间不要添加'+'符号） </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;密钥：oauth_consumer_secret </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;timestamp&nbsp;&nbsp;&nbsp;&nbsp;openid的时间戳 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;oauth_vericode&nbsp;&nbsp;&nbsp;授权验证码。 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>-&gt;check_callback()){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//校验签名 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$signature</span><span>&nbsp;=&nbsp;</span><span class="func">base64_encode</span><span>(hash_hmac(</span><span class="string">'sha1'</span><span>,</span><span class="vars">$_GET</span><span>[</span><span class="string">'openid'</span><span>].</span><span class="vars">$_GET</span><span>[</span><span class="string">'timestamp'</span><span>],</span><span class="vars">$this</span><span>-&gt;C(</span><span class="string">'oauth_consumer_secret'</span><span>),true)); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!</span><span class="func">empty</span><span class="keyword">empty</span><span>(</span><span class="vars">$_GET</span><span>[</span><span class="string">'oauth_signature'</span><span>])&nbsp;&amp;&amp;&nbsp;</span><span class="vars">$signature</span><span>==</span><span class="vars">$_GET</span><span>[</span><span class="string">'oauth_signature'</span><span>]){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$_SESSION</span><span>[</span><span class="string">'oauth_token'</span><span>]&nbsp;=&nbsp;</span><span class="vars">$_GET</span><span>[</span><span class="string">'oauth_token'</span><span>]; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$_SESSION</span><span>[</span><span class="string">'oauth_vericode'</span><span>]&nbsp;=&nbsp;</span><span class="vars">$_GET</span><span>[</span><span class="string">'oauth_vericode'</span><span>]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//校验未通过 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">exit</span><span>(</span><span class="string">'UNKNOW&nbsp;REQUEST'</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Step5：请求access&nbsp;token&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;request_access_token(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$url</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;build_request_uri(</span><span class="vars">$this</span><span>-&gt;C(</span><span class="string">'oauth_request_access_token_url'</span><span>),</span><span class="keyword">array</span><span>( &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_token'</span><span>=&gt;</span><span class="vars">$_SESSION</span><span>[</span><span class="string">'oauth_token'</span><span>], &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_vericode'</span><span>=&gt;</span><span class="vars">$_SESSION</span><span>[</span><span class="string">'oauth_vericode'</span><span>] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),</span><span class="vars">$_SESSION</span><span>[</span><span class="string">'oauth_token_secret'</span><span>]); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$this</span><span>-&gt;get_contents(</span><span class="vars">$url</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Step6：生成access&nbsp;token&nbsp;（保存access&nbsp;token） </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;关于access_token </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;目前access_token(及其secret)是长期有效的，和某一个openid对应，目前可以支持线下获取该openid的信息。&nbsp; </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;当然，用户有权限在Qzone这边删除对第三方的授权，此时该access_token会失效，需要重新走整个流程让用户授权。 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;以后会逐步丰富access_token的有效性，长期有效、短期有效、用户登录时才有效等。 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;save_access_token(</span><span class="vars">$access_token_str</span><span>){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">parse_str</span><span>(</span><span class="vars">$access_token_str</span><span>,</span><span class="vars">$access_token_arr</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(isset(</span><span class="vars">$access_token_arr</span><span>[</span><span class="string">'error_code'</span><span>])){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;FALSE; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$access_token_arr</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;目前腾讯仅开放该API </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取登录用户信息，目前可获取用户昵称及头像信息。 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;http://openapi.qzone.qq.com/user/get_user_info </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;get_user_info(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$url</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;build_request_uri(</span><span class="vars">$this</span><span>-&gt;C(</span><span class="string">'user_info_url'</span><span>),</span><span class="keyword">array</span><span>( &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'oauth_token'</span><span>=&gt;</span><span class="vars">$_SESSION</span><span>[</span><span class="string">'oauth_token'</span><span>], &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'openid'</span><span>=&gt;</span><span class="vars">$_SESSION</span><span>[</span><span class="string">'openid'</span><span>], &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),</span><span class="vars">$_SESSION</span><span>[</span><span class="string">'oauth_token_secret'</span><span>]); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$this</span><span>-&gt;get_contents(</span><span class="vars">$url</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>]]></description>
			<link>http://dev.meettea.com/show-95-1.html</link>
			<category domain="http://dev.meettea.com/category-8-1.html">后端那些事</category>
			<pubDate>2011-04-20 20:19</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-94-1.html</guid>
			<title>Node.JS——服务器端的js语言</title>
			<author>shiny</author>
			<description><![CDATA[<p><img style="line-height: normal; word-wrap: break-word" id="e_f_img_0.5601731401402503" border="0" alt="" src="http://nodejs.org/logo.png" />&nbsp;</p>
<div style="text-align: left; padding-bottom: 0px; border-right-width: 0px !important; background-color: rgb(255,255,255); margin: 0px; padding-left: 0px; padding-right: 0px; font: 12px/1.6em Verdana, Helvetica, Arial, sans-serif; word-wrap: break-word; border-top-width: 0px !important; border-bottom-width: 0px !important; color: rgb(68,68,68); border-left-width: 0px !important; padding-top: 0px; background-origin: initial; background-clip: initial">
<div style="line-height: normal; word-wrap: break-word">
<div style="line-height: normal; word-wrap: break-word">&nbsp;</div>
</div>
<div style="line-height: normal; word-wrap: break-word"><strong style="line-height: normal; word-wrap: break-word">简介</strong></div>
<div style="line-height: normal; word-wrap: break-word">Node.JS是服务器端运行的js。同类产品还有CommonJS，都是启动于2009年的服务器端js的实现。</div>
<div style="line-height: normal; word-wrap: break-word">其中CommonJS的一些思想对前端JS框架(函数库)亦有影响。</div>
<div style="line-height: normal; word-wrap: break-word">&nbsp;</div>
<div style="line-height: normal; word-wrap: break-word"><strong style="line-height: normal; word-wrap: break-word">特色</strong></div>
<div style="line-height: normal; word-wrap: break-word">和PHP不同的是，node.js提供的http服务并不需要apache/IIS来提供，你可以在js里指定监听的端口。</div>
<div style="line-height: normal; word-wrap: break-word">此外node.js仍保持了js的本色，事件驱动、无阻塞是node.js的特色，使用V8引擎，保障了较好的性能。</div>
<div style="line-height: normal; word-wrap: break-word">甚至可以用于HTTP长连接。</div>
<div style="line-height: normal; word-wrap: break-word">当然，对于php程序员编写node.js的时候最大的障碍也是对node.js事件驱动机制的理解，尽管可能熟练编写js。</div>
<div style="line-height: normal; word-wrap: break-word">&nbsp;</div>
<div style="line-height: normal; word-wrap: break-word"><strong style="line-height: normal; word-wrap: break-word">数据库</strong></div>
<div style="line-height: normal; word-wrap: break-word">node.js连接mysql仍旧是阻塞、需要等待mysql服务器的反应的，但是连接mongoDB是立即返回，得到数据后触发回调函数。</div>
<div style="line-height: normal; word-wrap: break-word">一个Node.js读取mongoDB并输出json数据&nbsp;的demo</div>
<div style="line-height: normal; word-wrap: break-word">&nbsp;</div>
<div style="line-height: normal; word-wrap: break-word"><span style="line-height: normal; font-family: Verdana, Simsun, sans-serif; word-wrap: break-word; color: rgb(0,0,0); font-size: 13px" class="Apple-style-span">
<h3 style="padding-bottom: 0px; line-height: normal; margin: 0px 0px 2px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; color: rgb(0,102,0); font-size: 10pt; font-weight: bold; padding-top: 0px">index.js</h3>
<div style="line-height: normal; word-wrap: break-word">&nbsp;</div>
<div style="line-height: normal; word-wrap: break-word">&nbsp;</div>
</span>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;express&nbsp;=&nbsp;require(</span><span class="string">'express'</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">var</span><span>&nbsp;app&nbsp;=&nbsp;express.createServer(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">var</span><span>&nbsp;db&nbsp;=&nbsp;require(</span><span class="string">'./tea/db'</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>db.open({dbName:</span><span class="string">'comments'</span><span>}); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>app.get(</span><span class="string">'/'</span><span>,</span><span class="keyword">function</span><span>(req,res){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;db.findOne(</span><span class="string">'comments'</span><span>,{},</span><span class="keyword">function</span><span>(records){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.send(records); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}); &nbsp;&nbsp;</span></li>
    <li><span>app.listen(8001); &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<div style="line-height: normal; word-wrap: break-word"><span style="line-height: normal; font-family: Verdana, Simsun, sans-serif; word-wrap: break-word; color: rgb(0,0,0); font-size: 13px" class="Apple-style-span">
<h3 style="padding-bottom: 0px; line-height: normal; margin: 0px 0px 2px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; color: rgb(0,102,0); font-size: 10pt; font-weight: bold; padding-top: 0px">&nbsp;/tea/index.js</h3>
<p style="padding-bottom: 0px; line-height: normal; margin: 0px 0px 2px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; color: rgb(0,102,0); font-size: 10pt; font-weight: bold; padding-top: 0px">&nbsp;</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;tea&nbsp;=&nbsp;exports; &nbsp;&nbsp;</span></span></li>
    <li><span>tea.hello&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(</span><span class="string">'hello&nbsp;world'</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</span></div>
<div style="line-height: normal; word-wrap: break-word"><span style="line-height: normal; font-family: Verdana, Simsun, sans-serif; word-wrap: break-word; color: rgb(0,0,0); font-size: 13px" class="Apple-style-span">
<h3 style="padding-bottom: 0px; line-height: normal; margin: 0px 0px 2px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; color: rgb(0,102,0); font-size: 10pt; font-weight: bold; padding-top: 0px">/tea/db.js</h3>
<p style="padding-bottom: 0px; line-height: normal; margin: 0px 0px 2px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; color: rgb(0,102,0); font-size: 10pt; font-weight: bold; padding-top: 0px">&nbsp;</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;mongo&nbsp;=&nbsp;require(</span><span class="string">'mongodb'</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">var</span><span>&nbsp;tea&nbsp;=&nbsp;tea&nbsp;||&nbsp;{}; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>tea.db&nbsp;=&nbsp;exports; &nbsp;&nbsp;</span></li>
    <li><span>tea.db.server&nbsp;=&nbsp;</span><span class="string">'127.0.0.1'</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>tea.db.port&nbsp;=&nbsp;27017; &nbsp;&nbsp;</span></li>
    <li><span>tea.db.db&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>tea.db.dbName&nbsp;=&nbsp;</span><span class="string">''</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>tea.db.collection&nbsp;=&nbsp;</span><span class="string">''</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>tea.db.open&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(mongoInfo,callback){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.dbName&nbsp;=&nbsp;mongoInfo.dbName; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!</span><span class="keyword">this</span><span>.db)&nbsp;</span><span class="keyword">this</span><span>.db&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;mongo.Db(mongoInfo.dbName,&nbsp;</span><span class="keyword">new</span><span>&nbsp;mongo.Server(</span><span class="string">'127.0.0.1'</span><span>,&nbsp;27017,&nbsp;{}),&nbsp;{}); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.db.open(</span><span class="keyword">function</span><span>(err,db){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.db&nbsp;=&nbsp;db; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(callback)&nbsp;callback(db); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}; &nbsp;&nbsp;</span></li>
    <li><span>tea.db.find&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(collection,query,callback,isFindOne){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.db.collection(collection,&nbsp;</span><span class="keyword">function</span><span>(err,&nbsp;collection)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;func&nbsp;=&nbsp;isFindOne&nbsp;?&nbsp;</span><span class="string">'findOne'</span><span>&nbsp;:&nbsp;</span><span class="string">'find'</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;collection[func](query,</span><span class="keyword">function</span><span>(err,cursor){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!isFindOne)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.toArray(</span><span class="keyword">function</span><span>(err,items){&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(callback)&nbsp;callback(items); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">else</span><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(callback)&nbsp;callback(cursor); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li><span>tea.db.findOne&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(collection,query,callback){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.find(collection,query,callback,1); &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>tea.db.close&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(tea.db.db)&nbsp;tea.db.db.close(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li><span>tea.db.hello&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;console.log(</span><span class="string">'Hello&nbsp;World'</span><span>); &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</span></div>
<div style="line-height: normal; word-wrap: break-word">
<div style="padding-bottom: 0px; line-height: normal; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px">1、读取mongoDB的数据，简单封装node mongodb Native驱动</div>
<div style="padding-bottom: 0px; line-height: normal; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px">2、包含模块如何编写</div>
<div style="padding-bottom: 0px; line-height: normal; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px">3、把JSON数据数据返回给客户端</div>
<div style="padding-bottom: 0px; line-height: normal; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px">&nbsp;</div>
<div style="padding-bottom: 0px; line-height: normal; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px">运行此源码必须</div>
<div style="padding-bottom: 0px; line-height: normal; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px">1、安装node mongodb native驱动</div>
<div style="padding-bottom: 0px; line-height: normal; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px">2、express js框架(不安装的话简单修改index.js即可)</div>
<div style="padding-bottom: 0px; line-height: normal; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px">3、安装了mongoDB,并且有comments数据库comments collection。collection里有数据。</div>
<div style="padding-bottom: 0px; line-height: normal; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px">如果名字不一样，进index.js就可以修改。端口必须是默认的。</div>
<div style="padding-bottom: 0px; line-height: normal; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px">3、node index.js，打开127.0.0.1:8001就可以看到返回了数据</div>
<div style="padding-bottom: 0px; line-height: 22px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Verdana, Simsun, sans-serif; word-wrap: break-word; color: rgb(102,102,102); font-size: 13px; padding-top: 0px">&nbsp;</div>
</div>
<div style="line-height: normal; word-wrap: break-word">&nbsp;</div>
<div style="line-height: normal; word-wrap: break-word"><strong style="line-height: normal; word-wrap: break-word">框架</strong></div>
<div style="line-height: normal; word-wrap: break-word"><img style="line-height: normal; word-wrap: break-word" border="0" alt="" src="http://expressjs.com/images/logo.png" /><span class="Apple-converted-space">&nbsp;</span></div>
<div style="line-height: normal; word-wrap: break-word">express js是一个node.js的框架，使用它可以让很多操作简化不少。</div>
<div style="line-height: normal; word-wrap: break-word">&nbsp;</div>
<div style="line-height: normal; word-wrap: break-word">&nbsp;</div>
<div style="line-height: normal; word-wrap: break-word">运行环境</div>
<div style="line-height: normal; word-wrap: break-word">nodejs的最佳运行环境是非win平台，但是仍旧可以通过cygwin来运行。</div>
<div style="line-height: normal; word-wrap: break-word">linux下的源码包在<span style="line-height: 22px; word-wrap: break-word" class="Apple-style-span"><a style="line-height: normal; word-wrap: break-word; color: rgb(0,102,153)" href="http://nodejs.org/">http://nodejs.org/</a>下载</span></div>
<div style="line-height: normal; word-wrap: break-word"><span style="line-height: 22px; word-wrap: break-word" class="Apple-style-span">windows：</span><span style="line-height: 22px; word-wrap: break-word" class="Apple-style-span"><a style="line-height: normal; word-wrap: break-word; color: rgb(0,102,153)" href="http://node-js.prcn.co.cc/">http://node-js.prcn.co.cc/</a></span></div>
</div>
<p>&nbsp;</p>]]></description>
			<link>http://dev.meettea.com/show-94-1.html</link>
			<category domain="http://dev.meettea.com/category-8-1.html">后端那些事</category>
			<pubDate>2011-04-19 09:06</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-93-1.html</guid>
			<title>Chrome扩展编写一二三</title>
			<author>shiny</author>
			<description><![CDATA[<p>本文假定读者熟悉JS。</p>
<p>编写Chrome扩展的两个示例。</p>
<p>一、QQ云词典<br />
QQ云词典提供了收藏夹内点击即可在当前页面启动QQ云词典的方式。<br />
但是我不太习惯在chrome下使用收藏夹。搜索Google Chrome扩展网站，未果，于是打算自己写一个。<br />
1、新建一个文件夹。<br />
2、新建一个 manifest.json</p>
<p>内容</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>{ &nbsp;&nbsp;</span></span></li>
    <li><span class="string">&quot;update_url&quot;</span><span>:</span><span class="string">&quot;http://clients2.google.com/service/update2/crx&quot;</span><span>,&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="string">&quot;name&quot;</span><span>:&nbsp;</span><span class="string">&quot;QQ云词典&quot;</span><span>,&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="string">&quot;version&quot;</span><span>:&nbsp;</span><span class="string">&quot;1.0&quot;</span><span>,&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="string">&quot;description&quot;</span><span>:&nbsp;</span><span class="string">&quot;QQ云词典快捷方式，适合不习惯收藏夹启动云词典的用户使用&quot;</span><span>,&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="string">&quot;browser_action&quot;</span><span>:&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;default_icon&quot;</span><span>:&nbsp;</span><span class="string">&quot;favicon.ico&quot;</span><span>, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;popup&quot;</span><span>:&nbsp;</span><span class="string">&quot;popup.html&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;}, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="string">&quot;permissions&quot;</span><span>:&nbsp;[ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;tabs&quot;</span><span>,&nbsp;</span><span class="string">&quot;http://*/*&quot;</span><span>,</span><span class="string">&quot;https://*/*&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>3、新建一个popup.html<br />
内容</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;script&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;chrome.tabs.executeScript(</span><span class="keyword">null</span><span>, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{code:</span><span class="string">&quot;void((function(d){if(!!d){d.toggle();return;};var&nbsp;src='http://dict.qq.com/cloudgetjs';var&nbsp;e=document.createElement('script');e.setAttribute('src',src);document.getElementsByTagName('head')[0].appendChild(e);})(window.QQCloudDict))&quot;</span><span>}); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;window.close(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>4、从dict.qq.com下载一个favicon.ico，放文件夹里<br />
好的代码是自解释的，这样一个扩展就完成了，用zip压缩后上传到google<br />
<a href="https://chrome.google.com/extensions/detail/gchhncbmgdmgdgbpdmpcclmieekamijo?hl=zh-cn">https://chrome.google.com/extensions/detail/gchhncbmgdmgdgbpdmpcclmieekamijo?hl=zh-cn</a></p>
<p>注BUGs：，可能因为权限问题，google的https页和非WEB的tab页是不能启动云词典的。</p>
<p>二、Bai.Lu网址短缩插件<br />
这么快就完成了一个插件，意犹未尽啊。看到tank的bai.lu短网址最近改版了，就试试他提供的api看。</p>
<p>1、新建一个文件夹<br />
2、新建一个manifest.json</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>{ &nbsp;&nbsp;</span></span></li>
    <li><span class="string">&quot;update_url&quot;</span><span>:</span><span class="string">&quot;http://clients2.google.com/service/update2/crx&quot;</span><span>,&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="string">&quot;name&quot;</span><span>:&nbsp;</span><span class="string">&quot;Bai.lu网址短缩&quot;</span><span>,&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="string">&quot;version&quot;</span><span>:&nbsp;</span><span class="string">&quot;1.0&quot;</span><span>,&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="string">&quot;description&quot;</span><span>:&nbsp;</span><span class="string">&quot;Bai.lu网址短缩，点击图标生成当前页的短缩网址&quot;</span><span>,&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="string">&quot;browser_action&quot;</span><span>:&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;default_icon&quot;</span><span>:&nbsp;</span><span class="string">&quot;favicon.ico&quot;</span><span>, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;popup&quot;</span><span>:&nbsp;</span><span class="string">&quot;popup.html&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;}, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="string">&quot;permissions&quot;</span><span>:&nbsp;[ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;tabs&quot;</span><span>,&nbsp;</span><span class="string">&quot;http://*/*&quot;</span><span>,</span><span class="string">&quot;https://*/*&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>3、新建一个popup.html</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">charset</span><span>=</span><span class="attribute-value">&quot;utf-8&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">style</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>body,#loading{height:26px;width:230px;&nbsp;font-size:12px;&nbsp;overflow:hidden} &nbsp;&nbsp;</span></li>
    <li><span>#url{display:none;&nbsp;width:220px;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">style</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;loading&quot;</span><span class="tag">&gt;</span><span>正在压缩...</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;url&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>/*获取当前的TAB页*/ &nbsp;&nbsp;</span></li>
    <li><span>chrome.tabs.getSelected(null,function(tab)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span class="attribute">loading</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">document</span><span>.getElementById('loading'); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">loading.innerHTML</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;正在压缩&quot;</span><span>+tab.title+&quot;...&quot;; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;/*发起ajax请求，经过permissions设置能请求任意网站是chrome扩展一个很方便的地方*/ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span class="attribute">req</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;XMLHttpRequest(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;req.open( &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;GET&quot;, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;http://bai.lu/api?</span><span class="attribute">url</span><span>=&quot;+encodeURIComponent(tab.url), &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">req.onload</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">function</span><span>(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span class="attribute">result</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">0</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(&quot;</span><span class="attribute">result</span><span>&nbsp;=&nbsp;&quot;+req.responseText); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span class="attribute">url</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">document</span><span>.getElementById('url'); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">url.style.display</span><span>=</span><span class="attribute-value">'block'</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*关于api返回的结果请参考http://bai.lu/api_help&nbsp;*/ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span class="attribute">result.status</span><span>=='ok'){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('loading')</span><span class="attribute">.style.display</span><span>=</span><span class="attribute-value">'none'</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">url.value</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">result</span><span>.url; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url.select(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url.focus(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*复制功能*/ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.execCommand('Copy'); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url.value+='&nbsp;已复制到剪切板'; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span class="attribute">msg</span><span>&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;busy:'系统繁忙', &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'invalid&nbsp;url':'URL格式不正确', &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'already&nbsp;shortened':'百路不能被百路', &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:'发生未知错误' &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(msg[result.status]){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">url.value</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">msg</span><span>[result.status]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">url.value</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">'发生未知错误'</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">req.onerror</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">function</span><span>(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;</span><span class="attribute">url</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">document</span><span>.getElementById('url'); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">url.style.display</span><span>=</span><span class="attribute-value">'block'</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">url.value</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">'出错了，也许是百路宕机了'</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;req.send(null); &nbsp;&nbsp;</span></li>
    <li><span>}); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><a href="https://chrome.google.com/extensions/detail/legpmlaklpfgcdnbclpabhbhdiickmkh?hl=zh-cn">https://chrome.google.com/extensions/detail/legpmlaklpfgcdnbclpabhbhdiickmkh?hl=zh-cn</a></p>
<p>三、资源、提示与注意事项<br />
1、google的文档<a href="http://code.google.com/chrome/extensions/docs.html">http://code.google.com/chrome/extensions/docs.html</a> 嫌英语麻烦的话可以看他提供的示例，很丰富。<br />
2、能用popup就不要用background，popup占用浏览器的资源少。<br />
3、如果某个功能不会，可直接上google扩展网站在&ldquo;安装&rdquo;按钮上另存为并改扩展名为zip，即可打开源码研究之。</p>]]></description>
			<link>http://dev.meettea.com/show-93-1.html</link>
			<category domain="http://dev.meettea.com/category-4-1.html">微风笔记</category>
			<pubDate>2011-03-01 11:25</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-92-1.html</guid>
			<title>第五届D2前端技术论坛</title>
			<author>shiny</author>
			<description><![CDATA[<p>&nbsp;</p>
<p><a href="http://dev.meettea.com/show-57-1.html">在去年的D2 FORUM上</a>，我花费一天时间听了来自百度/豆瓣/腾讯/口碑的分享，感受到一线企业前端上应用的成果。虽然并无什么意外和特别的收获，但当时作为一名即将步入IT行业的学生而言，通过D2了解前端行业基本的动向与需求，受益匪浅。</p>
<p>转眼间一年过去了，今年的D2还特别开设了学生报名专区，我想在杭州从事WEB开发方面的学生都应该去凑凑热闹，了解自己和工作需求的差距。而因为前端无法闭源的性质，比后端开放很多，对于已参加工作的人价值并不很突出。</p>
<p>事后的PPT将在D2举办后在本文中提供下载。</p>
<p>下面是第五届D2的日程安排，你也可以点击博客右侧的图片链接进D2官网查看详情。</p>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(64,64,64); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 18px; font-family: Tahoma, Helvetica, Arial, ����, sans-serif; font-size: 12px" class="Apple-style-span"><section style="margin-top: 5px; padding-left: 53px; display: block; margin-bottom: 20px; float: left" class="subBody mb20"></section></span></span></p>
<ul style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="detail">
    <li style="padding-bottom: 0px; line-height: 2; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: block; padding-top: 0px"><em style="font-style: normal; font-weight: bold"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(64,64,64); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 18px; font-family: Tahoma, Helvetica, Arial, ����, sans-serif; font-size: 12px" class="Apple-style-span">
    <div style="padding-bottom: 0px; margin: 0px; padding-left: 43px; padding-right: 0px; background: url(http://www.d2forum.org/d2/5/assets/img/decorate.png) no-repeat 0px 0px; height: 52px; clear: both; padding-top: 0px; background-origin: initial; background-clip: initial" class="title">
    <h3 style="border-bottom: rgb(174,174,174) 1px solid; padding-bottom: 0px; line-height: 44px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; height: 44px; color: rgb(22,21,21); font-size: 18px; font-weight: bold; padding-top: 0px"><span style="background-image: url(http://www.d2forum.org/d2/5/assets/img/title-text.png); position: relative; overflow-x: hidden; overflow-y: hidden; text-indent: -9999px; width: 133px; display: block; background-position: 0px 0px; height: 23px; top: 12px; background-origin: initial; background-clip: initial" class="schedule">日程安排</span></h3>
    </div>
    </span></span><br class="Apple-interchange-newline" />
    举办时间：</em><span class="Apple-converted-space">&nbsp;</span>2010年12月18日(星期六)</li>
    <li style="padding-bottom: 0px; line-height: 2; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: block; padding-top: 0px"><em style="font-style: normal; font-weight: bold">举办地点：</em><span class="Apple-converted-space">&nbsp;</span>杭州市百瑞运河大饭店 （<a style="color: rgb(0,146,238); text-decoration: underline" target="_blank" href="http://hangzhou.edushi.com/?oid=8277">地图</a>）</li>
    <li style="padding-bottom: 0px; line-height: 2; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: block; padding-top: 0px"><em style="font-style: normal; font-weight: bold">报名地址：</em><span class="Apple-converted-space">&nbsp;</span><a style="color: rgb(0,146,238); text-decoration: underline" href="http://www.d2forum.org/d2/5/signup.html">http://www.d2forum.org/d2/5/signup.html</a></li>
    <li style="padding-bottom: 0px; line-height: 2; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: block; padding-top: 0px"><em style="font-style: normal; font-weight: bold">报名截止：</em><span class="Apple-converted-space">&nbsp;</span>2010年11月30日 23点59分59秒</li>
</ul>
<p>
<table style="line-height: 30px; margin-top: 15px; text-indent: 10px; width: 750px; border-collapse: collapse; color: rgb(102,102,102); -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px" class="timeTabular" summary="D平方,潜能无限!">
    <colgroup><col style="width: 100px" class="time"></col><col style="width: 200px" class="subject"></col><col></col></colgroup>
    <thead>
        <tr>
            <td style="border-bottom: rgb(146,146,146) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(88,4,144); font-size: 14px; border-top: rgb(231,231,231) 1px solid; font-weight: bold; border-right: rgb(231,231,231) 1px solid; padding-top: 0px" class="bdr timeLine" colspan="3"><strong style="font-style: normal; font-weight: bold">上午:</strong><span class="Apple-converted-space">&nbsp;</span>8:45 &ndash; 11:30</td>
        </tr>
        <tr>
            <th style="border-bottom-style: none; text-align: left; border-left: rgb(146,146,146) 1px solid; padding-bottom: 0px; overflow-x: hidden; overflow-y: hidden; background-color: rgb(135,135,135); font-style: normal; margin: 0px; padding-left: 0px; padding-right: 0px; height: 30px; color: rgb(255,255,255); font-size: 14px; border-top: rgb(146,146,146) 1px solid; font-weight: bold; border-right: rgb(146,146,146) 1px solid; padding-top: 0px" scope="col">时间</th>
            <th style="border-bottom-style: none; text-align: left; border-left: rgb(146,146,146) 1px solid; padding-bottom: 0px; overflow-x: hidden; overflow-y: hidden; background-color: rgb(135,135,135); font-style: normal; margin: 0px; padding-left: 0px; padding-right: 0px; height: 30px; color: rgb(255,255,255); font-size: 14px; border-top: rgb(146,146,146) 1px solid; font-weight: bold; border-right: rgb(146,146,146) 1px solid; padding-top: 0px" scope="col">主题</th>
            <th style="border-bottom-style: none; text-align: left; border-left: rgb(146,146,146) 1px solid; padding-bottom: 0px; overflow-x: hidden; overflow-y: hidden; background-color: rgb(135,135,135); font-style: normal; margin: 0px; padding-left: 0px; padding-right: 0px; height: 30px; color: rgb(255,255,255); font-size: 14px; border-top: rgb(146,146,146) 1px solid; font-weight: bold; border-right: rgb(146,146,146) 1px solid; padding-top: 0px" scope="col">嘉宾</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">08:45 &ndash; 09:15</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">入场</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">&nbsp;</td>
        </tr>
        <tr>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">09:15 &ndash; 11:30</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">前端的昨天、今天、明天（暂定）</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">科学松鼠会 &amp; D2 组委会</td>
        </tr>
    </tbody>
</table>
</p>
<p style="padding-bottom: 0px; margin: 15px 0px 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="rest">午餐时间: 11:30 - 13:00</p>
<p>
<table style="line-height: 30px; margin-top: 15px; text-indent: 10px; width: 750px; border-collapse: collapse; color: rgb(102,102,102); -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px" class="timeTabular" summary="D平方,潜能无限!">
    <colgroup><col style="width: 100px" class="time"></col><col style="width: 200px" class="subject"></col><col style="width: 150px" class="name"></col><col style="width: 200px" class="subject"></col><col style="width: 150px" class="name"></col></colgroup>
    <thead>
        <tr>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(88,4,144); font-size: 14px; border-top: rgb(231,231,231) 1px solid; font-weight: bold; border-right: rgb(231,231,231) 1px solid; padding-top: 0px" class="timeLine" colspan="5"><strong style="font-style: normal; font-weight: bold">下午:</strong><span class="Apple-converted-space">&nbsp;</span>13:00 &ndash; 18:00</td>
        </tr>
        <tr>
            <td style="border-bottom: rgb(146,146,146) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px" class="bdr">&nbsp;</td>
            <td style="border-bottom: rgb(146,146,146) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px" class="bdr" colspan="2">会场一</td>
            <td style="border-bottom: rgb(146,146,146) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px" class="bdr" colspan="2">会场二</td>
        </tr>
        <tr>
            <th style="border-bottom-style: none; text-align: left; border-left: rgb(146,146,146) 1px solid; padding-bottom: 0px; overflow-x: hidden; overflow-y: hidden; background-color: rgb(135,135,135); font-style: normal; margin: 0px; padding-left: 0px; padding-right: 0px; height: 30px; color: rgb(255,255,255); font-size: 14px; border-top: rgb(146,146,146) 1px solid; font-weight: bold; border-right: rgb(146,146,146) 1px solid; padding-top: 0px" scope="col">时间</th>
            <th style="border-bottom-style: none; text-align: left; border-left: rgb(146,146,146) 1px solid; padding-bottom: 0px; overflow-x: hidden; overflow-y: hidden; background-color: rgb(135,135,135); font-style: normal; margin: 0px; padding-left: 0px; padding-right: 0px; height: 30px; color: rgb(255,255,255); font-size: 14px; border-top: rgb(146,146,146) 1px solid; font-weight: bold; border-right: rgb(146,146,146) 1px solid; padding-top: 0px" scope="col">主题</th>
            <th style="border-bottom-style: none; text-align: left; border-left: rgb(146,146,146) 1px solid; padding-bottom: 0px; overflow-x: hidden; overflow-y: hidden; background-color: rgb(135,135,135); font-style: normal; margin: 0px; padding-left: 0px; padding-right: 0px; height: 30px; color: rgb(255,255,255); font-size: 14px; border-top: rgb(146,146,146) 1px solid; font-weight: bold; border-right: rgb(146,146,146) 1px solid; padding-top: 0px" scope="col">嘉宾</th>
            <th style="border-bottom-style: none; text-align: left; border-left: rgb(146,146,146) 1px solid; padding-bottom: 0px; overflow-x: hidden; overflow-y: hidden; background-color: rgb(135,135,135); font-style: normal; margin: 0px; padding-left: 0px; padding-right: 0px; height: 30px; color: rgb(255,255,255); font-size: 14px; border-top: rgb(146,146,146) 1px solid; font-weight: bold; border-right: rgb(146,146,146) 1px solid; padding-top: 0px" scope="col">主题</th>
            <th style="border-bottom-style: none; text-align: left; border-left: rgb(146,146,146) 1px solid; padding-bottom: 0px; overflow-x: hidden; overflow-y: hidden; background-color: rgb(135,135,135); font-style: normal; margin: 0px; padding-left: 0px; padding-right: 0px; height: 30px; color: rgb(255,255,255); font-size: 14px; border-top: rgb(146,146,146) 1px solid; font-weight: bold; border-right: rgb(146,146,146) 1px solid; padding-top: 0px" scope="col">嘉宾</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">13:00 &ndash; 14:00</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">
            <p style="padding-bottom: 5px; line-height: 1.5; text-indent: 0px; margin: 0px; padding-left: 10px; padding-right: 0px; padding-top: 5px">打造高品质的JavaScript---运用Closure Compiler</p>
            </td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" href="http://www.d2forum.org/d2/5/guest.html">Hedger</a>（Google）</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">可复制的前后端分离开发模式</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" href="http://www.d2forum.org/d2/5/guest.html">杜欢</a>（思科）</td>
        </tr>
        <tr>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">14:10 &ndash; 15:10</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">
            <p style="padding-bottom: 5px; line-height: 1.5; text-indent: 0px; margin: 0px; padding-left: 10px; padding-right: 0px; padding-top: 5px">CommonJS时代的JS模块和编译工具</p>
            </td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" href="http://www.d2forum.org/d2/5/guest.html#yy">杨扬 / Dexter</a>（土豆）</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">
            <p style="padding-bottom: 5px; line-height: 1.5; text-indent: 0px; margin: 0px; padding-left: 10px; padding-right: 0px; padding-top: 5px">前端技术在电子商务领域的应用与实践</p>
            </td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" href="http://www.d2forum.org/d2/5/guest.html#xiaohu">小虎</a><span class="Apple-converted-space">&nbsp;</span>&amp;<span class="Apple-converted-space">&nbsp;</span><a style="color: rgb(0,146,238); text-decoration: underline" href="http://www.d2forum.org/d2/5/guest.html#zaitian">在天</a>（淘宝）</td>
        </tr>
        <tr>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">15:10 &ndash; 15:30</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px" colspan="4">茶歇</td>
        </tr>
        <tr>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">15:30 &ndash; 16:30</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">面向未来的前端开发</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" href="http://www.d2forum.org/d2/5/guest.html#yubo">玉伯</a>（淘宝）</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">
            <p style="padding-bottom: 5px; line-height: 1.5; text-indent: 0px; margin: 0px; padding-left: 10px; padding-right: 0px; padding-top: 5px">Bookmarklet型(云端)应用的前端架构</p>
            </td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" href="http://www.d2forum.org/d2/5/guest.html">屈超</a>（腾讯）</td>
        </tr>
        <tr>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px">16:40 &ndash; 18:00</td>
            <td style="border-bottom: rgb(231,231,231) 1px solid; border-left: rgb(231,231,231) 1px solid; padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top: rgb(231,231,231) 1px solid; border-right: rgb(231,231,231) 1px solid; padding-top: 0px" colspan="4">作品秀 / 互动交流</td>
        </tr>
    </tbody>
</table>
</p>
<p style="padding-bottom: 8px; margin: 10px 0px 0px; padding-left: 8px; padding-right: 8px; color: rgb(50,59,62); padding-top: 8px" class="notice"><strong style="font-style: normal; color: rgb(255,85,0); font-weight: bold">注意：</strong>以上安排可能会根据具体情况进行一些补充与修改。</p>
<p>&nbsp;</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 43px; padding-right: 0px; background: url(http://www.d2forum.org/d2/5/assets/img/decorate.png) no-repeat 0px 0px; height: 52px; clear: both; padding-top: 0px; background-origin: initial; background-clip: initial" class="title">
<h3 style="border-bottom: rgb(174,174,174) 1px solid; padding-bottom: 0px; line-height: 44px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; height: 44px; color: rgb(22,21,21); font-size: 18px; font-weight: bold; padding-top: 0px"><span style="background-image: url(http://www.d2forum.org/d2/5/assets/img/title-text.png); position: relative; overflow-x: hidden; overflow-y: hidden; text-indent: -9999px; width: 133px; display: block; background-position: 0px -115px; height: 23px; top: 12px; background-origin: initial; background-clip: initial" class="route">行车路线</span></h3>
</div>
<p><section style="margin-top: 5px; padding-left: 53px; display: block; margin-bottom: 20px; float: left" class="subBody mb20"></section></p>
<ul style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="routeDetail">
    <li style="padding-bottom: 0px; list-style-type: none; margin: 10px 0px; padding-left: 0px; padding-right: 0px; display: block; padding-top: 0px"><em style="font-style: normal; font-weight: bold">详细地点：</em>杭州市百瑞运河大饭店（杭州市 拱墅区 金华路58号）（<a style="color: rgb(0,146,238); text-decoration: underline" title="杭州市百瑞运河大饭店" target="_blank" href="http://hangzhou.edushi.com/?oid=8277">地图详细</a>）</li>
    <li style="padding-bottom: 0px; list-style-type: none; margin: 10px 0px 18px; padding-left: 0px; padding-right: 0px; display: block; padding-top: 0px" class="traffic"><em style="font-style: normal; font-weight: bold">附近交通</em>（详细查询：<a style="color: rgb(0,146,238); text-decoration: underline" title="杭州公交查询" target="_blank" href="http://www.edushi.com/">一</a>、<a style="color: rgb(0,146,238); text-decoration: underline" title="杭州公交查询" target="_blank" href="http://www.hzbus.com.cn/index.jsp">二</a>）
    <p style="padding-bottom: 0px; line-height: 1.4; margin: 0px; padding-left: 8px; padding-right: 0px; padding-top: 10px">K47路、70/K70路、61/K61路、K591路（公交台州路口站）</p>
    <p style="padding-bottom: 0px; line-height: 1.4; margin: 0px; padding-left: 8px; padding-right: 0px; padding-top: 10px">K635路（新昌新村）</p>
    <p style="padding-bottom: 0px; line-height: 1.4; margin: 0px; padding-left: 8px; padding-right: 0px; padding-top: 10px">634路、70/K70路、K635路、K591路（公交拱宸桥站）</p>
    <p style="padding-bottom: 0px; line-height: 1.4; margin: 0px; padding-left: 8px; padding-right: 0px; padding-top: 10px">K65路（衢州街东）</p>
    </li>
    <li style="padding-bottom: 0px; list-style-type: none; margin: 10px 0px; padding-left: 0px; padding-right: 0px; display: block; padding-top: 0px"><img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" alt="" src="http://www.d2forum.org/d2/5/assets/img/map_2d_view.png" /></li>
    <li style="padding-bottom: 0px; list-style-type: none; margin: 10px 0px; padding-left: 0px; padding-right: 0px; display: block; padding-top: 0px"><img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" alt="" src="http://www.d2forum.org/d2/5/assets/img/map_3d.png" /></li>
</ul>
<p>&nbsp;</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 43px; padding-right: 0px; background: url(http://www.d2forum.org/d2/5/assets/img/decorate.png) no-repeat 0px 0px; height: 52px; clear: both; padding-top: 0px; background-origin: initial; background-clip: initial" class="title">
<h3 style="border-bottom: rgb(174,174,174) 1px solid; padding-bottom: 0px; line-height: 44px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; height: 44px; color: rgb(22,21,21); font-size: 18px; font-weight: bold; padding-top: 0px"><span style="background-image: url(http://www.d2forum.org/d2/5/assets/img/title-text.png); position: relative; overflow-x: hidden; overflow-y: hidden; text-indent: -9999px; width: 133px; display: block; background-position: 0px -161px; height: 23px; top: 12px; background-origin: initial; background-clip: initial" class="sponsor">主办方</span></h3>
</div>
<p><section style="margin-top: 5px; padding-left: 53px; display: block; margin-bottom: 20px; float: left" class="subBody mb20"></section></p>
<ul style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="sponsorLogo">
    <li style="padding-bottom: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" target="_blank" href="http://www.taobao.com/"><img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" alt="" src="http://www.d2forum.org/d2/5/assets/img/logo_taobao.gif" /></a></li>
</ul>
<p>&nbsp;</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 43px; padding-right: 0px; background: url(http://www.d2forum.org/d2/5/assets/img/decorate.png) no-repeat 0px 0px; height: 52px; clear: both; padding-top: 0px; background-origin: initial; background-clip: initial" class="title">
<h3 style="border-bottom: rgb(174,174,174) 1px solid; padding-bottom: 0px; line-height: 44px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; height: 44px; color: rgb(22,21,21); font-size: 18px; font-weight: bold; padding-top: 0px"><span style="background-image: url(http://www.d2forum.org/d2/5/assets/img/title-text.png); position: relative; overflow-x: hidden; overflow-y: hidden; text-indent: -9999px; width: 133px; display: block; background-position: 0px -207px; height: 23px; top: 12px; background-origin: initial; background-clip: initial" class="coSponsor">协办方</span></h3>
</div>
<p><section style="margin-top: 5px; padding-left: 53px; display: block; margin-bottom: 20px; float: left" class="subBody mb20"></section></p>
<ul style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="sponsorLogo">
    <li style="padding-bottom: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" target="_blank" href="http://www.guokr.com/"><img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" alt="" src="http://www.d2forum.org/d2/5/assets/img/logo_guokr.png" /></a></li>
</ul>
<p>&nbsp;</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 43px; padding-right: 0px; background: url(http://www.d2forum.org/d2/5/assets/img/decorate.png) no-repeat 0px 0px; height: 52px; clear: both; padding-top: 0px; background-origin: initial; background-clip: initial" class="title">
<h3 style="border-bottom: rgb(174,174,174) 1px solid; padding-bottom: 0px; line-height: 44px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; height: 44px; color: rgb(22,21,21); font-size: 18px; font-weight: bold; padding-top: 0px"><span style="background-image: url(http://www.d2forum.org/d2/5/assets/img/title-text.png); position: relative; overflow-x: hidden; overflow-y: hidden; text-indent: -9999px; width: 133px; display: block; background-position: 0px -184px; height: 23px; top: 12px; background-origin: initial; background-clip: initial" class="thanks">特别致谢</span></h3>
</div>
<p><section style="margin-top: 5px; padding-left: 53px; display: block; float: left" class="subBody"></section></p>
<ul style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="thanksLogo">
    <li style="padding-bottom: 0px; list-style-type: none; margin: 0px 12px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" target="_blank" href="http://www.google.com/"><img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" alt="" src="http://www.d2forum.org/d2/5/assets/img/logo-google.png" /></a> <span class="Apple-converted-space">&nbsp;</span></li>
    <li style="padding-bottom: 0px; list-style-type: none; margin: 0px 12px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" target="_blank" href="http://www.qq.com/"><img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" alt="" src="http://www.d2forum.org/d2/5/assets/img/logo-qq.png" /></a> <span class="Apple-converted-space">&nbsp;</span></li>
    <li style="padding-bottom: 0px; list-style-type: none; margin: 0px 12px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" target="_blank" href="http://www.webex.com/"><img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" alt="" src="http://www.d2forum.org/d2/5/assets/img/logo-cisco.png" /></a> <span class="Apple-converted-space">&nbsp;</span></li>
    <li style="padding-bottom: 0px; list-style-type: none; margin: 0px 12px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" target="_blank" href="http://www.tudou.com/"><img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" alt="" src="http://www.d2forum.org/d2/5/assets/img/logo-tudou.png" /></a> <span class="Apple-converted-space">&nbsp;</span></li>
    <li style="padding-bottom: 0px; list-style-type: none; margin: 0px 12px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" target="_blank" href="http://www.csdn.net/"><img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" alt="" src="http://www.d2forum.org/d2/5/assets/img/logo-csdn.png" /></a></li>
    <li style="padding-bottom: 0px; list-style-type: none; margin: 0px 12px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" target="_blank" href="http://oreilly.com.cn/"><img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" alt="" src="http://www.d2forum.org/d2/5/assets/img/logo-oreilly.png" /></a> <span class="Apple-converted-space">&nbsp;</span></li>
    <li style="padding-bottom: 0px; list-style-type: none; margin: 0px 12px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" target="_blank" href="http://www.koubei.com/"><img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" alt="" src="http://www.d2forum.org/d2/5/assets/img/logo-koubei.png" /></a> <span class="Apple-converted-space">&nbsp;</span></li>
    <li style="padding-bottom: 0px; list-style-type: none; margin: 0px 12px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px"><a style="color: rgb(0,146,238); text-decoration: underline" target="_blank" href="http://www.turingbook.com/"><img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" alt="" src="http://www.d2forum.org/d2/5/assets/img/logo-turing.png" /></a></li>
</ul>
<p>&nbsp;</p>]]></description>
			<link>http://dev.meettea.com/show-92-1.html</link>
			<category domain="http://dev.meettea.com/category-2-1.html">前端攻城狮</category>
			<pubDate>2010-11-20 10:08</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-91-1.html</guid>
			<title>用Nginx做静态文件的CDN</title>
			<author>shiny</author>
			<description><![CDATA[<p>鉴于监管环境和网站速度之间的矛盾，目前的网络架构方式如下：1、web动态页面(含数据库)架设在位于美国西海岸的数据中心；2、静态文件，例如css、js、exe、图片存放在国内几台windows服务器上。<br />
如果你的网站是商用、盈利性的网站，而没有技术能力搭建CDN，请使用第三方CDN服务。</p>
<p>存在的问题有：1、静态文件同步问题；2、缓存刷新问题。<br />
第一个问题使用nginx得到解决。使用proxy_store功能，在文件不存在的时候请求源服务器，并保存。文件存在时直接读取本机文件。<br />
squid等方案因为再学习一个新工具需要成本；而nginx的实际使用情况并不逊色于squid等软件。所以不予考虑。这就是所谓老大拍脑袋决定方案吧。<br />
第二个问题，参考第四届D2上口碑网分享的经验：CDN上静态文件不提供删除功能。其实也未尝不可。当然也可以使用相应nginx扩展接口甚至php文件来清除缓存，也不是很复杂。</p>
<p>安装<br />
如果你的系统是linux的，可忽略第一步，看第二步：配置方式<br />
1、安装Nginx<br />
windows在生产环境安装nginx最好使用服务的方式。如果根据网上提供的instsrv.exe注册服务方案，具有若干缺陷。比如nginx.exe作为主进程启动另一个进程，而instsrv.exe只能监控一个进程。这里推荐俄罗斯人写的一款小工具NG_SRVINST<br />
地址：<a href="http://ng_srvinst.att.kiev.ua/">http://ng_srvinst.att.kiev.ua/</a><br />
使用很简单，解压到任意文件夹后，修改ng_srv.xml内Nginx的路径，比如</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">id</span><span class="tag">&gt;</span><span>nginx</span><span class="tag">&lt;/</span><span class="tag-name">id</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>nginx</span><span class="tag">&lt;/</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">description</span><span class="tag">&gt;</span><span>nginx</span><span class="tag">&lt;/</span><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">executable</span><span class="tag">&gt;</span><span>E:\nginx\nginx.exe</span><span class="tag">&lt;/</span><span class="tag-name">executable</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">logpath</span><span class="tag">&gt;</span><span>E:\wwwroot\logfiles\</span><span class="tag">&lt;/</span><span class="tag-name">logpath</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">logmode</span><span class="tag">&gt;</span><span>roll</span><span class="tag">&lt;/</span><span class="tag-name">logmode</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">depend</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">depend</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">startargument</span><span class="tag">&gt;</span><span>-p&nbsp;E:\nginx</span><span class="tag">&lt;/</span><span class="tag-name">startargument</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">stopargument</span><span class="tag">&gt;</span><span>-p&nbsp;E:\nginx&nbsp;-s&nbsp;stop</span><span class="tag">&lt;/</span><span class="tag-name">stopargument</span><span class="tag">&gt;</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">service</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>然后ng_srv.exe install就安装好了。</p>
<p>2、配置方式proxy<br />
首先修改HOSTS内的域名指向源服务器的ip，然后，见配置文件。把wucha.sg替换为你的域名即可。(或者只修改proxy_pass http://源服务器的ip; 也是可以的)</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>server&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;server_name&nbsp;&nbsp;wucha.sg; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;root&nbsp;E:/wwwroot; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;set&nbsp;$index&nbsp;</span><span class="string">'index.html'</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;set&nbsp;$store_file&nbsp;$request_filename; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;($uri&nbsp;~&nbsp;/$&nbsp;){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;set&nbsp;$store_file&nbsp;$request_filename$index; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;rewrite&nbsp;(.*)&nbsp;$1index.html&nbsp;last; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;location&nbsp;/&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;root&nbsp;</span><span class="string">&quot;E:/wwwroot&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;index&nbsp;index.html; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;proxy_store&nbsp;on; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;proxy_temp_path&nbsp;</span><span class="string">&quot;E:/wwwroot&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;proxy_set_header&nbsp;Host&nbsp;wucha.sg; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;proxy_set_header&nbsp;X-Real-IP&nbsp;$remote_addr; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(&nbsp;!-e&nbsp;$request_filename&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;proxy_pass&nbsp;http:</span><span class="comment">//wucha.sg; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>启动nginx服务，试试访问一个文件，然后看看proxy_temp_path下有没有生成文件。这一步我遇上了点问题，就是测试txt文件死活不生成。最后访问一个大于70KB的js生成了，再访问txt也生成了。<br />
要注意的是nginx服务的权限要有读写临时文件夹的权限，还有root和proxy_temp_path最好在同一个文件夹下(未考证，但是位于不同分区会导致错误。)<br />
如果你看到文件夹内一串数字，并且文件尺寸在不断在增长，那是nginx在下载文件时生成的临时文件。</p>
<p>大功告成，可以用dnspod之类的服务来做简单cdn。要发布文件，只需上传到源服务器，即能在所有做了配置的服务器上访问。</p>]]></description>
			<link>http://dev.meettea.com/show-91-1.html</link>
			<category domain="http://dev.meettea.com/category-7-1.html">运维</category>
			<pubDate>2010-11-11 21:08</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-90-1.html</guid>
			<title>PHP版本的讲解</title>
			<author>shiny</author>
			<description><![CDATA[<p>最近发现很多PHP程序员对PHP版本知识了解不是很清楚，其中不乏PHP产品主力开发人员。</p>
<p>PHP版本主要分三支：PHP4/PHP5/PHP6<br />
其中，PHP4由于太古老、对OO支持不力已基本被淘汰，就不在详述。<br />
而PHP6由于基本没有生产线上的应用，还基本只是一款概念产品，所以也不详述。</p>
<p>PHP5的版本主要分三支：PHP5.2之前的版本、PHP5.2.X和PHP5.3<br />
那我们应该如何选择适用自己项目的版本呢？<br />
PHP5.2之前的版本不值得考虑，因为某些功能缺陷或者BUG。<br />
主流PHP程序对PHP5.2.X的兼容性最好，而每次版本号的升级带来的都是安全性和稳定性的改善，所以宜挑选最新的版本。目前PHP5.2系列最新的是PHP5.2.14<br />
而如果产品是自己开发自己使用，PHP5.3在某些方面更具优势，在稳定性上更胜一筹，增加了很多PHP5.2所不具有的功能，比如内置php-fpm、更完善的垃圾回收算法、命名空间的引入、sqlite3的支持等等，是部署项目值得考虑的版本。</p>
<p>除了版本号的不同，同一版本号的PHP版本也有区别，并且在选择PHP扩展的时候需要注意。</p>
<p>VC6与VC9<br />
对于VC6还是VC9版本的选择，PHP官方网站有详细的描述<br />
原文如下<br />
Which version do I choose?<br />
If you are using PHP with Apache 1 or Apache2 from apache.org you need to use the VC6 versions of PHP<br />
If you are using PHP with IIS you should use the VC9 versions of PHP<br />
VC6 Versions are compiled with the legacy Visual Studio 6 compiler<br />
VC9 Versions are compiled with the Visual Studio 2008 compiler and have improvements in performance and stability. The VC9 versions require you to have the Microsoft 2008 C++ Runtime (x86) or the Microsoft 2008 C++ Runtime (x64) installed<br />
Do NOT use VC9 version with apache.org <font color="#ffffff">binarieshttp://dev.meettea.com</font></p>
<p>我该选择哪个版本？<br />
如果你在apache1或者apache2下使用PHP，你应该选择VC6的版本<br />
如果你在IIS下使用PHP应该选择VC9的版本<br />
VC6的版本使用visual studio6编译<br />
VC9使用Visual Studio 2008编译，并且改进了性能和稳定性。VC9版本的PHP需要你安装Microsoft 2008 C++ Runtime<br />
不要在apache下使用VC9的版本</p>
<p>TS和NTS<br />
TS指Thread Safety，即线程安全，一般在IIS以ISAPI方式加载的时候选择这个版本。<br />
NTS即None-Thread Safe，一般以fast cgi方式运行的时候选择这个版本，具有更好的性能。<br />
下面给点资料，来源于 http://koda.javaeye.com/blog/662034<br />
从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本，这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方式。如果在IIS下以CGI方式运行PHP会非常慢，这是由于CGI模式是建立在多进程的基础之上的，而非多线程。一般我们会把PHP配置成以ISAPI的方式来运行，ISAPI是多线程的方式，这样就快多了。但存在一个问题，很多常用的<a href="http://wucha.sg">PHP</a>扩展是以Linux/Unix的多进程思想来开发的，这些扩展在ISAPI的方式运行时就会出错搞垮IIS。因此在IIS下CGI模式才是 PHP运行的最安全方式，但CGI模式对于每个HTTP请求都需要重新加载和卸载整个PHP环境，其消耗是巨大的。 <br />
为了兼顾IIS下PHP的效率和安全，微软给出了FastCGI的解决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程同时执行。这样既解决了CGI进程模式消耗太大的问题，又利用上了CGI进程模式不存在线程安全问题的优势。 <br />
因此，如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本；而用FastCGI模式运行PHP的话就没有必要用线程安全检查了，用None Thread Safe(NTS，非线程安全)的版本能够更好的提高效率。</p>
<p><br />
如何查看当前运行的PHP的版本？一个很简单的办法就是phpinfo();<br />
Thread Safety disabled是NTS，enabled是TS<br />
Configure Command看到VC98字样的是VC6，Compiler标明 MSVC9 (Visual C++ 2008) 的是VC9</p>
<p>另外，顺带讲讲windows下比较简洁方便的PHP配置方法，网上教的什么复制php.ini到windows目录、复制xxxxx.dll到system32下，太丑陋了。<br />
1、下载zip版本的PHP<br />
2、下载好相应的扩展，修改好php.ini，添加模块映射<br />
<del>3、环境变量里PATH加上PHP存放的目录。只要一个就够了，/bin和/ext不需要加。</del><br />
<del>4、环境变量里定义一个PHPRC变量，内容为PHP.INI的存放路径。</del><br />
完毕。很多文章提及需要重启系统，可是从我遇上的情况来看，并无必要，最多重启web服务。</p>
<p>如果你是linux下用，就无视本文吧。<br />
修订： 2010-11-03</p>
<ol>
    <li>看了白菜(aiyooyoo.com)的修订，IIS安装php-cgi，3、4两步可以省略，ISAPI方式需要。</li>
    <li>起名叫windows下的PHP版本的讲解更合适</li>
</ol>
<p>At Last，近期思考了很多东西，若整理成文又欠缺深度和力度，还需厚积薄发。</p>
<p>&nbsp;</p>]]></description>
			<link>http://dev.meettea.com/show-90-1.html</link>
			<category domain="http://dev.meettea.com/category-8-1.html">后端那些事</category>
			<pubDate>2010-10-23 10:50</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-89-1.html</guid>
			<title>VPS服务安装与配置STEP BY STEP</title>
			<author>shiny</author>
			<description><![CDATA[<p><strong>目录</strong></p>
<p>1、前置知识<br />
2、准备工作<br />
3、安装一些库<br />
4、安装mysql<br />
5、安装PHP5.3.3<br />
6、安装PHP扩展<br />
7、安装Nginx<br />
8、安装VSFTPD<br />
10、安装memcached<br />
11、安装服务器监控服务<br />
12、coreseek的安装<br />
13、用SSH翻墙</p>
<p>&nbsp;</p>
<p><strong>一、前置知识</strong><br />
<strong>关于linux版本的挑选<br />
</strong>我主要用过三个版本：cent os/ubuntu server/gentoo<br />
cent os和ubuntu server类似，前者有便捷的yum后者有便捷的apt-get；而gentoo的emerge是下载源码后编译，虽然性能比较好但是安装较费时间，一般推荐大型网站使用。听说豆瓣用的就是gentoo。<br />
还有人用unix的BSD，用的也比较广泛。</p>
<p><strong>为什么要使用php5.3.x<br />
</strong>php5.3更省内存，主要因为：更好的垃圾回收机制、内置更完善的fpm(自php5.3.3始)、更省内存的mysqlnd引擎。<br />
更多的功能：namespace等。</p>
<p><strong>为什么不使用php5.3.x<br />
</strong>如果源码不是为php5.3定制的，很有可能出现兼容性问题(2010/8/29)。</p>
<p>如果觉得编译时间太长，需要离开，可以学习下<strong>screen</strong>的用法。 <br />
yum -y install screen</p>
<p>另外，如果不会vi，<strong>最好学会vi的使用</strong>。</p>
<p><strong>tar的使用知识</strong><br />
Linux下的压缩档格式 tar、tar.gz(或者缩写成tgz)、tar.bz2</p>
<p>.tar文件是打包但是没有对内容进行压缩<br />
用tar xvf xxx.tar来解压</p>
<p>.tar.gz文件用 tar zxvf xxx.tar.gz来解压<br />
.tar.bz2用 tar jxvf xxx.tar.bz2来解压</p>
<p><strong>make命令的使用</strong><br />
make clean可以在make失败的时候做下简单的清理，否则易出错。<br />
make uninstall则可以回滚，这样就不用在系统装得一塌糊涂的时候重装系统了。</p>
<p>几乎所有的./configure都有<strong>--prefix=</strong>目录这个选项，可以自定义软件安装的目录。但是如果一些库安装的位置太有个性，依赖于该库的软件将找不到该库而发生错误。这时就需要ln来做个&ldquo;快捷方式&rdquo;。</p>
<p><br />
<strong>二、准备工作</strong><br />
本文基于张宴的基础上，主要介绍面向开发者的VPS的使用，补充了FTP、memcached、snmpd、SSH翻墙的介绍。<br />
所谓磨刀不误砍柴工，首先要做的准备工作<br />
安装一些必要的软件</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">BSHELL代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>sudo&nbsp;-s &nbsp;&nbsp;</span></span></li>
    <li><span>LANG=C &nbsp;&nbsp;</span></li>
    <li class="alt"><span>yum&nbsp;-y&nbsp;install&nbsp;gcc&nbsp;gcc-c++&nbsp;autoconf&nbsp;libjpeg&nbsp;libjpeg-devel&nbsp;libpng&nbsp;libpng-devel&nbsp;freetype&nbsp;libevent&nbsp;libevent-devel&nbsp;freetype-devel&nbsp;libxml2&nbsp;libxml2-devel&nbsp;zlib&nbsp;zlib-devel&nbsp;pam-devel&nbsp;glibc&nbsp;glibc-devel&nbsp;glib2&nbsp;glib2-devel&nbsp;bzip2&nbsp;bzip2-devel&nbsp;ncurses&nbsp;ncurses-devel&nbsp;curl&nbsp;curl-devel&nbsp;e2fsprogs&nbsp;e2fsprogs-devel&nbsp;krb5&nbsp;krb5-devel&nbsp;libidn&nbsp;libidn-devel&nbsp;openssl&nbsp;openssl-devel&nbsp;openldap&nbsp;openldap-devel&nbsp;nss_ldap&nbsp;openldap-clients&nbsp;openldap-servers&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>如果不安装上面的软件，在下面编译的时候就会出现各种错误。搜索一下错误信息，一般就是提示哪个哪个哪个没装。</p>
<p><strong>接下来是软件的挑选<br />
</strong>nginx可以进nginx.org挑选最新版本。nginx最新版本bug影响还是比较少的。<br />
而mysql最新版甚至无法编译通过。所以选择了最新的稳定版。<br />
(<strike>tips:如果你要使用mysqli，请不要下载mysql5.1.50，可以使用mysql5.1.49。否则会提示错误：&ldquo;my_compiler.h: No such file or directory&rdquo;<br />
如果一定要用mysqli和mysql5.1.50，可以先下载mysql5.1.49，编译PHP后升级mysql</strike>) MySQL5.1.51已经修复这个BUG。<br />
php比较激进地选择了php5.3.3,默认包含了fpm的支持。如果php版本是5.3.0+但是小于php5.3.3，那么fpm的支持需要在svn下载代码后编译。<br />
如果部署的不是你亲手写的程序，你必须要向开发者了解是否支持php5.3.x，否则，建议使用兼容性更好的php5.2。因为<a href="http://wucha.sg/">http://wucha.sg/</a>是自己开发的，服务器只运行一个网站，所以本文只介绍php5.3.x的安装。<br />
下面的软件安装方法大同小异，要安装额外的扩展可以照葫芦画瓢地添加。</p>
<p>&nbsp;</p>
<div style="width: 98%; height: 306px" class="codeText">
<div class="codeHead">BSHELL代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>wget&nbsp;http://nginx.org/download/nginx-0.8.49.tar.gz &nbsp;&nbsp;</span></span></li>
    <li><span>wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.51.tar.gz/from/http://mysql.he.net/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>wget&nbsp;http://cn2.php.net/get/php-5.3.3.tar.bz2/from/www.php.net/mirror &nbsp;&nbsp;</span></li>
    <li><span>wget&nbsp;http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz &nbsp;&nbsp;</span></li>
    <li class="alt"><span>wget&nbsp;</span><span class="string">&quot;http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&amp;big_mirror=0&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li><span>wget&nbsp;</span><span class="string">&quot;http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz?modtime=1194463373&amp;big_mirror=0&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>wget&nbsp;</span><span class="string">&quot;http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz?modtime=1175740843&amp;big_mirror=0&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li><span>wget&nbsp;ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.10.tar.gz &nbsp;&nbsp;</span></li>
    <li class="alt"><span>wget&nbsp;http://sourceforge.net/projects/imagemagick/files/ImageMagick/00-6.6.5/ImageMagick-6.6.5-7.tar.bz2/download &nbsp;&nbsp;</span></li>
    <li><span>wget&nbsp;http://pecl.php.net/get/imagick-3.0.0.tgz &nbsp;&nbsp;</span></li>
    <li class="alt"><span>wget&nbsp;http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
<strong>三、安装一些库</strong></p>
<p><strong>libiconv</strong></p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>tar&nbsp;zxvf&nbsp;libiconv-1.13.1.tar.gz &nbsp;&nbsp;</span></span></li>
    <li><span>cd&nbsp;libiconv-1.13.1/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>./configure&nbsp;--prefix=/usr/local &nbsp;&nbsp;</span></li>
    <li><span>make &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make&nbsp;install &nbsp;&nbsp;</span></li>
    <li><span>cd&nbsp;../&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
libmcrypt</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>tar&nbsp;zxvf&nbsp;libmcrypt-2.5.8.tar.gz&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>cd&nbsp;libmcrypt-2.5.8/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>./configure &nbsp;&nbsp;</span></li>
    <li><span>make &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make&nbsp;install &nbsp;&nbsp;</span></li>
    <li><span>/sbin/ldconfig &nbsp;&nbsp;</span></li>
    <li class="alt"><span>cd&nbsp;libltdl/ &nbsp;&nbsp;</span></li>
    <li><span>./configure&nbsp;--enable-ltdl-install &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make &nbsp;&nbsp;</span></li>
    <li><span>make&nbsp;install &nbsp;&nbsp;</span></li>
    <li class="alt"><span>cd&nbsp;../../&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
<strong>mhash</strong></p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>tar&nbsp;zxvf&nbsp;mhash-0.9.9.9.tar.gz &nbsp;&nbsp;</span></span></li>
    <li><span>cd&nbsp;mhash-0.9.9.9/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>./configure &nbsp;&nbsp;</span></li>
    <li><span>make &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make&nbsp;install &nbsp;&nbsp;</span></li>
    <li><span>cd&nbsp;../&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>链接地址，以防程序找不到库</p>
<div class="codeText">
<div class="codeHead">Java代码</div>
<ol class="dp-j">
    <li class="alt"><span><span>ln&nbsp;-s&nbsp;/usr/local/lib/libmcrypt.la&nbsp;/usr/lib/libmcrypt.la &nbsp;&nbsp;</span></span></li>
    <li><span>ln&nbsp;-s&nbsp;/usr/local/lib/libmcrypt.so&nbsp;/usr/lib/libmcrypt.so &nbsp;&nbsp;</span></li>
    <li class="alt"><span>ln&nbsp;-s&nbsp;/usr/local/lib/libmcrypt.so.</span><span class="number">4</span><span>&nbsp;/usr/lib/libmcrypt.so.</span><span class="number">4</span><span>&nbsp;&nbsp;</span></li>
    <li><span>ln&nbsp;-s&nbsp;/usr/local/lib/libmcrypt.so.</span><span class="number">4.4</span><span>.</span><span class="number">8</span><span>&nbsp;/usr/lib/libmcrypt.so.</span><span class="number">4.4</span><span>.</span><span class="number">8</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ln&nbsp;-s&nbsp;/usr/local/lib/libmhash.a&nbsp;/usr/lib/libmhash.a &nbsp;&nbsp;</span></li>
    <li><span>ln&nbsp;-s&nbsp;/usr/local/lib/libmhash.la&nbsp;/usr/lib/libmhash.la &nbsp;&nbsp;</span></li>
    <li class="alt"><span>ln&nbsp;-s&nbsp;/usr/local/lib/libmhash.so&nbsp;/usr/lib/libmhash.so &nbsp;&nbsp;</span></li>
    <li><span>ln&nbsp;-s&nbsp;/usr/local/lib/libmhash.so.</span><span class="number">2</span><span>&nbsp;/usr/lib/libmhash.so.</span><span class="number">2</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ln&nbsp;-s&nbsp;/usr/local/lib/libmhash.so.</span><span class="number">2.0</span><span>.</span><span class="number">1</span><span>&nbsp;/usr/lib/libmhash.so.</span><span class="number">2.0</span><span>.</span><span class="number">1</span><span>&nbsp;&nbsp;</span></li>
    <li><span>ln&nbsp;-s&nbsp;/usr/local/bin/libmcrypt-config&nbsp;/usr/bin/libmcrypt-config &nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
mcrypt</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>tar&nbsp;zxvf&nbsp;mcrypt-2.6.8.tar.gz &nbsp;&nbsp;</span></span></li>
    <li><span>cd&nbsp;mcrypt-2.6.8/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>/sbin/ldconfig &nbsp;&nbsp;</span></li>
    <li><span>./configure &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make &nbsp;&nbsp;</span></li>
    <li><span>make&nbsp;install &nbsp;&nbsp;</span></li>
    <li class="alt"><span>cd&nbsp;../&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
<strong>四、安装Mysql</strong></p>
<p><br />
添加mysql组和用户</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>/usr/sbin/groupadd&nbsp;mysql &nbsp;&nbsp;</span></span></li>
    <li><span>/usr/sbin/useradd&nbsp;-g&nbsp;mysql&nbsp;mysql&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>解压</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>tar&nbsp;zxvf&nbsp;mysql-5.1.51.tar.gz &nbsp;&nbsp;</span></span></li>
    <li><span>cd&nbsp;mysql-5.1.51&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>./configure&nbsp;&nbsp;--prefix=/usr/local/mysql&nbsp;--enable-assembler&nbsp;--with-extra-charsets=complex&nbsp;--enable-thread-safe-client&nbsp;--with-big-tables&nbsp;--with-readline&nbsp;--with-ssl&nbsp;--with-embedded-server&nbsp;--enable-local-infile&nbsp;--with-plugins=partition,innobase,myisammrg &nbsp;&nbsp;</span></li>
    <li><span>make&nbsp;&amp;&amp;&nbsp;make&nbsp;install&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>设置权限</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="func">chmod</span><span>&nbsp;+w&nbsp;/usr/local/mysql &nbsp;&nbsp;</span></span></li>
    <li><span class="func">chown</span><span>&nbsp;-R&nbsp;mysql:mysql&nbsp;/usr/local/mysql&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>创建mysql使用目录</p>
<div class="codeText">
<div class="codeHead">Java代码</div>
<ol class="dp-j">
    <li class="alt"><span><span>mkdir&nbsp;-p&nbsp;/data/mysql/data/ &nbsp;&nbsp;</span></span></li>
    <li><span>mkdir&nbsp;-p&nbsp;/data/mysql/binlog/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>mkdir&nbsp;-p&nbsp;/data/mysql/relaylog/ &nbsp;&nbsp;</span></li>
    <li><span>chown&nbsp;-R&nbsp;mysql:mysql&nbsp;/data/mysql/&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>初始化mysql库</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>/usr/local/mysql/bin/mysql_install_db&nbsp;--basedir=/usr/local/mysql&nbsp;--datadir=/data/mysql/data&nbsp;--user=mysql &nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>编辑mysql的配置</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>vi&nbsp;/data/mysql/my.cnf&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>配置文件正文</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>[client] &nbsp;&nbsp;</span></span></li>
    <li><span>character-set-server&nbsp;=&nbsp;utf8 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>port&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;3306 &nbsp;&nbsp;</span></li>
    <li><span>socket&nbsp;&nbsp;=&nbsp;/tmp/mysql.sock &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>[mysqld] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>character-set-server&nbsp;=&nbsp;utf8 &nbsp;&nbsp;</span></li>
    <li><span>replicate-ignore-db&nbsp;=&nbsp;mysql &nbsp;&nbsp;</span></li>
    <li class="alt"><span>replicate-ignore-db&nbsp;=&nbsp;test &nbsp;&nbsp;</span></li>
    <li><span>replicate-ignore-db&nbsp;=&nbsp;information_schema &nbsp;&nbsp;</span></li>
    <li class="alt"><span>user&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;mysql &nbsp;&nbsp;</span></li>
    <li><span>port&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;3306 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>socket&nbsp;&nbsp;=&nbsp;/tmp/mysql.sock &nbsp;&nbsp;</span></li>
    <li><span>basedir&nbsp;=&nbsp;/usr/local/mysql &nbsp;&nbsp;</span></li>
    <li class="alt"><span>datadir&nbsp;=&nbsp;/data/mysql/data &nbsp;&nbsp;</span></li>
    <li><span>log-error&nbsp;=&nbsp;/data/mysql/mysql_error.log &nbsp;&nbsp;</span></li>
    <li class="alt"><span>pid-file&nbsp;=&nbsp;/data/mysql/mysql.pid &nbsp;&nbsp;</span></li>
    <li><span>open_files_limit&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;10240 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>back_log&nbsp;=&nbsp;600 &nbsp;&nbsp;</span></li>
    <li><span>max_connections&nbsp;=&nbsp;5000 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>max_connect_errors&nbsp;=&nbsp;6000 &nbsp;&nbsp;</span></li>
    <li><span>table_cache&nbsp;=&nbsp;614 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>external-locking&nbsp;=&nbsp;FALSE &nbsp;&nbsp;</span></li>
    <li><span>max_allowed_packet&nbsp;=&nbsp;32M &nbsp;&nbsp;</span></li>
    <li class="alt"><span>sort_buffer_size&nbsp;=&nbsp;1M &nbsp;&nbsp;</span></li>
    <li><span>join_buffer_size&nbsp;=&nbsp;1M &nbsp;&nbsp;</span></li>
    <li class="alt"><span>thread_cache_size&nbsp;=&nbsp;300 &nbsp;&nbsp;</span></li>
    <li><span>#thread_concurrency&nbsp;=&nbsp;8 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>query_cache_size&nbsp;=&nbsp;512M &nbsp;&nbsp;</span></li>
    <li><span>query_cache_limit&nbsp;=&nbsp;2M &nbsp;&nbsp;</span></li>
    <li class="alt"><span>query_cache_min_res_unit&nbsp;=&nbsp;2k &nbsp;&nbsp;</span></li>
    <li><span class="keyword">default</span><span>-storage-engine&nbsp;=&nbsp;MyISAM &nbsp;&nbsp;</span></li>
    <li class="alt"><span>thread_stack&nbsp;=&nbsp;192K &nbsp;&nbsp;</span></li>
    <li><span>transaction_isolation&nbsp;=&nbsp;READ-COMMITTED &nbsp;&nbsp;</span></li>
    <li class="alt"><span>tmp_table_size&nbsp;=&nbsp;246M &nbsp;&nbsp;</span></li>
    <li><span>max_heap_table_size&nbsp;=&nbsp;246M &nbsp;&nbsp;</span></li>
    <li class="alt"><span>long_query_time&nbsp;=&nbsp;3 &nbsp;&nbsp;</span></li>
    <li><span>log-slave-updates &nbsp;&nbsp;</span></li>
    <li class="alt"><span>log-bin&nbsp;=&nbsp;/data/mysql/binlog/binlog &nbsp;&nbsp;</span></li>
    <li><span>binlog_cache_size&nbsp;=&nbsp;4M &nbsp;&nbsp;</span></li>
    <li class="alt"><span>binlog_format&nbsp;=&nbsp;MIXED &nbsp;&nbsp;</span></li>
    <li><span>max_binlog_cache_size&nbsp;=&nbsp;8M &nbsp;&nbsp;</span></li>
    <li class="alt"><span>max_binlog_size&nbsp;=&nbsp;1G &nbsp;&nbsp;</span></li>
    <li><span>relay-log-index&nbsp;=&nbsp;/data/mysql/relaylog/relaylog &nbsp;&nbsp;</span></li>
    <li class="alt"><span>relay-log-info-file&nbsp;=&nbsp;/data/mysql/relaylog/relaylog &nbsp;&nbsp;</span></li>
    <li><span>relay-log&nbsp;=&nbsp;/data/mysql/relaylog/relaylog &nbsp;&nbsp;</span></li>
    <li class="alt"><span>expire_logs_days&nbsp;=&nbsp;30 &nbsp;&nbsp;</span></li>
    <li><span>key_buffer_size&nbsp;=&nbsp;256M &nbsp;&nbsp;</span></li>
    <li class="alt"><span>read_buffer_size&nbsp;=&nbsp;1M &nbsp;&nbsp;</span></li>
    <li><span>read_rnd_buffer_size&nbsp;=&nbsp;16M &nbsp;&nbsp;</span></li>
    <li class="alt"><span>bulk_insert_buffer_size&nbsp;=&nbsp;64M &nbsp;&nbsp;</span></li>
    <li><span>myisam_sort_buffer_size&nbsp;=&nbsp;128M &nbsp;&nbsp;</span></li>
    <li class="alt"><span>myisam_max_sort_file_size&nbsp;=&nbsp;10G &nbsp;&nbsp;</span></li>
    <li><span>myisam_repair_threads&nbsp;=&nbsp;1 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>myisam_recover &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>interactive_timeout&nbsp;=&nbsp;120 &nbsp;&nbsp;</span></li>
    <li><span>wait_timeout&nbsp;=&nbsp;120 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>skip-name-resolve &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#master-connect-retry&nbsp;=&nbsp;10 &nbsp;&nbsp;</span></li>
    <li><span>slave-skip-errors&nbsp;=&nbsp;1032,1062,126,1114,1146,1048,1396 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>#master-host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;192.168.1.2 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#master-user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;username &nbsp;&nbsp;</span></li>
    <li><span>#master-password&nbsp;=&nbsp;&nbsp;&nbsp;password &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#master-port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;3306 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>server-id&nbsp;=&nbsp;1 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>innodb_additional_mem_pool_size&nbsp;=&nbsp;16M &nbsp;&nbsp;</span></li>
    <li><span>innodb_buffer_pool_size&nbsp;=&nbsp;512M &nbsp;&nbsp;</span></li>
    <li class="alt"><span>innodb_data_file_path&nbsp;=&nbsp;ibdata1:256M:autoextend &nbsp;&nbsp;</span></li>
    <li><span>innodb_file_io_threads&nbsp;=&nbsp;4 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>innodb_thread_concurrency&nbsp;=&nbsp;8 &nbsp;&nbsp;</span></li>
    <li><span>innodb_flush_log_at_trx_commit&nbsp;=&nbsp;2 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>innodb_log_buffer_size&nbsp;=&nbsp;16M &nbsp;&nbsp;</span></li>
    <li><span>innodb_log_file_size&nbsp;=&nbsp;128M &nbsp;&nbsp;</span></li>
    <li class="alt"><span>innodb_log_files_in_group&nbsp;=&nbsp;3 &nbsp;&nbsp;</span></li>
    <li><span>innodb_max_dirty_pages_pct&nbsp;=&nbsp;90 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>innodb_lock_wait_timeout&nbsp;=&nbsp;120 &nbsp;&nbsp;</span></li>
    <li><span>innodb_file_per_table&nbsp;=&nbsp;0 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>#log-slow-queries&nbsp;=&nbsp;/data/mysql/slow.log &nbsp;&nbsp;</span></li>
    <li class="alt"><span>#long_query_time&nbsp;=&nbsp;10 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>[mysqldump] &nbsp;&nbsp;</span></li>
    <li><span>quick &nbsp;&nbsp;</span></li>
    <li class="alt"><span>max_allowed_packet&nbsp;=&nbsp;32M &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
上面的参数可以根据服务器的状况调整。</p>
<p>添加mysql操作的脚本</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>vi&nbsp;/data/mysql/mysql&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">Java代码</div>
<ol class="dp-j">
    <li class="alt"><span><span>#!/bin/sh &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>mysql_port=</span><span class="number">3306</span><span>&nbsp;&nbsp;</span></li>
    <li><span>mysql_username=</span><span class="string">&quot;admin&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>mysql_password=</span><span class="string">&quot;12345678&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>function_start_mysql() &nbsp;&nbsp;</span></li>
    <li><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;</span><span class="string">&quot;Starting&nbsp;MySQL...\n&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;/bin/sh&nbsp;/usr/local/mysql/bin/mysqld_safe&nbsp;--defaults-file=/data/mysql/my.cnf&nbsp;</span><span class="number">2</span><span>&gt;</span><span class="number">1</span><span>&nbsp;&gt;&nbsp;/dev/</span><span class="keyword">null</span><span>&nbsp;&amp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>function_stop_mysql() &nbsp;&nbsp;</span></li>
    <li><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;</span><span class="string">&quot;Stoping&nbsp;MySQL...\n&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/mysql/bin/mysqladmin&nbsp;-u&nbsp;${mysql_username}&nbsp;-p${mysql_password}&nbsp;-S&nbsp;/tmp/mysql.sock&nbsp;shutdown &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>function_restart_mysql() &nbsp;&nbsp;</span></li>
    <li><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;</span><span class="string">&quot;Restarting&nbsp;MySQL...\n&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;function_stop_mysql &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;sleep&nbsp;</span><span class="number">5</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;function_start_mysql &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>function_kill_mysql() &nbsp;&nbsp;</span></li>
    <li><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;kill&nbsp;-</span><span class="number">9</span><span>&nbsp;$(ps&nbsp;-ef&nbsp;</span><span class="number">124</span><span>;&nbsp;grep&nbsp;</span><span class="string">'bin/mysqld_safe'</span><span>&nbsp;</span><span class="number">124</span><span>;&nbsp;grep&nbsp;${mysql_port}&nbsp;</span><span class="number">124</span><span>;&nbsp;awk&nbsp;</span><span class="string">'{printf&nbsp;$2}'</span><span>) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;kill&nbsp;-</span><span class="number">9</span><span>&nbsp;$(ps&nbsp;-ef&nbsp;</span><span class="number">124</span><span>;&nbsp;grep&nbsp;</span><span class="string">'libexec/mysqld'</span><span>&nbsp;</span><span class="number">124</span><span>;&nbsp;grep&nbsp;${mysql_port}&nbsp;</span><span class="number">124</span><span>;&nbsp;awk&nbsp;</span><span class="string">'{printf&nbsp;$2}'</span><span>) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">if</span><span>&nbsp;[&nbsp;</span><span class="string">&quot;$1&quot;</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;start&quot;</span><span>&nbsp;];&nbsp;then &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;function_start_mysql &nbsp;&nbsp;</span></li>
    <li class="alt"><span>elif&nbsp;[&nbsp;</span><span class="string">&quot;$1&quot;</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;stop&quot;</span><span>&nbsp;];&nbsp;then &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;function_stop_mysql &nbsp;&nbsp;</span></li>
    <li class="alt"><span>elif&nbsp;[&nbsp;</span><span class="string">&quot;$1&quot;</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;restart&quot;</span><span>&nbsp;];&nbsp;then &nbsp;&nbsp;</span></li>
    <li><span>function_restart_mysql &nbsp;&nbsp;</span></li>
    <li class="alt"><span>elif&nbsp;[&nbsp;</span><span class="string">&quot;$1&quot;</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;kill&quot;</span><span>&nbsp;];&nbsp;then &nbsp;&nbsp;</span></li>
    <li><span>function_kill_mysql &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;</span><span class="string">&quot;Usage:&nbsp;/data/mysql/mysql&nbsp;{start|stop|restart|kill}\n&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>fi &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>添加执行权限</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="func">chmod</span><span>&nbsp;+x&nbsp;/data/mysql/mysql&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>启动mysql</p>
<div class="codeText">
<div class="codeHead">Java代码</div>
<ol class="dp-j">
    <li class="alt"><span><span>/data/mysql/mysql&nbsp;start&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>小提示<br />
用 netstat -an ，检查3306端口没有启动。<br />
如果没有启动，可以&nbsp;</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>vi&nbsp;/data/mysql/mysql_error.log&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>查看出错的原因，一般是配置有问题</p>
<p>&nbsp;</p>
<p>通过命令行登录管理MySQL服务器（提示输入密码时直接回车）：</p>
<div class="codeText">
<div class="codeHead">Java代码</div>
<ol class="dp-j">
    <li class="alt"><span><span>/usr/local/mysql/bin/mysql&nbsp;-u&nbsp;root&nbsp;-p&nbsp;-S&nbsp;/tmp/mysql.sock&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
添加一个用户</p>
<div class="codeText">
<div class="codeHead">SQL代码</div>
<ol class="dp-sql">
    <li class="alt"><span><span class="keyword">GRANT</span><span>&nbsp;</span><span class="op">ALL</span><span>&nbsp;</span><span class="keyword">PRIVILEGES</span><span>&nbsp;</span><span class="keyword">ON</span><span>&nbsp;*.*&nbsp;</span><span class="keyword">TO</span><span>&nbsp;</span><span class="string">'admin'</span><span>@</span><span class="string">'localhost'</span><span>&nbsp;IDENTIFIED&nbsp;</span><span class="keyword">BY</span><span>&nbsp;</span><span class="string">'12345678'</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">GRANT</span><span>&nbsp;</span><span class="op">ALL</span><span>&nbsp;</span><span class="keyword">PRIVILEGES</span><span>&nbsp;</span><span class="keyword">ON</span><span>&nbsp;*.*&nbsp;</span><span class="keyword">TO</span><span>&nbsp;</span><span class="string">'admin'</span><span>@</span><span class="string">'127.0.0.1'</span><span>&nbsp;IDENTIFIED&nbsp;</span><span class="keyword">BY</span><span>&nbsp;</span><span class="string">'12345678'</span><span>;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p><strong>MYSQL安装完成。</strong></p>
<p><br />
<strong>五、安装PHP5.3.3</strong></p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>tar&nbsp;jxvf&nbsp;php-5.3.3.tar.bz2 &nbsp;&nbsp;</span></span></li>
    <li><span>/usr/sbin/useradd&nbsp;www&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>mkdir&nbsp;-p&nbsp;/data/htdocs &nbsp;&nbsp;</span></li>
    <li><span>cd&nbsp;php-5.3.3 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>./configure&nbsp;--prefix=/usr/local/php&nbsp;--with-config-file-path=/etc/php&nbsp;--with-mysql=/usr/local/mysql&nbsp;--with-iconv-dir=/usr/local&nbsp;--with-freetype-dir&nbsp;--with-jpeg-dir&nbsp;--with-png-dir&nbsp;--with-zlib&nbsp;--with-libxml-dir=/usr&nbsp;--enable-xml&nbsp;--disable-rpath&nbsp;--enable-safe-mode&nbsp;--enable-bcmath&nbsp;--enable-shmop&nbsp;--enable-sysvsem&nbsp;--enable-inline-optimization&nbsp;--with-curl&nbsp;--with-curlwrappers&nbsp;--enable-mbregex&nbsp;--enable-fpm&nbsp;--enable-mbstring&nbsp;--with-mcrypt&nbsp;--with-gd&nbsp;--enable-gd-native-ttf&nbsp;--with-openssl&nbsp;--with-mhash&nbsp;--enable-pcntl&nbsp;--enable-sockets&nbsp;--with-ldap&nbsp;--with-ldap-sasl&nbsp;--with-xmlrpc&nbsp;--enable-zip&nbsp;--enable-soap &nbsp;&nbsp;</span></li>
    <li><span>make&nbsp;ZEND_EXTRA_LIBS=</span><span class="string">'-liconv'</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
(tips:如果只写make则会提示undefined reference to libiconv)</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>make&nbsp;install&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>配置php.ini</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li><span>mkdir&nbsp;/etc/php &nbsp;&nbsp;</span></li>
    <li class="alt"><span>cp&nbsp;php.ini-production&nbsp;/etc/php/php.ini &nbsp;&nbsp;</span></li>
    <li><span>vi&nbsp;/etc/php/php.ini&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>修改扩展的目录</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>extension_dir&nbsp;=&nbsp;</span><span class="string">&quot;/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/&quot;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>杜绝nginx下的php解析任意文件的漏洞</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>cgi.fix_pathinfo=0&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>然后创建php-fpm的配置文件<br />
这个配置文件已经是ini格式而不是xml格式了</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>mv&nbsp;/usr/local/php/etc/php-fpm.conf.default&nbsp;/usr/local/php/etc/php-fpm.conf&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>user=www &nbsp;&nbsp;</span></span></li>
    <li><span>group=www &nbsp;&nbsp;</span></li>
    <li class="alt"><span>pm.min_spare_servers=3 &nbsp;&nbsp;</span></li>
    <li><span>pm.max_spare_servers=35 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>pm.max_children=35&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>ulimit&nbsp;-SHn&nbsp;65535 &nbsp;&nbsp;</span></span></li>
    <li><span>/usr/local/php/sbin/php-fpm&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
这里的php-fpm和旧版有所不同<font color="#ff0000">(后面附带了操作php-fpm的脚本)</font></p>
<p>&nbsp;</p>
<p><br />
<strong>六、安装PHP扩展</strong><br />
php扩展的安装方式和步骤都差不多，要装啥扩展自己挑，自己进php.net下载。<br />
这里把我要安装的写下来</p>
<p>ImageMagick是一个强大的图像操作软件</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>tar&nbsp;jxvf&nbsp;ImageMagick-6.6.3-9.tar.bz2 &nbsp;&nbsp;</span></span></li>
    <li><span>cd&nbsp;ImageMagick-6.6.3-9 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>./configure &nbsp;&nbsp;</span></li>
    <li><span>make &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make&nbsp;install &nbsp;&nbsp;</span></li>
    <li><span>cd&nbsp;.. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>tar&nbsp;zxvf&nbsp;imagick-3.0.0.tgz &nbsp;&nbsp;</span></li>
    <li><span>cd&nbsp;imagick-3.0.0 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>/usr/local/php/bin/phpize &nbsp;&nbsp;</span></li>
    <li><span>./configure&nbsp;--with-php-config=/usr/local/php/bin/php-config &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make &nbsp;&nbsp;</span></li>
    <li><span>make&nbsp;install &nbsp;&nbsp;</span></li>
    <li class="alt"><span>cd&nbsp;..&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
在php.ini里添加</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>extension&nbsp;=&nbsp;</span><span class="string">&quot;imagick.so&quot;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
安装MYSQL PDO&nbsp;</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>tar&nbsp;zxvf&nbsp;PDO_MYSQL-1.0.2.tgz &nbsp;&nbsp;</span></span></li>
    <li><span>cd&nbsp;PDO_MYSQL-1.0.2/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>/usr/local/php/bin/phpize &nbsp;&nbsp;</span></li>
    <li><span>./configure&nbsp;--</span><span class="keyword">with</span><span>-php-config=/usr/local/php/bin/php-config&nbsp;--</span><span class="keyword">with</span><span>-pdo-mysql=/usr/local/mysql &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make &nbsp;&nbsp;</span></li>
    <li><span>make&nbsp;install &nbsp;&nbsp;</span></li>
    <li class="alt"><span>cd&nbsp;..&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
在php.ini里添加</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>extension&nbsp;=&nbsp;</span><span class="string">&quot;pdo_mysql.so&quot;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
安装APC<br />
你也可以选择xcache。至于ea么，很多函数都没法启用，所以不建议选择。</p>
<p>因为APC的稳定版本不能适用PHP5.3，所以下载最新beta版</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>wget&nbsp;http://pecl.php.net/get/APC-3.1.4.tgz &nbsp;&nbsp;</span></span></li>
    <li><span>tar&nbsp;zxvf&nbsp;APC-3.1.4.tgz &nbsp;&nbsp;</span></li>
    <li class="alt"><span>cd&nbsp;APC-3.1.4&nbsp;</span></li>
    <li><span>/usr/local/php/bin/phpize &nbsp;&nbsp;</span></li>
    <li class="alt"><span>./configure&nbsp;--with-php-config=/usr/local/php/bin/php-config &nbsp;&nbsp;</span></li>
    <li><span>make &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make&nbsp;install&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>修改下php.ini，加载就可以了</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>extension=apc.so &nbsp;&nbsp;</span></span></li>
    <li><span>[APC]&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>apc.enabled&nbsp;=&nbsp;1&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>apc.shm_segments&nbsp;=&nbsp;1&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>apc.shm_size&nbsp;=&nbsp;64M &nbsp;&nbsp;</span></li>
    <li><span>apc.max_file_size&nbsp;=&nbsp;10M&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>apc.stat=1&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>如果安装的是xcache</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>wget&nbsp;http://xcache.lighttpd.net/pub/Releases/1.3.0/xcache-1.3.0.tar.gz &nbsp;&nbsp;</span></span></li>
    <li><span>tar&nbsp;zxvf&nbsp;xcache-1.3.0.tar.gz &nbsp;&nbsp;</span></li>
    <li class="alt"><span>cd&nbsp;xcache-1.3.0 &nbsp;&nbsp;</span></li>
    <li><span>/usr/local/php/bin/phpize &nbsp;&nbsp;</span></li>
    <li class="alt"><span>./configure&nbsp;--with-php-config=/usr/local/php/bin/php-config &nbsp;&nbsp;</span></li>
    <li><span>make &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make&nbsp;install&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>然后修改下php.ini。<br />
这个配置呢请下载后看xcache-zh-gb2312.ini里面的说明，简体中文，很详细了。</p>
<p>&nbsp;</p>
<p><br />
七、安装Nginx</p>
<p>安装Nginx所需的pcre库：</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>tar&nbsp;zxvf&nbsp;pcre-8.10.tar.gz &nbsp;&nbsp;</span></span></li>
    <li><span>cd&nbsp;pcre-8.10/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>./configure &nbsp;&nbsp;</span></li>
    <li><span>make&nbsp;&amp;&amp;&nbsp;make&nbsp;install &nbsp;&nbsp;</span></li>
    <li class="alt"><span>cd&nbsp;../&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
安装Nginx</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>tar&nbsp;zxvf&nbsp;nginx-0.8.49.tar.gz &nbsp;&nbsp;</span></span></li>
    <li><span>cd&nbsp;nginx-0.8.49/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>./configure&nbsp;--user=www&nbsp;--group=www&nbsp;--prefix=/usr/local/nginx&nbsp;--with-http_stub_status_module&nbsp;--with-http_ssl_module&nbsp;&nbsp;</span></li>
    <li><span>make &amp;&amp; make install</span></li>
</ol>
</div>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>mkdir&nbsp;-p&nbsp;/data/logs &nbsp;&nbsp;</span></span></li>
    <li><span>chmod&nbsp;+w&nbsp;/data/logs &nbsp;&nbsp;</span></li>
    <li class="alt"><span>chown&nbsp;-R&nbsp;www:www&nbsp;/data/logs&nbsp;&nbsp;</span></li>
</ol>
</div>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li><span>chmod&nbsp;+w&nbsp;/data/htdocs &nbsp;&nbsp;</span></li>
    <li class="alt"><span>chown&nbsp;-R&nbsp;www:www&nbsp;/data/htdocs&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
修改nginx的配置文件</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>vi&nbsp;/usr/local/nginx/conf/nginx.conf&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>我的是这样的</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>user&nbsp;&nbsp;www&nbsp;www; &nbsp;&nbsp;</span></span></li>
    <li><span>worker_processes&nbsp;&nbsp;1; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span class="func">error_log</span><span>&nbsp;&nbsp;/data/logs/nginx_error.log&nbsp;crit; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>pid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/nginx/nginx.pid; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>worker_rlimit_nofile&nbsp;65535; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>events&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">use</span><span>&nbsp;epoll; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;worker_connections&nbsp;65535; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>http&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">include</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mime.types; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;default_type&nbsp;&nbsp;application/octet-stream; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;server_names_hash_bucket_size&nbsp;128; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;client_header_buffer_size&nbsp;32k; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;large_client_header_buffers&nbsp;4&nbsp;32k; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;client_max_body_size&nbsp;8m; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;sendfile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;tcp_nopush&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;keepalive_timeout&nbsp;&nbsp;65; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;tcp_nodelay&nbsp;on; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;fastcgi_connect_timeout&nbsp;300; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;fastcgi_send_timeout&nbsp;300; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;fastcgi_read_timeout&nbsp;300; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;fastcgi_buffer_size&nbsp;64k; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;fastcgi_buffers&nbsp;4&nbsp;64k; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;fastcgi_busy_buffers_size&nbsp;128k; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;fastcgi_temp_file_write_size&nbsp;128k; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;gzip&nbsp;on; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;gzip_min_length&nbsp;&nbsp;1k; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;gzip_buffers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;16k; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;gzip_http_version&nbsp;1.0; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;gzip_comp_level&nbsp;2; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;gzip_types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text/plain&nbsp;application/x-javascript&nbsp;text/css&nbsp;application/xml; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;gzip_vary&nbsp;on; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;server&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;80; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location&nbsp;/&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;/data/htdocs/</span><span class="vars">$host</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;&nbsp;index.html&nbsp;index.htm&nbsp;index.php; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error_page&nbsp;&nbsp;&nbsp;500&nbsp;502&nbsp;503&nbsp;504&nbsp;&nbsp;/50x.html; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location&nbsp;=&nbsp;/50x.html&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;/data/htdocs/</span><span class="vars">$host</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location&nbsp;~&nbsp;.*\.(php)?$&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/data/htdocs/</span><span class="vars">$host</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fastcgi_pass&nbsp;&nbsp;&nbsp;127.0.0.1:9000; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fastcgi_index&nbsp;&nbsp;index.php; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">include</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fastcgi_params; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log_format&nbsp;&nbsp;access&nbsp;&nbsp;</span><span class="string">'$remote_addr&nbsp;-&nbsp;$remote_user&nbsp;[$time_local]&nbsp;&quot;$request&quot;&nbsp;'</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'$status&nbsp;$body_bytes_sent&nbsp;&quot;$http_referer&quot;&nbsp;'</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'&quot;$http_user_agent&quot;&nbsp;$http_x_forwarded_for'</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;access_log&nbsp;&nbsp;/data/logs/access.log&nbsp;&nbsp;access; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>然后在fastcgi_params加上</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>fastcgi_param&nbsp;&nbsp;SCRIPT_FILENAME&nbsp;&nbsp;&nbsp;&nbsp;$document_root$fastcgi_script_name;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>启动nginx</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>/usr/local/nginx/sbin/nginx&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
设置开机自启动，你可以视情况修改</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>vi&nbsp;/etc/rc.local&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>内容添加</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>ulimit&nbsp;-SHn&nbsp;65535 &nbsp;&nbsp;</span></span></li>
    <li><span>/usr/local/php/sbin/php-fpm&nbsp;start &nbsp;&nbsp;</span></li>
    <li class="alt"><span>/usr/local/nginx/sbin/nginx &nbsp;&nbsp;</span></li>
    <li><span>/data/mysql/mysql&nbsp;start&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p><strong>八、安装ftp的支持</strong><br />
vsftpd就不编译了，反正也就自己用用，不做专业FTP服务器。<br />
安装后的效果是只要在mysql里添加一条数据，并在指定文件夹内添加帐号限定的目录就可以登录ftp了。</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>yum&nbsp;-y&nbsp;install&nbsp;vsftpd&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
修改配置文件为</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>anonymous_enable=NO &nbsp;&nbsp;</span></span></li>
    <li><span>anon_root=/var/ftp/pub &nbsp;&nbsp;</span></li>
    <li class="alt"><span>anon_max_rate=10000000 &nbsp;&nbsp;</span></li>
    <li><span>local_enable=YES &nbsp;&nbsp;</span></li>
    <li class="alt"><span>write_enable=YES &nbsp;&nbsp;</span></li>
    <li><span>local_umask=077 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>dirmessage_enable=YES &nbsp;&nbsp;</span></li>
    <li><span>xferlog_enable=YES &nbsp;&nbsp;</span></li>
    <li class="alt"><span>pasv_enable=YES &nbsp;&nbsp;</span></li>
    <li><span>pasv_min_port=50000 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>pasv_max_port=60000 &nbsp;&nbsp;</span></li>
    <li><span>xferlog_file=/var/log/vsftpd.log &nbsp;&nbsp;</span></li>
    <li class="alt"><span>xferlog_std_format=YES &nbsp;&nbsp;</span></li>
    <li><span>idle_session_timeout=600 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>data_connection_timeout=120 &nbsp;&nbsp;</span></li>
    <li><span>accept_timeout=60 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>connect_timeout=60 &nbsp;&nbsp;</span></li>
    <li><span>ftpd_banner=WuCha&nbsp;FTP&nbsp;Service &nbsp;&nbsp;</span></li>
    <li class="alt"><span>chroot_local_user=YES &nbsp;&nbsp;</span></li>
    <li><span>max_clients=100 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>max_per_ip=3 &nbsp;&nbsp;</span></li>
    <li><span>guest_enable=YES &nbsp;&nbsp;</span></li>
    <li class="alt"><span>guest_username=www &nbsp;&nbsp;</span></li>
    <li><span>pam_service_name=vsftpd &nbsp;&nbsp;</span></li>
    <li class="alt"><span>userlist_enable=YES &nbsp;&nbsp;</span></li>
    <li><span>user_config_dir=/etc/vsftpd/users &nbsp;&nbsp;</span></li>
    <li class="alt"><span>virtual_use_local_privs=YES &nbsp;&nbsp;</span></li>
    <li><span>listen=YES &nbsp;&nbsp;</span></li>
    <li class="alt"><span>tcp_wrappers=YES &nbsp;&nbsp;</span></li>
    <li><span>use_localtime=YES &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>vi&nbsp;/etc/pams.d/vsftpd&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>内容</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>auth&nbsp;required&nbsp;/lib/security/pam_mysql.so&nbsp;user=admin&nbsp;passwd=12345678&nbsp;host=localhost&nbsp;db=vsftpd&nbsp;table=users&nbsp;usercolumn=name&nbsp;passwdcolumn=passwd&nbsp;crypt=0 &nbsp;&nbsp;</span></span></li>
    <li><span>account&nbsp;required&nbsp;/lib/security/pam_mysql.so&nbsp;user=admin&nbsp;passwd=12345678&nbsp;host=localhost&nbsp;db=vsftpd&nbsp;table=users&nbsp;usercolumn=name&nbsp;passwdcolumn=passwd&nbsp;crypt=0 &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>安装pam_mysql</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>wget&nbsp;http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz &nbsp;&nbsp;</span></span></li>
    <li><span>tar&nbsp;zxvf&nbsp;pam_mysql-0.7RC1.tar.gz &nbsp;&nbsp;</span></li>
    <li class="alt"><span>cd&nbsp;pam_mysql-0.7RC1 &nbsp;&nbsp;</span></li>
    <li><span>./configure&nbsp;--with-mysql=/usr/local/mysql&nbsp;</span></li>
    <li class="alt"><span>make&nbsp;&amp;&amp;&nbsp;make&nbsp;install&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
初始化vsftpd在mysql里的结构</p>
<div class="codeText">
<div class="codeHead">SQL代码</div>
<ol class="dp-sql">
    <li class="alt"><span><span>mysql&nbsp;-uroot&nbsp;-p&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
新建一个数据库，名叫vsftpd<br />
(不要问我语句是啥，我是用phpmyadmin建的。你要在mysql里用SQL语句创建自己去Google.)</p>
<p>然后执行</p>
<div class="codeText">
<div class="codeHead">SQL代码</div>
<ol class="dp-sql">
    <li class="alt"><span><span>use&nbsp;vsftpd; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">SET</span><span>&nbsp;SQL_MODE=</span><span class="string">&quot;NO_AUTO_VALUE_ON_ZERO&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">CREATE</span><span>&nbsp;</span><span class="keyword">TABLE</span><span>&nbsp;IF&nbsp;</span><span class="op">NOT</span><span>&nbsp;EXISTS&nbsp;`users`&nbsp;( &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;`</span><span class="keyword">name</span><span>`&nbsp;</span><span class="keyword">char</span><span>(20)&nbsp;</span><span class="keyword">CHARACTER</span><span>&nbsp;</span><span class="keyword">SET</span><span>&nbsp;utf8&nbsp;</span><span class="keyword">COLLATE</span><span>&nbsp;utf8_bin&nbsp;</span><span class="keyword">DEFAULT</span><span>&nbsp;</span><span class="op">NULL</span><span>, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;`passwd`&nbsp;</span><span class="keyword">char</span><span>(20)&nbsp;</span><span class="keyword">CHARACTER</span><span>&nbsp;</span><span class="keyword">SET</span><span>&nbsp;utf8&nbsp;</span><span class="keyword">COLLATE</span><span>&nbsp;utf8_bin&nbsp;</span><span class="keyword">DEFAULT</span><span>&nbsp;</span><span class="op">NULL</span><span>&nbsp;&nbsp;</span></li>
    <li><span>)&nbsp;ENGINE=MyISAM&nbsp;</span><span class="keyword">DEFAULT</span><span>&nbsp;CHARSET=utf8;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>增加一个用户</p>
<div class="codeText">
<div class="codeHead">SQL代码</div>
<ol class="dp-sql">
    <li class="alt"><span><span class="keyword">INSERT</span><span>&nbsp;</span><span class="keyword">INTO</span><span>&nbsp;`users`&nbsp;(`</span><span class="keyword">name</span><span>`,&nbsp;`passwd`)&nbsp;</span><span class="keyword">VALUES</span><span>&nbsp;(</span><span class="string">'shiny'</span><span>,&nbsp;</span><span class="string">'123'</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>限定用户使用的目录</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>mkdir&nbsp;/etc/vsftpd/users &nbsp;&nbsp;</span></span></li>
    <li><span><span>cd&nbsp;/etc/vsftpd/users &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>vi&nbsp;shiny&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>输入内容</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>local_root=/data/htdocs/&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>启动ftp</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>service&nbsp;vsftpd&nbsp;start&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>然后你就可以ftp连接了，用户名shiny，密码123</p>
<p>&nbsp;</p>
<p><strong>九、安装memcached</strong></p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>wget&nbsp;http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz</span></span></li>
    <li class="alt"><span><span>tar zxvf memcached-1.4.5.tar.gz</span></span></li>
    <li class="alt"><span><span>cd memcached-1.4.5</span></span></li>
    <li><span>./configure&nbsp;--prefix=/usr/local/memcached &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make &nbsp;&nbsp;</span></li>
    <li><span>make&nbsp;install</span></li>
    <li><span>cd ..</span></li>
</ol>
</div>
<p>然后在 /etc/rc.local添加开机启动项</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>/usr/local/memcached/bin/memcached&nbsp;-u&nbsp;www&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>&nbsp;</p>
<p><strong>十、安装服务器监控服务</strong></p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>wget&nbsp;http://downloads.sourceforge.net/project/net-snmp/net-snmp/5.5/net-snmp-5.5.tar.gz?</span><span class="attribute">r</span><span>=</span><span class="attribute-value">http</span><span>%3A%2F%2Fsourceforge.net%2Fprojects%2Fnet-snmp%2Ffiles%2Fnet-snmp%2F5.5%2F</span><span class="attribute">ts</span><span>=</span><span class="attribute-value">1283062319</span><span class="attribute">use_mirror</span><span>=</span><span class="attribute-value">ncu</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>tar&nbsp;zxvf&nbsp;net-snmp-5.5.tar.gz</span></li>
    <li><span>cd <span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="font-family: 'Courier New', monospace; font-size: 12px" class="Apple-style-span">net-snmp-5.5</span></span></span></li>
    <li class="alt"><span>./configure&nbsp;</span><span class="attribute">--prefix</span><span>=/usr/local/snmp&nbsp;</span><span class="attribute">--with-openssl</span><span>=/usr/&nbsp;</span><span class="attribute">--with-mib-modules</span><span>=</span><span class="attribute-value">ucd</span><span>-snmp/diskio &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>--with-mib-modules=ucd-snmp/diskio选项是为了支持磁盘的监控<br />
然后一路回车</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>make &nbsp;&nbsp;</span></span></li>
    <li><span>make&nbsp;install&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
然后<br />
创建一个帐号</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>/usr/local/snmp/bin/net-snmp-create-v3-user&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>注意不要使用过于简单的密码，否则帐号添加失败。<br />
然后就可以在监控宝里添加服务器了。</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>vi&nbsp;/etc/rc.local&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
然后添加</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>/usr/local/snmp/sbin/snmpd&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>这样就可以开机自启动</p>
<p><br />
<strong>十一、安装coreseek</strong><br />
coreseek是一款基于Sphinx、支持中文的开源检索引擎，支持TB级的全文数据索引。<br />
安装可以参考这篇文档<a href="http://www.coreseek.cn/products-install/install_on_bsd_linux/">http://www.coreseek.cn/products-install/install_on_bsd_linux/</a></p>
<p>安装必要的环境</p>
<div class="codeText">
<div class="codeHead">ASP/Visual Basic代码</div>
<ol class="dp-vb">
    <li class="alt"><span><span>yum&nbsp;-y&nbsp;install&nbsp;g++&nbsp;libtool&nbsp;automake&nbsp;imake&nbsp;mysql-devel&nbsp;expat-devel &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>wget&nbsp;http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.13.tar.gz &nbsp;&nbsp;</span></li>
    <li><span>tar&nbsp;xzvf&nbsp;coreseek-3.2.13.tar.gz &nbsp;&nbsp;</span></li>
    <li class="alt"><span>cd&nbsp;coreseek-3.2.13 &nbsp;&nbsp;</span></li>
    <li><span>cd&nbsp;mmseg-3.2.13 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>./bootstrap &nbsp;&nbsp;</span></li>
    <li><span>./configure&nbsp;--prefix=/usr/local/mmseg3 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make &nbsp;&nbsp;</span></li>
    <li><span>make&nbsp;install &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>cd&nbsp;../csft-3.2.13 &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>修改 configure 文件，把 #define USE_LIBICONV 0 最后的数值由1改为0 (这是为了防止报iconv的错，编码转换可以由PHP来做)</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>./configure&nbsp;</span><span class="attribute">--prefix</span><span>=/usr/local/coreseek&nbsp;--with-mmseg&nbsp;</span><span class="attribute">--with-mmseg-includes</span><span>=/usr/local/mmseg3/include/mmseg/&nbsp;</span><span class="attribute">--with-mmseg-libs</span><span>=/usr/local/mmseg3/lib/ &nbsp;&nbsp;</span></span></li>
    <li><span>make &nbsp;&nbsp;</span></li>
    <li class="alt"><span>make&nbsp;install &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>cd&nbsp;../testpack &nbsp;&nbsp;</span></li>
    <li><span>ln&nbsp;-s&nbsp;/usr/local/mysql/lib/mysql/libmysqlclient.so.16&nbsp;/lib64/libmysqlclient.so.16 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>/usr/local/coreseek/bin/indexer&nbsp;-c&nbsp;etc/csft.conf &nbsp;&nbsp;</span></li>
    <li><span>/usr/local/coreseek/bin/indexer&nbsp;-c&nbsp;etc/csft.conf&nbsp;--all &nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
可以看到工作正常了<br />
/usr/local/coreseek/bin/searchd -c etc/csft.conf 以该配置文件开启服务<br />
/usr/local/coreseek/bin/searchd -c etc/csft.conf --stop 停止服务</p>
<p>还可以配置mysql数据源，这个就再看官方的文档吧。</p>
<p>&nbsp;</p>
<p><strong>十二、用SSH翻墙</strong><br />
语句<br />
useradd -M -s /sbin/nologin 用户名<br />
然后passwd 用户名<br />
输入密码<br />
就可以用mr zhang商业版、ssh tunnel之类拿来连接，并且无法用putty登录，有较好的安全性。<br />
但是需要注意的是用不要泄露，否则有人拿来P2P后就有可能收到投诉信，一般VPS提供商会封你VPS。</p>
<p>&nbsp;</p>
<p><strong>附录1：php的 ./configure选项</strong></p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span>Usage:&nbsp;configure&nbsp;[options]&nbsp;[host] &nbsp;&nbsp;</span></span></li>
    <li><span>Options:&nbsp;[defaults&nbsp;in&nbsp;brackets&nbsp;after&nbsp;descriptions] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>Configuration: &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--cache-file=FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache&nbsp;test&nbsp;results&nbsp;in&nbsp;FILE &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;this&nbsp;message &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--no-create&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">do</span><span>&nbsp;not&nbsp;create&nbsp;output&nbsp;files &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--quiet,&nbsp;--silent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">do</span><span>&nbsp;not&nbsp;print&nbsp;`checking...</span><span class="string">'&nbsp;messages </span>&nbsp;</li>
    <li><span><span class="string">&nbsp;&nbsp;--version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;the&nbsp;version&nbsp;of&nbsp;autoconf&nbsp;that&nbsp;created&nbsp;configure </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">Directory&nbsp;and&nbsp;file&nbsp;names: </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--prefix=PREFIX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install&nbsp;architecture-independent&nbsp;files&nbsp;in&nbsp;PREFIX </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[/usr/local] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--exec-prefix=EPREFIX&nbsp;&nbsp;&nbsp;install&nbsp;architecture-dependent&nbsp;files&nbsp;in&nbsp;EPREFIX </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[same&nbsp;as&nbsp;prefix] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--bindir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;executables&nbsp;in&nbsp;DIR&nbsp;[EPREFIX/bin] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--sbindir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system&nbsp;admin&nbsp;executables&nbsp;in&nbsp;DIR&nbsp;[EPREFIX/sbin] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--libexecdir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;program&nbsp;executables&nbsp;in&nbsp;DIR&nbsp;[EPREFIX/libexec] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--datadir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read-only&nbsp;architecture-independent&nbsp;data&nbsp;in&nbsp;DIR </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[PREFIX/share] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--sysconfdir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read-only&nbsp;single-machine&nbsp;data&nbsp;in&nbsp;DIR&nbsp;[PREFIX/etc] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--sharedstatedir=DIR&nbsp;&nbsp;&nbsp;&nbsp;modifiable&nbsp;architecture-independent&nbsp;data&nbsp;in&nbsp;DIR </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[PREFIX/com] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--localstatedir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modifiable&nbsp;single-machine&nbsp;data&nbsp;in&nbsp;DIR&nbsp;[PREFIX/var] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--libdir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;object&nbsp;code&nbsp;libraries&nbsp;in&nbsp;DIR&nbsp;[EPREFIX/lib] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--includedir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C&nbsp;header&nbsp;files&nbsp;in&nbsp;DIR&nbsp;[PREFIX/include] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--oldincludedir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C&nbsp;header&nbsp;files&nbsp;for&nbsp;non-gcc&nbsp;in&nbsp;DIR&nbsp;[/usr/include] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--infodir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;documentation&nbsp;in&nbsp;DIR&nbsp;[PREFIX/info] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--mandir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;man&nbsp;documentation&nbsp;in&nbsp;DIR&nbsp;[PREFIX/man] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--srcdir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find&nbsp;the&nbsp;sources&nbsp;in&nbsp;DIR&nbsp;[configure&nbsp;dir&nbsp;or&nbsp;..] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--program-prefix=PREFIX&nbsp;prepend&nbsp;PREFIX&nbsp;to&nbsp;installed&nbsp;program&nbsp;names </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--program-suffix=SUFFIX&nbsp;append&nbsp;SUFFIX&nbsp;to&nbsp;installed&nbsp;program&nbsp;names </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--program-transform-name=PROGRAM </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run&nbsp;sed&nbsp;PROGRAM&nbsp;on&nbsp;installed&nbsp;program&nbsp;names </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">Host&nbsp;type: </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--build=BUILD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;configure&nbsp;for&nbsp;building&nbsp;on&nbsp;BUILD&nbsp;[BUILD=HOST] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--host=HOST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;configure&nbsp;for&nbsp;HOST&nbsp;[guessed] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--target=TARGET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;configure&nbsp;for&nbsp;TARGET&nbsp;[TARGET=HOST] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">Features&nbsp;and&nbsp;packages: </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--disable-FEATURE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;not&nbsp;include&nbsp;FEATURE&nbsp;(same&nbsp;as&nbsp;--enable-FEATURE=no) </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--enable-FEATURE[=ARG]&nbsp;&nbsp;include&nbsp;FEATURE&nbsp;[ARG=yes] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-PACKAGE[=ARG]&nbsp;&nbsp;&nbsp;&nbsp;use&nbsp;PACKAGE&nbsp;[ARG=yes] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--without-PACKAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;not&nbsp;use&nbsp;PACKAGE&nbsp;(same&nbsp;as&nbsp;--with-PACKAGE=no) </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--x-includes=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X&nbsp;include&nbsp;files&nbsp;are&nbsp;in&nbsp;DIR </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--x-libraries=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X&nbsp;library&nbsp;files&nbsp;are&nbsp;in&nbsp;DIR </span>&nbsp;</span></li>
    <li><span><span class="string">--enable&nbsp;and&nbsp;--with&nbsp;options&nbsp;recognized: </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-libdir=NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Look&nbsp;for&nbsp;libraries&nbsp;in&nbsp;.../NAME&nbsp;rather&nbsp;than&nbsp;.../lib </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--disable-rpath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;passing&nbsp;additional&nbsp;runtime&nbsp;library </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search&nbsp;paths </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--enable-re2c-cgoto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;-g&nbsp;flag&nbsp;to&nbsp;re2c&nbsp;to&nbsp;use&nbsp;computed&nbsp;goto&nbsp;gcc&nbsp;extension </span>&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span><span class="string">SAPI&nbsp;modules: </span>&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-aolserver=DIR&nbsp;&nbsp;&nbsp;&nbsp;Specify&nbsp;path&nbsp;to&nbsp;the&nbsp;installed&nbsp;AOLserver </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-apxs[=FILE]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;shared&nbsp;Apache&nbsp;1.x&nbsp;module.&nbsp;FILE&nbsp;is&nbsp;the&nbsp;optional </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathname&nbsp;to&nbsp;the&nbsp;Apache&nbsp;apxs&nbsp;tool&nbsp;[apxs] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-apache[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;Apache&nbsp;1.x&nbsp;module.&nbsp;DIR&nbsp;is&nbsp;the&nbsp;top-level&nbsp;Apache </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;build&nbsp;directory&nbsp;[/usr/local/apache] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--enable-mod-charset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APACHE:&nbsp;Enable&nbsp;transfer&nbsp;tables&nbsp;for&nbsp;mod_charset&nbsp;(Rus&nbsp;Apache) </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-apxs2filter[=FILE]&nbsp;&nbsp;&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPERIMENTAL:&nbsp;Build&nbsp;shared&nbsp;Apache&nbsp;2.0&nbsp;Filter&nbsp;module.&nbsp;FILE&nbsp;is&nbsp;the&nbsp;optional </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathname&nbsp;to&nbsp;the&nbsp;Apache&nbsp;apxs&nbsp;tool&nbsp;[apxs] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-apxs2[=FILE]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;shared&nbsp;Apache&nbsp;2.0&nbsp;Handler&nbsp;module.&nbsp;FILE&nbsp;is&nbsp;the&nbsp;optional </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathname&nbsp;to&nbsp;the&nbsp;Apache&nbsp;apxs&nbsp;tool&nbsp;[apxs] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-apache-hooks[=FILE]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPERIMENTAL:&nbsp;Build&nbsp;shared&nbsp;Apache&nbsp;1.x&nbsp;module.&nbsp;FILE&nbsp;is&nbsp;the&nbsp;optional </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathname&nbsp;to&nbsp;the&nbsp;Apache&nbsp;apxs&nbsp;tool&nbsp;[apxs] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-apache-hooks-static[=DIR] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPERIMENTAL:&nbsp;Build&nbsp;Apache&nbsp;1.x&nbsp;module.&nbsp;DIR&nbsp;is&nbsp;the&nbsp;top-level&nbsp;Apache </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;build&nbsp;directory&nbsp;[/usr/local/apache] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--enable-mod-charset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APACHE&nbsp;(hooks):&nbsp;Enable&nbsp;transfer&nbsp;tables&nbsp;for&nbsp;mod_charset&nbsp;(Rus&nbsp;Apache) </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-caudium[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;PHP&nbsp;as&nbsp;a&nbsp;Pike&nbsp;module&nbsp;for&nbsp;use&nbsp;with&nbsp;Caudium. </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;Caudium&nbsp;server&nbsp;dir&nbsp;[/usr/local/caudium/server] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--disable-cli&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;building&nbsp;CLI&nbsp;version&nbsp;of&nbsp;PHP </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(this&nbsp;forces&nbsp;--without-pear) </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-continuity=DIR&nbsp;&nbsp;&nbsp;Build&nbsp;PHP&nbsp;as&nbsp;Continuity&nbsp;Server&nbsp;module.&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIR&nbsp;is&nbsp;path&nbsp;to&nbsp;the&nbsp;installed&nbsp;Continuity&nbsp;Server&nbsp;root </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--enable-embed[=TYPE]&nbsp;&nbsp;&nbsp;EXPERIMENTAL:&nbsp;Enable&nbsp;building&nbsp;of&nbsp;embedded&nbsp;SAPI&nbsp;library </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE&nbsp;is&nbsp;either&nbsp;'</span><span>shared</span><span class="string">'&nbsp;or&nbsp;'</span><span class="keyword">static</span><span class="string">'.&nbsp;[TYPE=shared] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--enable-fpm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPERIMENTAL:&nbsp;Enable&nbsp;building&nbsp;of&nbsp;the&nbsp;fpm&nbsp;SAPI&nbsp;executable </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-libevent-dir[=PATH]&nbsp;&nbsp;libevent&nbsp;install&nbsp;prefix,&nbsp;for&nbsp;fpm&nbsp;SAPI.&nbsp;(default:&nbsp;/usr/local) </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-fpm-user[=USER]&nbsp;&nbsp;Set&nbsp;the&nbsp;user&nbsp;for&nbsp;php-fpm&nbsp;to&nbsp;run&nbsp;as.&nbsp;(default:&nbsp;nobody) </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-fpm-group[=GRP]&nbsp;&nbsp;Set&nbsp;the&nbsp;group&nbsp;for&nbsp;php-fpm&nbsp;to&nbsp;run&nbsp;as.&nbsp;For&nbsp;a&nbsp;system&nbsp;user,&nbsp;this&nbsp; </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;should&nbsp;usually&nbsp;be&nbsp;set&nbsp;to&nbsp;match&nbsp;the&nbsp;fpm&nbsp;username&nbsp;(default:&nbsp;nobody) </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-isapi[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;PHP&nbsp;as&nbsp;an&nbsp;ISAPI&nbsp;module&nbsp;for&nbsp;use&nbsp;with&nbsp;Zeus </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-litespeed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;PHP&nbsp;as&nbsp;litespeed&nbsp;module </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-milter[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;PHP&nbsp;as&nbsp;Milter&nbsp;application </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-nsapi=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;PHP&nbsp;as&nbsp;NSAPI&nbsp;module&nbsp;for&nbsp;Netscape/iPlanet/Sun&nbsp;Webserver </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-phttpd=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;PHP&nbsp;as&nbsp;phttpd&nbsp;module </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-pi3web[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;PHP&nbsp;as&nbsp;Pi3Web&nbsp;module </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-roxen=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;PHP&nbsp;as&nbsp;a&nbsp;Pike&nbsp;module.&nbsp;DIR&nbsp;is&nbsp;the&nbsp;base&nbsp;Roxen </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;directory,&nbsp;normally&nbsp;/usr/local/roxen/server </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--enable-roxen-zts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ROXEN:&nbsp;Build&nbsp;the&nbsp;Roxen&nbsp;module&nbsp;using&nbsp;Zend&nbsp;Thread&nbsp;Safety </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-thttpd=SRCDIR&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;PHP&nbsp;as&nbsp;thttpd&nbsp;module </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-tux=MODULEDIR&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;PHP&nbsp;as&nbsp;a&nbsp;TUX&nbsp;module&nbsp;(Linux&nbsp;only) </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-webjames=SRCDIR&nbsp;&nbsp;Build&nbsp;PHP&nbsp;as&nbsp;a&nbsp;WebJames&nbsp;module&nbsp;(RISC&nbsp;OS&nbsp;only) </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--disable-cgi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;building&nbsp;CGI&nbsp;version&nbsp;of&nbsp;PHP </span>&nbsp;</span></li>
    <li><span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">General&nbsp;settings: </span>&nbsp;</span></li>
    <li><span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--enable-gcov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;GCOV&nbsp;code&nbsp;coverage&nbsp;(requires&nbsp;LTP)&nbsp;-&nbsp;FOR&nbsp;DEVELOPERS&nbsp;ONLY!! </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--enable-debug&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Compile&nbsp;with&nbsp;debugging&nbsp;symbols </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-layout=TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;how&nbsp;installed&nbsp;files&nbsp;will&nbsp;be&nbsp;laid&nbsp;out.&nbsp;&nbsp;Type&nbsp;can </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be&nbsp;either&nbsp;PHP&nbsp;or&nbsp;GNU&nbsp;[PHP] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-config-file-path=PATH </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;the&nbsp;path&nbsp;in&nbsp;which&nbsp;to&nbsp;look&nbsp;for&nbsp;php.ini&nbsp;[PREFIX/lib] </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--with-config-file-scan-dir=PATH </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;the&nbsp;path&nbsp;where&nbsp;to&nbsp;scan&nbsp;for&nbsp;configuration&nbsp;files </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;--enable-safe-mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;safe&nbsp;mode&nbsp;by&nbsp;default </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--with-exec-dir[=DIR]&nbsp;&nbsp;&nbsp;Only&nbsp;allow&nbsp;executables&nbsp;in&nbsp;DIR&nbsp;under&nbsp;safe-mode </span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[/usr/local/php/bin] </span>&nbsp;</span></li>
    <li><span><span class="string">&nbsp;&nbsp;--enable-sigchild&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;PHP'</span><span>s&nbsp;own&nbsp;SIGCHLD&nbsp;handler &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-magic-quotes&nbsp;&nbsp;&nbsp;Enable&nbsp;magic&nbsp;quotes&nbsp;by&nbsp;</span><span class="keyword">default</span><span>. &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-libgcc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;explicitly&nbsp;linking&nbsp;against&nbsp;libgcc &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-short-tags&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;the&nbsp;short-form&nbsp;&lt;?&nbsp;start&nbsp;tag&nbsp;by&nbsp;</span><span class="keyword">default</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-dmalloc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;dmalloc &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-ipv6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;IPv6&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-fd-setsize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;size&nbsp;of&nbsp;descriptor&nbsp;sets &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>Extensions: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-EXTENSION=[shared[,PATH]] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;NOTE:&nbsp;Not&nbsp;all&nbsp;extensions&nbsp;can&nbsp;be&nbsp;build&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="string">'shared'</span><span>. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;Example:&nbsp;--with-foobar=shared,/usr/local/foobar/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;Builds&nbsp;the&nbsp;foobar&nbsp;extension&nbsp;</span><span class="keyword">as</span><span>&nbsp;shared&nbsp;extension. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;foobar&nbsp;package&nbsp;install&nbsp;prefix&nbsp;is&nbsp;/usr/local/foobar/ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;--disable-all&nbsp;&nbsp;&nbsp;Disable&nbsp;all&nbsp;extensions&nbsp;which&nbsp;are&nbsp;enabled&nbsp;by&nbsp;</span><span class="keyword">default</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-regex=TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regex&nbsp;library&nbsp;type:&nbsp;system,&nbsp;php.&nbsp;[TYPE=php] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WARNING:&nbsp;Do&nbsp;NOT&nbsp;</span><span class="keyword">use</span><span>&nbsp;unless&nbsp;you&nbsp;know&nbsp;what&nbsp;you&nbsp;are&nbsp;doing! &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--disable-libxml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;LIBXML&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-libxml-dir[=DIR]&nbsp;&nbsp;&nbsp;LIBXML:&nbsp;libxml2&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-openssl[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;OpenSSL&nbsp;support&nbsp;(requires&nbsp;OpenSSL&nbsp;&gt;=&nbsp;0.9.6) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-kerberos[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OPENSSL:&nbsp;Include&nbsp;Kerberos&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-pcre-regex=DIR&nbsp;&nbsp;&nbsp;Include&nbsp;Perl&nbsp;Compatible&nbsp;Regular&nbsp;Expressions&nbsp;support. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;PCRE&nbsp;install&nbsp;prefix&nbsp;[BUNDLED] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--without-sqlite3[=DIR]&nbsp;Do&nbsp;not&nbsp;</span><span class="keyword">include</span><span>&nbsp;SQLite3&nbsp;support.&nbsp;DIR&nbsp;is&nbsp;the&nbsp;prefix&nbsp;to &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLite3&nbsp;installation&nbsp;directory. &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-zlib[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;ZLIB&nbsp;support&nbsp;(requires&nbsp;zlib&nbsp;&gt;=&nbsp;1.0.9) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-zlib-dir=&lt;DIR&gt;&nbsp;&nbsp;&nbsp;Define&nbsp;the&nbsp;location&nbsp;of&nbsp;zlib&nbsp;install&nbsp;directory &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-bcmath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;bc&nbsp;style&nbsp;precision&nbsp;math&nbsp;functions &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-bz2[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;BZip2&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-calendar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;support&nbsp;</span><span class="keyword">for</span><span>&nbsp;calendar&nbsp;conversion &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-ctype&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;ctype&nbsp;functions &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-curl[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;cURL&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-curlwrappers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXPERIMENTAL:&nbsp;Use&nbsp;cURL&nbsp;</span><span class="keyword">for</span><span>&nbsp;url&nbsp;streams &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-dba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Build&nbsp;DBA&nbsp;with&nbsp;bundled&nbsp;modules.&nbsp;To&nbsp;build&nbsp;shared&nbsp;DBA &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extension&nbsp;</span><span class="keyword">use</span><span>&nbsp;--enable-dba=shared &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-qdbm[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBA:&nbsp;QDBM&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-gdbm[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBA:&nbsp;GDBM&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-ndbm[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBA:&nbsp;NDBM&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-db4[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBA:&nbsp;Oracle&nbsp;Berkeley&nbsp;DB&nbsp;4.x&nbsp;</span><span class="keyword">or</span><span>&nbsp;5.x&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-db3[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBA:&nbsp;Oracle&nbsp;Berkeley&nbsp;DB&nbsp;3.x&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-db2[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBA:&nbsp;Oracle&nbsp;Berkeley&nbsp;DB&nbsp;2.x&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-db1[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBA:&nbsp;Oracle&nbsp;Berkeley&nbsp;DB&nbsp;1.x&nbsp;support/emulation &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-dbm[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBA:&nbsp;DBM&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--without-cdb[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBA:&nbsp;CDB&nbsp;support&nbsp;(bundled) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-inifile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBA:&nbsp;INI&nbsp;support&nbsp;(bundled) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--disable-flatfile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBA:&nbsp;FlatFile&nbsp;support&nbsp;(bundled) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-dom&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;DOM&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-libxml-dir[=DIR]&nbsp;&nbsp;&nbsp;DOM:&nbsp;libxml2&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-enchant[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;enchant&nbsp;support. &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GNU&nbsp;Aspell&nbsp;version&nbsp;1.1.3&nbsp;</span><span class="keyword">or</span><span>&nbsp;higher&nbsp;required. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-exif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;EXIF&nbsp;(metadata&nbsp;from&nbsp;images)&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--disable-fileinfo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;fileinfo&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-filter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;input&nbsp;filter&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-pcre-dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILTER:&nbsp;pcre&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-ftp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;FTP&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-openssl-dir[=DIR]&nbsp;&nbsp;FTP:&nbsp;openssl&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-gd[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;GD&nbsp;support.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;GD&nbsp;library&nbsp;base &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install&nbsp;directory&nbsp;[BUNDLED] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-jpeg-dir[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GD:&nbsp;Set&nbsp;the&nbsp;path&nbsp;to&nbsp;libjpeg&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-png-dir[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GD:&nbsp;Set&nbsp;the&nbsp;path&nbsp;to&nbsp;libpng&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-zlib-dir[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GD:&nbsp;Set&nbsp;the&nbsp;path&nbsp;to&nbsp;libz&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-xpm-dir[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GD:&nbsp;Set&nbsp;the&nbsp;path&nbsp;to&nbsp;libXpm&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-freetype-dir[=DIR]&nbsp;GD:&nbsp;Set&nbsp;the&nbsp;path&nbsp;to&nbsp;FreeType&nbsp;2&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-t1lib[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GD:&nbsp;Include&nbsp;T1lib&nbsp;support.&nbsp;T1lib&nbsp;version&nbsp;&gt;=&nbsp;5.0.0&nbsp;required &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-gd-native-ttf&nbsp;&nbsp;&nbsp;&nbsp;GD:&nbsp;Enable&nbsp;TrueType&nbsp;string&nbsp;</span><span class="keyword">function</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-gd-jis-conv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GD:&nbsp;Enable&nbsp;JIS-mapped&nbsp;Japanese&nbsp;font&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-</span><span class="func">gettext</span><span>[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;GNU&nbsp;</span><span class="func">gettext</span><span>&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-gmp[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;GNU&nbsp;MP&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-mhash[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;mhash&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--disable-hash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;hash&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--without-iconv[=DIR]&nbsp;&nbsp;&nbsp;Exclude&nbsp;iconv&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-imap[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;IMAP&nbsp;support.&nbsp;DIR&nbsp;is&nbsp;the&nbsp;c-client&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-kerberos[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMAP:&nbsp;Include&nbsp;Kerberos&nbsp;support.&nbsp;DIR&nbsp;is&nbsp;the&nbsp;Kerberos&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-imap-ssl[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMAP:&nbsp;Include&nbsp;SSL&nbsp;support.&nbsp;DIR&nbsp;is&nbsp;the&nbsp;OpenSSL&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-interbase[=DIR]&nbsp;&nbsp;Include&nbsp;InterBase&nbsp;support.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;InterBase&nbsp;base &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install&nbsp;directory&nbsp;[/usr/interbase] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-intl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;internationalization&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-icu-dir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Specify&nbsp;where&nbsp;ICU&nbsp;libraries&nbsp;</span><span class="keyword">and</span><span>&nbsp;headers&nbsp;can&nbsp;be&nbsp;found &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-json&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;JavaScript&nbsp;Object&nbsp;Serialization&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-ldap[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;LDAP&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-ldap-sasl[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;LDAP:&nbsp;Include&nbsp;Cyrus&nbsp;SASL&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-mbstring&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;multibyte&nbsp;string&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-mbregex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MBSTRING:&nbsp;Disable&nbsp;multibyte&nbsp;regex&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--disable-mbregex-backtrack &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MBSTRING:&nbsp;Disable&nbsp;multibyte&nbsp;regex&nbsp;backtrack&nbsp;check &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-libmbfl[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MBSTRING:&nbsp;Use&nbsp;external&nbsp;libmbfl.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;libmbfl&nbsp;base &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install&nbsp;directory&nbsp;[BUNDLED] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-onig[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MBSTRING:&nbsp;Use&nbsp;external&nbsp;oniguruma.&nbsp;DIR&nbsp;is&nbsp;the&nbsp;oniguruma&nbsp;install&nbsp;prefix. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;DIR&nbsp;is&nbsp;not&nbsp;set,&nbsp;the&nbsp;bundled&nbsp;oniguruma&nbsp;will&nbsp;be&nbsp;used &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-mcrypt[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;mcrypt&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-mssql[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;MSSQL-DB&nbsp;support.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;FreeTDS&nbsp;home &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;directory&nbsp;[/usr/local/freetds] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-mysql[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;MySQL&nbsp;support.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;MySQL&nbsp;base &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;directory.&nbsp;&nbsp;If&nbsp;mysqlnd&nbsp;is&nbsp;passed&nbsp;</span><span class="keyword">as</span><span>&nbsp;DIR,&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;MySQL&nbsp;native&nbsp;driver&nbsp;will&nbsp;be&nbsp;used&nbsp;[/usr/local] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-mysql-sock[=DIR]&nbsp;&nbsp;&nbsp;MySQL/MySQLi/PDO_MYSQL:&nbsp;Location&nbsp;of&nbsp;the&nbsp;MySQL&nbsp;unix&nbsp;socket&nbsp;pointer. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;unspecified,&nbsp;the&nbsp;</span><span class="keyword">default</span><span>&nbsp;locations&nbsp;are&nbsp;searched &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-zlib-dir[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MySQL:&nbsp;Set&nbsp;the&nbsp;path&nbsp;to&nbsp;libz&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-mysqli[=FILE]&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;MySQLi&nbsp;support.&nbsp;&nbsp;FILE&nbsp;is&nbsp;the&nbsp;path &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;mysql_config.&nbsp;&nbsp;If&nbsp;mysqlnd&nbsp;is&nbsp;passed&nbsp;</span><span class="keyword">as</span><span>&nbsp;FILE, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;MySQL&nbsp;native&nbsp;driver&nbsp;will&nbsp;be&nbsp;used&nbsp;[mysql_config] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-embedded-mysqli&nbsp;&nbsp;MYSQLi:&nbsp;Enable&nbsp;embedded&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Note:&nbsp;Does&nbsp;not&nbsp;work&nbsp;with&nbsp;MySQL&nbsp;native&nbsp;driver! &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-oci8[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;Oracle&nbsp;(OCI8)&nbsp;support.&nbsp;DIR&nbsp;defaults&nbsp;to&nbsp;</span><span class="vars">$ORACLE_HOME</span><span>. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Use&nbsp;--with-oci8=instantclient,/path/to/instant/client/lib&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;</span><span class="keyword">use</span><span>&nbsp;an&nbsp;Oracle&nbsp;Instant&nbsp;Client&nbsp;installation &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-adabas[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;Adabas&nbsp;D&nbsp;support&nbsp;[/usr/local] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-sapdb[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;SAP&nbsp;DB&nbsp;support&nbsp;[/usr/local] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-solid[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;Solid&nbsp;support&nbsp;[/usr/local/solid] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-ibm-db2[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;IBM&nbsp;DB2&nbsp;support&nbsp;[/home/db2inst1/sqllib] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-ODBCRouter[=DIR]&nbsp;Include&nbsp;ODBCRouter.com&nbsp;support&nbsp;[/usr] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-empress[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;Empress&nbsp;support&nbsp;[</span><span class="vars">$EMPRESSPATH</span><span>] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Empress&nbsp;Version&nbsp;&gt;=&nbsp;8.60&nbsp;required) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-empress-bcs[=DIR] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;Empress&nbsp;Local&nbsp;Access&nbsp;support&nbsp;[</span><span class="vars">$EMPRESSPATH</span><span>] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Empress&nbsp;Version&nbsp;&gt;=&nbsp;8.60&nbsp;required) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-birdstep[=DIR]&nbsp;&nbsp;&nbsp;Include&nbsp;Birdstep&nbsp;support&nbsp;[/usr/local/birdstep] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-custom-odbc[=DIR] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;user&nbsp;defined&nbsp;ODBC&nbsp;support.&nbsp;DIR&nbsp;is&nbsp;ODBC&nbsp;install&nbsp;base &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;directory&nbsp;[/usr/local].&nbsp;Make&nbsp;sure&nbsp;to&nbsp;define&nbsp;CUSTOM_ODBC_LIBS&nbsp;</span><span class="keyword">and</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;have&nbsp;some&nbsp;odbc.h&nbsp;in&nbsp;your&nbsp;</span><span class="keyword">include</span><span>&nbsp;dirs.&nbsp;f.e.&nbsp;you&nbsp;should&nbsp;define&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;following&nbsp;</span><span class="keyword">for</span><span>&nbsp;Sybase&nbsp;SQL&nbsp;Anywhere&nbsp;5.5.00&nbsp;on&nbsp;QNX,&nbsp;prior&nbsp;to &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;running&nbsp;this&nbsp;configure&nbsp;script: &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPPFLAGS=</span><span class="string">&quot;-DODBC_QNX&nbsp;-DSQLANY_BUG&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDFLAGS=-lunix &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CUSTOM_ODBC_LIBS=</span><span class="string">&quot;-ldblib&nbsp;-lodbc&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-iodbc[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;iODBC&nbsp;support&nbsp;[/usr/local] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-esoob[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;Easysoft&nbsp;OOB&nbsp;support&nbsp;[/usr/local/easysoft/oob/client] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-unixODBC[=DIR]&nbsp;&nbsp;&nbsp;Include&nbsp;unixODBC&nbsp;support&nbsp;[/usr/local] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-dbmaker[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;DBMaker&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-pcntl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;pcntl&nbsp;support&nbsp;(CLI/CGI&nbsp;only) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--disable-pdo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;PHP&nbsp;Data&nbsp;Objects&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-pdo-dblib[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;PDO:&nbsp;DBLIB-DB&nbsp;support.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;FreeTDS&nbsp;home&nbsp;directory &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-pdo-firebird[=DIR]&nbsp;PDO:&nbsp;Firebird&nbsp;support.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;Firebird&nbsp;base &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install&nbsp;directory&nbsp;[/opt/firebird] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-pdo-mysql[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;PDO:&nbsp;MySQL&nbsp;support.&nbsp;DIR&nbsp;is&nbsp;the&nbsp;MySQL&nbsp;base&nbsp;directory &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;mysqlnd&nbsp;is&nbsp;passed&nbsp;</span><span class="keyword">as</span><span>&nbsp;DIR,&nbsp;the&nbsp;MySQL&nbsp;native &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;native&nbsp;driver&nbsp;will&nbsp;be&nbsp;used&nbsp;[/usr/local] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-zlib-dir[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PDO_MySQL:&nbsp;Set&nbsp;the&nbsp;path&nbsp;to&nbsp;libz&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-pdo-oci[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PDO:&nbsp;Oracle&nbsp;OCI&nbsp;support.&nbsp;DIR&nbsp;defaults&nbsp;to&nbsp;</span><span class="vars">$ORACLE_HOME</span><span>. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Use&nbsp;--with-pdo-oci=instantclient,prefix,version&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;an&nbsp;Oracle&nbsp;Instant&nbsp;Client&nbsp;SDK.&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;Linux&nbsp;with&nbsp;10.2.0.3&nbsp;RPMs&nbsp;(</span><span class="keyword">for</span><span>&nbsp;example)&nbsp;</span><span class="keyword">use</span><span>: &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--with-pdo-oci=instantclient,/usr,10.2.0.3 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-pdo-odbc=flavour,dir &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PDO:&nbsp;Support&nbsp;</span><span class="keyword">for</span><span>&nbsp;</span><span class="string">'flavour'</span><span>&nbsp;ODBC&nbsp;driver. &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">include</span><span>&nbsp;</span><span class="keyword">and</span><span>&nbsp;lib&nbsp;dirs&nbsp;are&nbsp;looked&nbsp;</span><span class="keyword">for</span><span>&nbsp;under&nbsp;</span><span class="string">'dir'</span><span>. &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'flavour'</span><span>&nbsp;can&nbsp;be&nbsp;one&nbsp;of:&nbsp;&nbsp;ibm-db2,&nbsp;iODBC,&nbsp;unixODBC,&nbsp;generic &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;</span><span class="string">',dir'</span><span>&nbsp;part&nbsp;is&nbsp;omitted,&nbsp;</span><span class="keyword">default</span><span>&nbsp;</span><span class="keyword">for</span><span>&nbsp;the&nbsp;flavour&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;you&nbsp;have&nbsp;selected&nbsp;will&nbsp;used.&nbsp;e.g.: &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--with-pdo-odbc=unixODBC &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;will&nbsp;check&nbsp;</span><span class="keyword">for</span><span>&nbsp;unixODBC&nbsp;under&nbsp;/usr/local.&nbsp;You&nbsp;may&nbsp;attempt&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;</span><span class="keyword">use</span><span>&nbsp;an&nbsp;otherwise&nbsp;unsupported&nbsp;driver&nbsp;using&nbsp;the&nbsp;</span><span class="string">&quot;generic&quot;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flavour.&nbsp;&nbsp;The&nbsp;syntax&nbsp;</span><span class="keyword">for</span><span>&nbsp;generic&nbsp;ODBC&nbsp;support&nbsp;is: &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--with-pdo-odbc=generic,dir,libname,ldflags,cflags &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;When&nbsp;build&nbsp;</span><span class="keyword">as</span><span>&nbsp;shared&nbsp;the&nbsp;extension&nbsp;filename&nbsp;is&nbsp;always&nbsp;pdo_odbc.so &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-pdo-pgsql[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;PDO:&nbsp;PostgreSQL&nbsp;support.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;PostgreSQL&nbsp;base &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install&nbsp;directory&nbsp;</span><span class="keyword">or</span><span>&nbsp;the&nbsp;path&nbsp;to&nbsp;pg_config &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--without-pdo-sqlite[=DIR] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PDO:&nbsp;sqlite&nbsp;3&nbsp;support.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;sqlite&nbsp;base &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install&nbsp;directory&nbsp;[BUNDLED] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-pgsql[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;PostgreSQL&nbsp;support.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;PostgreSQL &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base&nbsp;install&nbsp;directory&nbsp;</span><span class="keyword">or</span><span>&nbsp;the&nbsp;path&nbsp;to&nbsp;pg_config &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-phar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;phar&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--disable-posix&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;POSIX-like&nbsp;functions &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-pspell[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;PSPELL&nbsp;support. &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GNU&nbsp;Aspell&nbsp;version&nbsp;0.50.0&nbsp;</span><span class="keyword">or</span><span>&nbsp;higher&nbsp;required &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-libedit[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;libedit&nbsp;readline&nbsp;replacement&nbsp;(CLI/CGI&nbsp;only) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-readline[=DIR]&nbsp;&nbsp;&nbsp;Include&nbsp;readline&nbsp;support&nbsp;(CLI/CGI&nbsp;only) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-recode[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;recode&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--disable-session&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;session&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-mm[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SESSION:&nbsp;Include&nbsp;mm&nbsp;support&nbsp;</span><span class="keyword">for</span><span>&nbsp;session&nbsp;storage &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-shmop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;shmop&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-simplexml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;SimpleXML&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-libxml-dir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleXML:&nbsp;libxml2&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-snmp[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;SNMP&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-openssl-dir[=DIR]&nbsp;&nbsp;SNMP:&nbsp;openssl&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-ucd-snmp-hack&nbsp;&nbsp;&nbsp;&nbsp;SNMP:&nbsp;Enable&nbsp;UCD&nbsp;SNMP&nbsp;hack &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-soap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;SOAP&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-libxml-dir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOAP:&nbsp;libxml2&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-sockets&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;sockets&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--without-sqlite=DIR&nbsp;&nbsp;&nbsp;&nbsp;Do&nbsp;not&nbsp;</span><span class="keyword">include</span><span>&nbsp;sqlite&nbsp;support.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;sqlite&nbsp;base &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install&nbsp;directory&nbsp;[BUNDLED] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-sqlite-utf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLite:&nbsp;Enable&nbsp;UTF-8&nbsp;support&nbsp;</span><span class="keyword">for</span><span>&nbsp;SQLite &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-sybase-ct[=DIR]&nbsp;&nbsp;Include&nbsp;Sybase-CT&nbsp;support.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;Sybase&nbsp;home &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;directory&nbsp;[/home/sybase] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-sysvmsg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;sysvmsg&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-sysvsem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;System&nbsp;V&nbsp;semaphore&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-sysvshm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;the&nbsp;System&nbsp;V&nbsp;shared&nbsp;memory&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-tidy[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;TIDY&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--disable-tokenizer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;tokenizer&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-wddx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;WDDX&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-libxml-dir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WDDX:&nbsp;libxml2&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-libexpat-dir=DIR&nbsp;&nbsp;&nbsp;WDDX:&nbsp;libexpat&nbsp;dir&nbsp;</span><span class="keyword">for</span><span>&nbsp;XMLRPC-EPI&nbsp;(deprecated) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--disable-xml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;XML&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-libxml-dir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XML:&nbsp;libxml2&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-libexpat-dir=DIR&nbsp;&nbsp;&nbsp;XML:&nbsp;libexpat&nbsp;install&nbsp;prefix&nbsp;(deprecated) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-xmlreader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;XMLReader&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-libxml-dir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLReader:&nbsp;libxml2&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-xmlrpc[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;XMLRPC-EPI&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-libxml-dir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLRPC-EPI:&nbsp;libxml2&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-libexpat-dir=DIR&nbsp;&nbsp;&nbsp;XMLRPC-EPI:&nbsp;libexpat&nbsp;dir&nbsp;</span><span class="keyword">for</span><span>&nbsp;XMLRPC-EPI&nbsp;(deprecated) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-iconv-dir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLRPC-EPI:&nbsp;iconv&nbsp;dir&nbsp;</span><span class="keyword">for</span><span>&nbsp;XMLRPC-EPI &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-xmlwriter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Disable&nbsp;XMLWriter&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-libxml-dir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLWriter:&nbsp;libxml2&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-xsl[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;XSL&nbsp;support.&nbsp;&nbsp;DIR&nbsp;is&nbsp;the&nbsp;libxslt&nbsp;base &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install&nbsp;directory&nbsp;(libxslt&nbsp;&gt;=&nbsp;1.1.0&nbsp;required) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-zip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Include&nbsp;Zip&nbsp;read/write&nbsp;support &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-zlib-dir[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZIP:&nbsp;Set&nbsp;the&nbsp;path&nbsp;to&nbsp;libz&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-pcre-dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZIP:&nbsp;pcre&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--disable-mysqlnd-compression-support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable&nbsp;support&nbsp;</span><span class="keyword">for</span><span>&nbsp;the&nbsp;MySQL&nbsp;compressed&nbsp;protocol&nbsp;in&nbsp;mysqlnd &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-zlib-dir[=DIR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysqlnd:&nbsp;Set&nbsp;the&nbsp;path&nbsp;to&nbsp;libz&nbsp;install&nbsp;prefix &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>PEAR: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-pear=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Install&nbsp;PEAR&nbsp;in&nbsp;DIR&nbsp;[PREFIX/lib/php] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--without-pear&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do&nbsp;not&nbsp;install&nbsp;PEAR &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Zend: &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-zend-vm=TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;virtual&nbsp;machine&nbsp;dispatch&nbsp;method.&nbsp;Type&nbsp;is &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one&nbsp;of&nbsp;CALL,&nbsp;SWITCH&nbsp;</span><span class="keyword">or</span><span>&nbsp;GOTO&nbsp;[TYPE=CALL] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-maintainer-zts&nbsp;Enable&nbsp;thread&nbsp;safety&nbsp;-&nbsp;</span><span class="keyword">for</span><span>&nbsp;code&nbsp;maintainers&nbsp;only!! &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--disable-inline-optimization&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;building&nbsp;zend_execute.lo&nbsp;fails,&nbsp;try&nbsp;this&nbsp;</span><span class="keyword">switch</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-zend-multibyte&nbsp;Compile&nbsp;with&nbsp;zend&nbsp;multibyte&nbsp;support &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>TSRM: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-tsrm-pth[=pth-config] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Use&nbsp;GNU&nbsp;Pth &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-tsrm-st&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Use&nbsp;SGI's&nbsp;State&nbsp;Threads &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-tsrm-pthreads&nbsp;&nbsp;&nbsp;&nbsp;Use&nbsp;POSIX&nbsp;threads&nbsp;(</span><span class="keyword">default</span><span>) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Libtool: &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-shared[=PKGS]&nbsp;&nbsp;build&nbsp;shared&nbsp;libraries&nbsp;[</span><span class="keyword">default</span><span>=yes] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--enable-</span><span class="keyword">static</span><span>[=PKGS]&nbsp;&nbsp;build&nbsp;</span><span class="keyword">static</span><span>&nbsp;libraries&nbsp;[</span><span class="keyword">default</span><span>=yes] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--enable-fast-install[=PKGS]&nbsp;&nbsp;optimize&nbsp;</span><span class="keyword">for</span><span>&nbsp;fast&nbsp;installation&nbsp;[</span><span class="keyword">default</span><span>=yes] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-gnu-ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assume&nbsp;the&nbsp;C&nbsp;compiler&nbsp;uses&nbsp;GNU&nbsp;ld&nbsp;[</span><span class="keyword">default</span><span>=no] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--disable-libtool-lock&nbsp;&nbsp;avoid&nbsp;locking&nbsp;(might&nbsp;</span><span class="keyword">break</span><span>&nbsp;parallel&nbsp;builds) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;--with-pic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;to&nbsp;</span><span class="keyword">use</span><span>&nbsp;only&nbsp;PIC/non-PIC&nbsp;objects&nbsp;[</span><span class="keyword">default</span><span>=</span><span class="keyword">use</span><span>&nbsp;both] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-tags[=TAGS]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">include</span><span>&nbsp;additional&nbsp;configurations&nbsp;[automatic] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;--with-gnu-ld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assume&nbsp;the&nbsp;C&nbsp;compiler&nbsp;uses&nbsp;GNU&nbsp;ld&nbsp;[</span><span class="keyword">default</span><span>=no] &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><strong>附录2：一个操作PHP-FPM的脚本</strong></p>
<p>因为php5.3.3的php-fpm是内置的，所以php/sbin/php-fpm是一个二进制文件而不是一个脚本，所以需要自己编写脚本进行载入、平滑重启等操作。</p>
<p>内容如下</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>#!&nbsp;/bin/sh&nbsp;&nbsp;</span></span></li>
    <li class="alt">&nbsp;</li>
    <li class="alt"><span><span class="attribute">PATH</span><span>=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="attribute">CMD</span><span>=/usr/local/php/sbin/php-fpm&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="attribute">PID_FILE</span><span>=/usr/local/php/var/run/php-fpm.pid&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="attribute">NAME</span><span>=</span><span class="attribute-value">php</span><span>-fpm&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="attribute">DESC</span><span>=</span><span class="attribute-value">php</span><span>-fpm&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>test&nbsp;-x&nbsp;$CMD&nbsp;||&nbsp;exit&nbsp;0&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>case&nbsp;&quot;$1&quot;&nbsp;in&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;start)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;-n&nbsp;&quot;Starting&nbsp;$DESC:&nbsp;&quot;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$CMD&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;$NAME.&quot;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;stop)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;-n&nbsp;&quot;Stopping&nbsp;$DESC:&nbsp;&quot;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#SIGQUIT平滑终止，SIGINT立即终止&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/bin/kill&nbsp;-SIGQUIT&nbsp;`cat&nbsp;$PID_FILE`&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;$NAME.&quot;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;restart|force-reload)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;-n&nbsp;&quot;Restarting&nbsp;$DESC:&nbsp;&quot;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/bin/kill&nbsp;-SIGQUIT&nbsp;`cat&nbsp;$PID_FILE`&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$CMD&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;$NAME.&quot;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;reload)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;-n&nbsp;&quot;Reloading&nbsp;$DESC&nbsp;configuration:&nbsp;&quot;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/bin/kill&nbsp;-SIGUSR2&nbsp;`cat&nbsp;$PID_FILE`&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;$NAME.&quot;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;*)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;Usage:&nbsp;$NAME&nbsp;{start|stop|restart|reload|force-reload}&quot;&nbsp;<span class="tag">&gt;</span><span>&amp;2&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;1&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;&nbsp;</span></li>
    <li class=""><span>esac&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>exit&nbsp;0&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>保存到/etc/init.d，然后用rcconf设置开机自启动即可。至于php5.3.3中php-fpm的详细控制参数，如下文：</p>
<p>&nbsp;</p>
<p>PHP5.3.3内php-fpm 不再支持 php-fpm 补丁具有的 /usr/local/php/sbin/php-fpm (start|stop|reload)等命令，需要使用信号控制：<br />
master进程可以理解以下信号<br />
SIGINT, SIGTERM 立刻终止<br />
SIGQUIT 平滑终止<br />
SIGUSR1 重新打开日志文件<br />
SIGUSR2 平滑重载所有worker进程并重新载入配置和二进制模块<br />
示例：<br />
php-fpm 关闭：<br />
kill -SIGINT `cat /usr/local/php/var/run/php-fpm.pid`<br />
php-fpm 重启：<br />
kill -SIGUSR2 `cat /usr/local/php/var/run/php-fpm.pid`</p>
<p>&nbsp;</p>
<p><strong>附录3：如何节省内存开销</strong></p>
<p>默认按此配置512MB内存的系统将会感觉运行缓慢</p>
<p>欲节省内存可按此步骤：</p>
<p>1、限制PHP-CGI进程，MAX控制在12、启动进程为2即可。</p>
<p>2、注意控制apc/ea/xcache的shm_size大小，在php-cgi下，每个进程都需要占用一份缓存；很容易导致内存不足。</p>
<p>3、编辑my.cnf，把各类缓存依情况减少，如果没有使用INNODB引擎，可取消</p>
<p>4、取消不使用的服务，如使用SFTP代替FTP，对于海外服务器实际上更稳定，并更节省内存；</p>
<p>各类有用的命令</p>
<p>vmstat 3 每隔三秒刷新系统内存使用状况</p>
<p>swapoff -a&nbsp; <span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 25px; font-family: Verdana, 宋体; font-size: 14px" class="Apple-style-span">收回Swap空间</span></span></p>
<p>swapon -a <span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 25px; font-family: Verdana, 宋体; font-size: 14px" class="Apple-style-span">激活Swap文件</span></span></p>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 25px; font-family: Verdana, 宋体; font-size: 14px" class="Apple-style-span">free -m 查看内存使用情况</span></span></p>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 25px; font-family: Verdana, 宋体; font-size: 14px" class="Apple-style-span">top 进程状况</span></span></p>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 25px; font-family: Verdana, 宋体; font-size: 14px" class="Apple-style-span">ps aux 查看进程</span></span></p>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 25px; font-family: Verdana, 宋体; font-size: 14px" class="Apple-style-span">如果SWAP占用超过30%将严重影响系统性能。</span></span></p>
<p>&nbsp;</p>
<p><strong>附录3：PHP5.3.X内的PHP-FPM设置</strong></p>
<p>&nbsp;</p>
<ol>
    <li>小于PHP5.3.3版本的php-fpm需要在svn内获取</li>
    <li>PHP5.3.3及以后的版本，默认附带php-fpm</li>
    <li>PHP5.3.3的php-fpm实现了类apache的进程管理方式，可在服务器压力大的时候动态调整PHP进程数。PHP5.2内的PHP-FPM没有实现这个功能</li>
    <li>对于小内存的VPS(指小于1G内存的服务器)，最好不要设置太大，否则压力增大时超过swap就会导致Fatal error: Allowed memory size of **** bytes exhausted (tried to allocate **** bytes)的错误，不管memory_limit设置的多大，并注意使用监控工具监控swap占用率(如监控宝)，一般超过30%就可以引起注意了</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>最后修订更新：</p>
<p>2010-9-4 感谢xing(http://www.qinhan.org/)的纠错</p>
<p>2010-9-19 增加PHP-FPM操作脚本</p>
<p>2010-10-30 更新MYSQL版本，解决PDO_MYSQL无法安装的问题；修正几个小错误。</p>
<p>2010-10-31 增加内存节省方法</p>
<p>2010-11-04 增加缓存扩展的内存节省、php-fpm的进程管理</p>]]></description>
			<link>http://dev.meettea.com/show-89-1.html</link>
			<category domain="http://dev.meettea.com/category-7-1.html">运维</category>
			<pubDate>2010-08-29 16:42</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-88-1.html</guid>
			<title>从PHP5.2.x迁移到PHP5.3.x</title>
			<author>shiny</author>
			<description><![CDATA[<p>写在前面&nbsp;</p>
<p>从PHP5.2.x迁移到PHP5.3.x，这是官方提供的<a href="http://cn.php.net/manual/en/migration53.deprecated.php">Migrating from PHP 5.2.x to PHP 5.3.x</a>的翻译。还未完成。&nbsp;文章参考了此文的翻译http://www.flyinghail.net/?p=99 在此表示感谢。</p>
<p>翻译追求表意，由于部分函数/类没有使用经验，翻译出错难免，请大家指正以修改、完善。</p>
<p>&nbsp;</p>
<p>目录</p>
<p>一、PHP 5.3.x中发生了什么变化<br />
二、向后不兼容的变化<br />
三、新功能<br />
四、Windows支持的变化<br />
五、SAPI modules中的变化<br />
六、PHP 5.3.x中不建议使用的功能<br />
七、PHP 5.3.x中去除不推荐的功能<br />
八、新参数<br />
九、新函数<br />
十、新的stream wrappers<br />
十一、新的类常量<br />
十二、新方法<br />
十三、新扩展<br />
十四、移除的扩展<br />
十五、扩展中的其他变化<br />
十六、新的类<br />
十七、新的全局常量<br />
十八、INI文件handling的变化<br />
十九、其他变化</p>
<p>&nbsp;</p>
<p>一、PHP 5.3.x中发生了什么变化<br />
PHP 5.3.x中绝大多数的改良对现有代码无影响。但是需要考虑一小部分不兼容和新功能，并且在生产环境中切换PHP版本需要做下test。<br />
从更旧的版本升级到php5.3.x，相关文档如下<br />
Upgrade Notes for PHP 5.2.x.<br />
Upgrade Notes for PHP 5.1.x.<br />
Migrating from PHP 4 to PHP 5.</p>
<p>&nbsp;</p>
<p><br />
二、向后不兼容的变化<br />
尽管绝大多数PHP5代码不需修改即可运行，但是请留意一些向后不兼容的变化：<br />
所有PHP5.3.X附带的extension使用了新的参数解析API，如果传入不兼容的参数将导致函数返回NULL。</p>
<p>有部分例外情况，例如get_class()在发生错误的时候继续返回FALSE<br />
clearstatcache()默认不再清除realpath的缓存<br />
realpath()现在完全独立于操作系统，意味着例如__FILE__ . &quot;/../x&quot;这样的无效相对路径将不能再运行。</p>
<p>call_user_func() 这一系的函数现在可以使用 $this ，含父类。<br />
array相关函数:natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip(), 和 array_unique()不再接受object类型的参数<br />
如果要使用，请先把object转换为数组。<br />
之前参数为引用的函数接受直接的值，现在则会产生一个fatal error。<br />
任何之前参数直接传常量或者字符的，需要先赋值到一个变量再调用函数。<br />
举例<br />
function test(&amp;$a) {<br />
&nbsp;&nbsp;&nbsp; echo 'OK';<br />
}<br />
test('a');<br />
PHP5.3.X中将导致一个fatal error</p>
<p><br />
新的mysqlnd函数库必须使用新的MySQL4.1的41字节的密码。使用16字节的旧密码将导致mysql_connect()和类似函数产生&quot;mysqlnd cannot connect to MySQL 4.1+ using old authentication.&quot;的错误信息。<br />
和libmysql一样，新的mysqlnd函数库不会读取mysql配置文件(my.cnf/my.ini)<br />
如果你的代码依赖于mysql的配置文件，你可以用mysqli_options()函数加载。<br />
注意，这意味着如果PDO MYSQL兼容mysqlnd则PDO::MYSQL_ATTR_READ_DEFAULT_FILE 和 PDO::MYSQL_ATTR_READ_DEFAULT_GROUP不会被defined。<br />
SplFileInfo和其他目录相关的类返回的路径字符结尾处的&quot;/&quot;将被移除。<br />
__toString魔术方法不再接受参数<br />
__get, __set, __isset, __unset, 和 __call必须使用public并且不能再定义为静态方法<br />
魔术方法__call现在能调用private和protected方法。<br />
函数内include或者require一个文件，文件内将不能使用func_get_arg(), func_get_args() 和 func_num_args()函数。<br />
以下关键词成为保留关键词，不能以其为其他函数、类命名。<br />
goto<br />
namespace</p>
<p>&nbsp;</p>
<p><br />
三、新功能<br />
PHP 5.3.0提供了大量新功能</p>
<p>增加命名空间(namespaces)的支持<br />
对迟静态绑定(Late static binding)的支持<br />
对跳转标签的支持(即有限的goto)<br />
增加对闭包Closures（Lambda/匿名函数）的支持<br />
新的魔术方法：__callStatic 和 __invoke.<br />
支持 Nowdoc 语法，类似于加上单引号的Heredoc 语法。<br />
现在可以将 Heredocs 用来初始化静态变量与类中成员和常量<br />
作为新增的Nowdoc语法的补充,现在可以使用双引号来声明。<br />
可以在类以外使用const定义常量。<br />
三元运算符现在可以使用简写 ?:<br />
现在HTTP状态200至399都被HTTP stream wrapper认为是成功的。<br />
现在能够动态访问静态方法<br />
异常处理可以嵌套使用<br />
默认开启新的垃圾回收器以解决循环引用(circular references)问题。<br />
mail()函数支持日志记录(仅记录使用这个函数发送的邮件)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>四、为支持 Windows 所做的修改</p>
<p>与windows有关的修改</p>
<p>支持的最低Windows 版本是Windows XP SP3;Windows 2000; Windows 98, ME 和 NT4 不再支持。<br />
Windows 二进制包不再支持i386 和 i486 。<br />
实验性的64位版本的PHP 。<br />
编译器支持VC++9(VS2008)<br />
同时Snapshots和releases支持VC9. 使用 VC6 编译的二进制包依旧被支持、与VC9同步发行。<br />
PDO_OCI使用Oracle 10 或 11 客户端库的 php_pdo_oci.dll取代 php_pdo_oci8.dll 库 (注意没有 &lsquo;8&prime;) 。 <br />
依然支持连接数据库的其他版本。<br />
新php_oci8_11g.dll作为php_oci8.dll 的补充。<br />
这两个库都只能开启其中一个。php_oci8.dll 使用 Oracle 10.2 客户端库。<br />
php_oci8_11g.dll 使用 Oracle 11 客户端库。</p>
<p>以下函数已经能够支持windows<br />
checkdnsrr()<br />
dns_get_record()<br />
fnmatch()<br />
getmxrr()<br />
getopt()<br />
imagecolorclosesthwb()<br />
inet_ntop()<br />
inet_pton()<br />
link()<br />
linkinfo()<br />
mcrypt_create_iv()<br />
readlink()<br />
socket_create_pair() -&nbsp; 之前这个函数能在 Windows 下用，但是因为bug被PHP4.3.0屏蔽。<br />
stream_socket_pair()<br />
symlink()<br />
time_nanosleep()<br />
time_sleep_until()<br />
Other changes:</p>
<p>其他改变:</p>
<p>改良了 stat(), touch(), filemtime(), filesize() 和其他有关函数的可移植性。<br />
现在可以在 Windows 下使用 link() 函数建立硬连接（hard links），使用 symlink() 建立符号连接（symbolic links）。<br />
硬链接用于 Windows 2000，符号连接用于 Windows Vista.<br />
Windows版PHP现在公布了一组以PHP_WINDOWS_*为前缀的新常量。<br />
有关的常量列表和用途请查阅 Predefined Constants（预定义常量）。</p>
<p>Warning<br />
警告<br />
已放弃对ISAPI模块的支持，可使用改进过的FastCGI SAPI模块代替。<br />
提示: 现已为windows上的PHP创建全新的网站， 含各版本的下载、发布候选、快照。<br />
网址:http://windows.php.net/</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>五、SAPI 模块中的改变<br />
一个名为litespeed的SAPI模块已经能够使用<br />
FastCGI现在总是开启的并不能被关闭。请查看 sapi/cgi/CHANGES 获得更多的信息。<br />
CGI SAPI增加一个新选项 -T，用于测试脚本的重复执行时间。<br />
CGI/FastCGI 现在支持.htaccess 风格的、用户定义的 php.ini文件<br />
默认禁用dl()函数，并且仅能够在CLI, CGI 和embed SAPIs中使用。</p>
<p><br />
六、PHP 5.3.x 中不建议使用的功能<br />
PHP 5.3.0 引入了两个新的错误级别:E_DEPRECATED和E_USER_DEPRECATED。<br />
E_DEPRECATED表明不建议使用的函数或功能。<br />
E_USER_DEPRECATED表明用户代码中不建议使用的功能，类似于E_USER_ERROR和E_USER_WARNING。</p>
<p>以下是不建议使用的INI选项。会导致启动时抛出E_DEPRECATED错误。<br />
define_syslog_variables<br />
register_globals<br />
register_long_arrays<br />
safe_mode<br />
magic_quotes_gpc<br />
magic_quotes_runtime<br />
magic_quotes_sybase<br />
不建议用'#'在INI文件作注释</p>
<p>不建议使用的函数:<br />
call_user_method() (使用 call_user_func() 代替)<br />
call_user_method_array() (使用 call_user_func_array() 代替)<br />
define_syslog_variables()<br />
dl()<br />
ereg() (使用preg_match() 代替)<br />
ereg_replace() (使用 preg_replace() 代替)<br />
eregi() (使用 preg_match() 结合 &lsquo;i&rsquo; 修饰符以代替)<br />
eregi_replace() (使用 preg_replace() 结合 &lsquo;i&rsquo; 修饰符以代替)<br />
set_magic_quotes_runtime() 和它的别名 magic_quotes_runtime()<br />
session_register() (使用 $_SESSION 超全局变量（superglobal）代替)<br />
session_unregister() (使用 $_SESSION 超全局变量（superglobal）代替)<br />
session_is_registered() (使用 $_SESSION 超全局变量（superglobal）代替)<br />
set_socket_blocking() (使用 stream_set_blocking() 代替)<br />
split() (使用 preg_split()代替)<br />
spliti() (使用 preg_split()以修饰符'i'代替)<br />
sql_regcase()<br />
mysql_db_query() (使用 mysql_select_db() 和 mysql_query() 代替)<br />
mysql_escape_string() (使用 mysql_real_escape_string() 代替)<br />
使用LC_*系列常量代替字符串，来设置locale category names<br />
The is_dst parameter to mktime(). Use the new timezone handling functions instead.<br />
mktime()的参数is_dst 。用新的timezone处理函数代替。</p>
<p>不建议使用的功能:<br />
不推荐将new的返回值为引用。</p>
<p>不推荐Call-time pass-by-reference 即不推荐func(&amp;$param);<br />
不推荐使用{}访问string offsets。请使用 [] 代替。</p>
<p><br />
七、PHP 5.3.x 恢复正常使用的功能<br />
由于is_a()的普遍需求，使用它不再产生 E_STRICT 错误。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>八、新的参数</p>
<p>在 PHP 5.3 中部分函数提供了新的可选参数:</p>
<p>PHP 核心:<br />
clearstatcache() &ndash; 增加了 clear_realpath_cache 和 filename .<br />
copy() &ndash; 增加数据流环境参数（stream context parameter）, context .<br />
fgetcsv() &ndash; 增加 escape .<br />
ini_get_all() &ndash; 增加 details .<br />
mail() 函数现在支持记录发送的邮件。(仅对通过该函数发送的邮件有效)<br />
nl2br() &ndash; 增加 is_xhtml .<br />
parse_ini_file() &ndash; 增加 scanner_mode .<br />
round() &ndash; 增加 mode .（PS：现在不光是四舍五入这一种形式了）<br />
stream_context_create() &ndash; 增加 params .<br />
strstr() 和 stristr() &ndash; 增加 before_needle .（PS：可以取指定字符前面的部分了）</p>
<p>json:<br />
json_encode() &ndash; 增加 options .<br />
json_decode() &ndash; 增加 depth .</p>
<p>Streams:<br />
stream_select(), stream_set_blocking(), stream_set_timeout() 和 stream_set_write_buffer() 现在可以利用用户空间的数据流封装（user-space stream wrappers）。</p>
<p>sybase_ct:<br />
sybase_connect() &ndash; 增加 new .</p>
<p><br />
PHP 5.3.0中的新方法:</p>
<p>PHP 核心:<br />
Exception::__construct() - 增加 previous.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>九、新函数</p>
<p>PHP 核心:</p>
<p>array_replace() &ndash; 替换传入的数组为一个数组。<br />
array_replace_recursive() &ndash; 递归的替换数组中的元素。<br />
class_alias() &ndash; 为用户定义的类建立一个别名。<br />
forward_static_call() &ndash; 在方法内（method context）执行用户函数。<br />
forward_static_call_array() &ndash; 在方法内（method context）执行用户函数，参数使用数组。<br />
gc_collect_cycles() &ndash; 强制收集已存在的垃圾回收数据（garbage cycles）。<br />
gc_disable() &ndash; 关闭回收引用收集器（the circular reference collector）。<br />
gc_enable() &ndash; 激活回收引用收集器（the circular reference collector）。<br />
gc_enabled() &ndash; 返回回收引用收集器（the circular reference collector）的状态。<br />
get_called_class() &ndash; 返回执行静态方法的类名。<br />
gethostname() &ndash; 返回本地服务器当前的主机名（host name）。<br />
header_remove() &ndash; 删除之前使用 header() 函数设置的 HTTP 头信息（HTTP header）。<br />
lcfirst() &ndash; 将字符串第一个字符转换成小写。<br />
parse_ini_string() &ndash; 解析配置字符串。<br />
quoted_printable_encode() &ndash; 将 8 bit 字符串转换成 quoted-printable 编码的字符串。（PS：quoted-printable 编码是 MIME 邮件中常用的编码格式）<br />
str_getcsv() &ndash; 将 CSV 字符串解析成数组。<br />
stream_context_set_default() &ndash; 设置默认的 stream context（数据流环境？或者叫数据流资源？）。<br />
stream_supports_lock() &ndash; 如果数据流支持锁则返回 TRUE。<br />
stream_context_get_params() &ndash; 从 stream context 中取回参数。<br />
streamWrapper::stream_cast() &ndash; 取回基本的 stream resource（数据流资源）。<br />
streamWrapper::stream_set_option() &ndash; 修改 stream(数据流)选项。</p>
<p>Date/Time:<br />
date_add() &ndash; 将一个 DateTime 对象增加某个数量的天、月、年、小时、分钟或者秒。<br />
date_create_from_format() &ndash; 返回给定的格式的新 DateTime 对象。<br />
date_diff() &ndash; 返回两个 DateTime 对象的差。<br />
date_get_last_errors() &ndash; 返回最近一次日期/时间操作产生的警告或者错误。<br />
date_parse_from_format() &ndash; 获得给定日期的信息。<br />
date_sub() &ndash; 将一个 DateTime 对象减去某个数量的天、月、年、小时、分钟或者秒。<br />
timezone_version_get() &ndash; 返回时区数据库（timezonedb）的版本。</p>
<p>GMP:<br />
gmp_testbit() &ndash; Tests whether a bit is set.</p>
<p>Hash:<br />
hash_copy() &ndash; Copy hashing context.</p>
<p>IMAP:<br />
imap_gc() &ndash; Clears IMAP cache.<br />
imap_utf8_to_mutf7() &ndash; Encode a UTF-8 string to modified UTF-7.<br />
imap_mutf7_to_utf8() &ndash; Decode a modified UTF-7 string to UTF-8.</p>
<p>JSON:<br />
json_last_error() &ndash; Returns the last JSON error that occurred.</p>
<p>MySQL Improved:<br />
mysqli_fetch_all() &ndash; Fetches all result rows as an associative array, a numeric array, or both.<br />
mysqli_get_connection_stats() &ndash; Returns statistics about the client connection.<br />
mysqli_poll() &ndash; Poll connections.<br />
mysqli_reap_async_query() &ndash; Get result from async query.</p>
<p>OpenSSL:<br />
openssl_random_pseudo_bytes() &ndash; Returns a string of the given length specified, filled with pseudo-random bytes.</p>
<p>PCNTL:<br />
pcntl_signal_dispatch() &ndash; Calls signal handlers for pending signals.<br />
pcntl_sigprocmask() &ndash; Sets and retrieves blocked signals.<br />
pcntl_sigtimedwait() &ndash; Wait for signals with a timeout.<br />
pcntl_sigwaitinfo() &ndash; Wait for signals.</p>
<p>PCRE:<br />
preg_filter() &ndash; Perform a regular expression search and replace, reutrning only results which matched the pattern.</p>
<p>Semaphore:<br />
msg_queue_exists() &ndash; Check whether a message queue exists.<br />
shm_has_var() &ndash; Checks whether a specific key exists inside a shared memory segment.<br />
以下函数在所有操作系统中都能运行<br />
acosh()<br />
asinh()<br />
atanh()<br />
expm1()<br />
log1p()</p>
<p><br />
十、新的 stream wrappers<br />
glob://<br />
phar://</p>
<p><br />
十一、新的类常量<br />
PDO_FIREBIRD:</p>
<p>PDO::FB_ATTR_DATE_FORMAT - 日期格式<br />
PDO::FB_ATTR_TIME_FORMAT - 时间格式<br />
PDO::FB_ATTR_TIMESTAMP_FORMAT - timestamps格式.</p>
<p>&nbsp;</p>
<p>十二、新的类方法</p>
<p>Date/Time:<br />
DateTime::add() - 在一个DateTime类型上增加指定的日、月、年、小时、分、秒<br />
DateTime::createFromFormat() - 根据指定的格式返回新DateTime<br />
DateTime::diff() - 返回两个DateTime的差<br />
DateTime::getLastErrors() - 返回最近一次date/time操作的警告或错误信息<br />
DateTime::sub() - Subtracts an amount of days, months, years, hours, minutes and seconds from a DateTime object.</p>
<p>Exception:<br />
Exception::getPrevious() - 获取上次错误信息</p>
<p>DOM:<br />
DOMNode::getLineNo() - 获取指定节点的行号</p>
<p>PDO_FIREBIRD:<br />
PDO::setAttribute() - 设置属性</p>
<p>Reflection:<br />
ReflectionClass::getNamespaceName() - 返回类的命名空间名称<br />
ReflectionClass::getShortName() - 返回类的短名(即不包含namespace部分)<br />
ReflectionClass::inNamespace() - 返回namespace中是否定义了该类<br />
ReflectionFunction::getNamespaceName() - 返回已定义该函数的namespace的名称<br />
ReflectionFunction::getShortName() - 返回函数的短名(不包含namespace部分)<br />
ReflectionFunction::inNamespace() - 返回函数是否已在namespace中定义<br />
ReflectionProperty::setAccessible() - 设置非public属性是否能被访问</p>
<p>SPL:<br />
SplObjectStorage::addAll() - Add all elements from another SplObjectStorage object.<br />
SplObjectStorage::removeAll() - Remove all elements from another SplObjectStorage object.</p>
<p>XSL:<br />
XSLTProcessor::setProfiling() - Sets the profiling output file.</p>
<p>&nbsp;</p>
<p>十三、新扩展</p>
<p>PHP 5.3.0默认已添加以下扩展</p>
<p>Enchant - An abstraction layer above various spelling libraries<br />
Fileinfo - An improved and more solid replacement, featuring full BC, for the Mimetype extension, which has been removed.<br />
INTL - Internationalization extension. INTL is a wrapper around the &raquo; ICU library.<br />
Phar - Implementation of PHP-Archive files.<br />
SQLite3 - 支持SQLite3<br />
mysqlnd is a new core library shipped with PHP. It is a PHP-specific replacement for libmysql. <br />
mysqlnd will be used to build the mysql, mysqli and PDO_MySQL extensions if libmysql isnt found on the system. <br />
It may also be used instead of libmysql even when libmysql is present. mysqlnd is recommended for all PHP installations for performance reasons.</p>
<p><br />
十四、移除的扩展<br />
以下扩展被移到PECL并不再作为PHP发行版的一部分<br />
These extensions have been moved to PECL and are no longer part of the PHP distribution. <br />
The PECL package versions of these extensions will be created according to user demand.<br />
这些扩展的PECL包版本将以用户的需要来创建</p>
<p>dbase - 不再保留<br />
fbsql - 不再保留<br />
fdf - 保留<br />
ming - 保留<br />
msql - 不再保留<br />
ncurses - 保留<br />
sybase - 不再继续，请使用sybase_ct扩展来代替<br />
mhash - 不再继续，请使用hash扩展来代替，hash完全兼容mhash;使用旧方法将能继续运行。</p>
<p>十五、扩展中的其他变化<br />
在配置时以下扩展将无法被禁用<br />
PCRE<br />
Reflection<br />
SPL</p>
<p>扩展行为的变化以及新功能<br />
Date and Time - The TZ environment variable is no longer used to guess the timezone<br />
cURL - cURL支持SSH<br />
Network - dns_check_record()返回额外的键&quot;entries&quot;, 包含域名的TXT记录.<br />
Hash - 支持SHA-224 和 salsa hash algorithms<br />
mbstring - 支持 CP850编码<br />
OCI8 - A call to oci_close() on a persistent connection, or a variable referencing a persistent connection going out of scope, <br />
will now roll back any uncommitted transaction. To avoid unexpected behavior, explicitly issue a commit or roll back as needed. <br />
The old behavior can be enabled with the INI directive oci8.old_oci_close_semantics. <br />
Database Resident Connection Pooling (DRCP) and Fast Application Notification (FAN) are now supported.<br />
Oracle External Authentication is now supported (except on Windows). <br />
The oci_bind_by_name() function now supports SQLT_AFC (aka the CHAR datatype).<br />
OpenSSL - OpenSSL digest and cipher functions are now supported. It is also now possible to access the internal values of DSA, RSA and DH keys.<br />
Session - Sessions will no longer store session-files in &quot;/tmp&quot; when open_basedir restrictions apply, unless &quot;/tmp&quot; is explicitly added to the list of allowed paths.<br />
SOAP Now supports sending user supplied HTTP headers.<br />
MySQLi 在主机名前添加&quot;p:&quot;将支持持久连接<br />
Image Processing and GD The &quot;JPG Support&quot; index returned from gd_info() has been renamed to &quot;JPEG Support&quot;.</p>
<p><br />
十六、新的类<br />
Date/Time:</p>
<p>DateInterval<br />
DatePeriod<br />
Phar:</p>
<p>Phar<br />
PharData<br />
PharException<br />
PharFileInfo<br />
SPL:</p>
<p>FilesystemIterator<br />
GlobIterator<br />
MultipleIterator<br />
RecursiveTreeIterator<br />
SplDoublyLinkedList<br />
SplFixedArray<br />
SplHeap<br />
SplMaxHeap<br />
SplMinHeap<br />
SplPriorityQueue<br />
SplQueue<br />
SplStack</p>
<p>&nbsp;</p>
<p>十七、新的全局常量</p>
<p>PHP Core:<br />
__DIR__<br />
__NAMESPACE__<br />
E_DEPRECATED<br />
E_USER_DEPRECATED<br />
INI_SCANNER_NORMAL<br />
INI_SCANNER_RAW<br />
PHP_MAXPATHLEN<br />
PHP_WINDOWS_NT_DOMAIN_CONTROLLER<br />
PHP_WINDOWS_NT_SERVER<br />
PHP_WINDOWS_NT_WORKSTATION<br />
PHP_WINDOWS_VERSION_BUILD<br />
PHP_WINDOWS_VERSION_MAJOR<br />
PHP_WINDOWS_VERSION_MINOR<br />
PHP_WINDOWS_VERSION_PLATFORM<br />
PHP_WINDOWS_VERSION_PRODUCTTYPE<br />
PHP_WINDOWS_VERSION_SP_MAJOR<br />
PHP_WINDOWS_VERSION_SP_MINOR<br />
PHP_WINDOWS_VERSION_SUITEMASK</p>
<p>cURL:<br />
CURLOPT_PROGRESSFUNCTION</p>
<p>GD:<br />
IMG_FILTER_PIXELATE</p>
<p><br />
JSON:<br />
JSON_ERROR_CTRL_CHAR<br />
JSON_ERROR_DEPTH<br />
JSON_ERROR_NONE<br />
JSON_ERROR_STATE_MISMATCH<br />
JSON_ERROR_SYNTAX<br />
JSON_FORCE_OBJECT<br />
JSON_HEX_TAG<br />
JSON_HEX_AMP<br />
JSON_HEX_APOS<br />
JSON_HEX_QUOT</p>
<p>LDAP:<br />
LDAP_OPT_NETWORK_TIMEOUT</p>
<p>libxml:<br />
LIBXML_LOADED_VERSION</p>
<p>PCRE:<br />
PREG_BAD_UTF8_OFFSET_ERROR</p>
<p>PCNTL:<br />
BUS_ADRALN<br />
BUS_ADRERR<br />
BUS_OBJERR<br />
CLD_CONTIUNED<br />
CLD_DUMPED<br />
CLD_EXITED<br />
CLD_KILLED<br />
CLD_STOPPED<br />
CLD_TRAPPED<br />
FPE_FLTDIV<br />
FPE_FLTINV<br />
FPE_FLTOVF<br />
FPE_FLTRES<br />
FPE_FLTSUB<br />
FPE_FLTUND<br />
FPE_INTDIV<br />
FPE_INTOVF<br />
ILL_BADSTK<br />
ILL_COPROC<br />
ILL_ILLADR<br />
ILL_ILLOPC<br />
ILL_ILLOPN<br />
ILL_ILLTRP<br />
ILL_PRVOPC<br />
ILL_PRVREG<br />
POLL_ERR<br />
POLL_HUP<br />
POLL_IN<br />
POLL_MSG<br />
POLL_OUT<br />
POLL_PRI<br />
SEGV_ACCERR<br />
SEGV_MAPERR<br />
SI_ASYNCIO<br />
SI_KERNEL<br />
SI_MESGQ<br />
SI_NOINFO<br />
SI_QUEUE<br />
SI_SIGIO<br />
SI_TIMER<br />
SI_TKILL<br />
SI_USER<br />
SIG_BLOCK<br />
SIG_SETMASK<br />
SIG_UNBLOCK<br />
TRAP_BRKPT<br />
TRAP_TRACE</p>
<p><br />
十八、INI文件处理的变化<br />
PHP 5.3.0显著改进了INI文件解析的性能，并且添加若干新语法功能<br />
The standard php.ini files have been re-organized and renamed. php.ini-development contains settings recommded for use in development environments. php.ini-production contains settings recommended for use in production environments.<br />
There is now support for two special sections: [PATH=/opt/httpd/www.example.com/] and [HOST=www.example.com]. Directives set in these sections cannot be overridden by user-defined INI files or at runtime. More information about these sections can be found here.<br />
zend_extension_debug and zend_extension_ts have been removed. Use the zend_extension directive to load all Zend Extensions.<br />
zend.ze1_compatibility_mode has been removed. If this INI directive is set to On, an E_ERROR error is emitted at startup.<br />
It is now possible to use the full path to load modules using the &quot;extension&quot; directive.<br />
&quot;ini-variables&quot; can now be used almost anywhere in a php.ini file.<br />
Runtime tightening of open_basedir restrictions is now possible.<br />
It is now possible to use alphanumeric or variable indices in INI option arrays.<br />
get_cfg_var() is now able to return &quot;array&quot; INI options.<br />
A new directive, mail.add_x_header, has been added.<br />
user_ini.filename is new<br />
user_ini.cache_ttl is also new<br />
exit_on_timeout is new too<br />
open_basedir is now PHP_INI_ALL<br />
The following new ini directives have been added:</p>
<p>user_ini.filename and user_ini.cache_ttl for the new .htaccess-style user INI file mechanism.<br />
Added mbstring.http_output_conv_mimetype. This directive specifies the regex pattern of content types for which mb_output_handler() is activated.<br />
Added request_order. Allows controlling which external variables will be available in $_REQUEST.<br />
The following ini directives have new default values:</p>
<p>session.use_only_cookies is now set to &quot;1&quot; (enabled) by default.<br />
oci8.default_prefetch has changed from &quot;10&quot; to &quot;100&quot;.</p>
<p>十九、其他变化<br />
SplFileInfo::getpathinfo() 返回path name信息<br />
SplObjectStorage now has ArrayAccess support. It is now also possible to store associative information with objects in SplObjectStorage.<br />
In the GD extension, there is now pixelation support available through the imagefilter() function.<br />
var_dump() 输出将包含私有属性<br />
session_start() 失败返回FALSE<br />
property_exists() now checks the existence of a property independent of accessibility (like method_exists()).<br />
Stream wrappers can now be used by include_path.<br />
The initial parameter for array_reduce() can now be of any type.<br />
The directory functions opendir(), scandir(), and dir() now use the default stream context if no explicit context is passed.<br />
crypt() now has Blowfish and extended DES support, and crypt() features are now 100% portable. PHP has its own internal crypt implementation which drops into place when support for crypt or crypt_r is not found.<br />
getopt() now accepts &quot;long options&quot; on all platforms. Optional values and = as a separator for short options are now supported.<br />
fopen()有了新的模式选项(n), which passes O_NONBLOCK to the underlying open() system call. 这个模式已经能在windows上使用。<br />
getimagesize() 支持icon文件(.ico).<br />
mhash扩展移到PECL, 编译时使用--with-mhash选项，hash扩展将兼容mhash。注意：hash扩展开启兼容mhash，无需mhash库的支持。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></description>
			<link>http://dev.meettea.com/show-88-1.html</link>
			<category domain="http://dev.meettea.com/category-8-1.html">后端那些事</category>
			<pubDate>2010-08-03 19:42</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-87-1.html</guid>
			<title>PHP终止PHP5.2的积极更新，鼓励用户升级到PHP5.3</title>
			<author>shiny</author>
			<description><![CDATA[<p>昨日，在php官网上php5.2.x系列稳定版更新到php5.2.14，PHP5.3.x系列更新到PHP5.3.3。同时这个版本主要改进了PHP5.2.x系列的稳定性，修复60多个BUG，部分BUG与安全相关。这个版本标志着对PHP5.2系列更新的结束，在此版本之后不再积极更新PHP5.2x，其安全补丁可能以单个形式发布。</p>
<p>与此同时，PHP开发团队发布了PHP5.3.3，修复了近100个BUG，鼓励所有PHP5.2系列的用户升级到PHP5.3。但是实际上国内很多PHP程序对PHP5.3的支持都有不少小问题。</p>
<p>此外，PHP官网着重列出一个PHP5.3.3新的不兼容特性：在命名空间里，和类名一致的函数不再被作为一个构造函数。不过没有使用namespace的类不受影响。 <code>&lt;?php<br />
namespace Foo;<br />
class Bar {<br />
&nbsp;&nbsp;public function Bar() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 在PHP 5.3.0-5.3.2版本作为构造函数<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 在PHP 5.3.3作为一个普通函数<br />
&nbsp;&nbsp;}<br />
} ?&gt; </code></p>
<p>以下是PHP5.3.3的修复清单。 Rewrote var_export() to use smart_str rather than output buffering, prevents data disclosure if a fatal error occurs (CVE-2010-2531).</p>
<ul>
    <li>Fixed a possible resource destruction issues in shm_put_var().</li>
    <li>Fixed a possible information leak because of interruption of XOR operator.</li>
    <li>Fixed a possible memory corruption because of unexpected call-time pass by refernce and following memory clobbering through callbacks.</li>
    <li>Fixed a possible memory corruption in ArrayObject::uasort().</li>
    <li>Fixed a possible memory corruption in parse_str().</li>
    <li>Fixed a possible memory corruption in pack().</li>
    <li>Fixed a possible memory corruption in substr_replace().</li>
    <li>Fixed a possible memory corruption in addcslashes().</li>
    <li>Fixed a possible stack exhaustion inside fnmatch().</li>
    <li>Fixed a possible dechunking filter buffer overflow.</li>
    <li>Fixed a possible arbitrary memory access inside sqlite extension.</li>
    <li>Fixed string format validation inside phar extension.</li>
    <li>Fixed handling of session variable serialization on certain prefix characters.</li>
    <li>Fixed a NULL pointer dereference when processing invalid XML-RPC requests (Fixes CVE-2010-0397, bug #51288).</li>
    <li>Fixed SplObjectStorage unserialization problems (CVE-2010-2225).</li>
    <li>Fixed possible buffer overflows in mysqlnd_list_fields, mysqlnd_change_user.</li>
    <li>Fixed possible buffer overflows when handling error packets in mysqlnd.</li>
    <li>Key enhancements in PHP 5.3.3 include:</li>
    <li>Upgraded bundled sqlite to version 3.6.23.1.</li>
    <li>Upgraded bundled PCRE to version 8.02.</li>
    <li>Added FastCGI Process Manager (FPM) SAPI.</li>
    <li>Added stream filter support to mcrypt extension.</li>
    <li>Added full_special_chars filter to ext/filter.</li>
    <li>Fixed a possible crash because of recursive GC invocation.</li>
    <li>Fixed bug #52238 (Crash when an Exception occured in iterator_to_array).</li>
    <li>Fixed bug #52041 (Memory leak when writing on uninitialized variable returned from function).</li>
    <li>Fixed bug #52060 (Memory leak when passing a closure to method_exists()).</li>
    <li>Fixed bug #52001 (Memory allocation problems after using variable variables).</li>
    <li>Fixed bug #51723 (Content-length header is limited to 32bit integer with Apache2 on Windows).</li>
    <li>Fixed bug #48930 (__COMPILER_HALT_OFFSET__ incorrect in PHP &gt;= 5.3).</li>
    <li>For users upgrading from PHP 5.2 there is a migration guide available on http://php.net/migration53, detailing the changes between those releases and PHP 5.3.</li>
</ul>
<p>&nbsp;</p>
<p>PHP5.2.14主要更新清单</p>
<ul>
    <li>Rewrote var_export() to use smart_str rather than output buffering, prevents data disclosure if a fatal error occurs.</li>
    <li>Fixed a possible interruption array leak in strrchr().(CVE-2010-2484)</li>
    <li>Fixed a possible interruption array leak in strchr(), strstr(), substr(), chunk_split(), strtok(), addcslashes(), str_repeat(), trim().</li>
    <li>Fixed a possible memory corruption in substr_replace().</li>
    <li>Fixed SplObjectStorage unserialization problems (CVE-2010-2225).</li>
    <li>Fixed a possible stack exaustion inside fnmatch().</li>
    <li>Fixed a NULL pointer dereference when processing invalid XML-RPC requests (Fixes CVE-2010-0397, bug #51288).</li>
    <li>Fixed handling of session variable serialization on certain prefix characters.</li>
    <li>Fixed a possible arbitrary memory access inside sqlite extension. Reported by Mateusz Kocielski.</li>
    <li>Key enhancements in PHP 5.2.14 include:</li>
    <li>Upgraded bundled PCRE to version 8.02.</li>
    <li>Updated timezone database to version 2010.5.</li>
    <li>Fixed bug #52238 (Crash when an Exception occured in iterator_to_array).</li>
    <li>Fixed bug #52237 (Crash when passing the reference of the property of a non-object).</li>
    <li>Fixed bug #52041 (Memory leak when writing on uninitialized variable returned from function).</li>
    <li>Fixed bug #51822 (Segfault with strange __destruct() for static class variables).</li>
    <li>Fixed bug #51552 (debug_backtrace() causes segmentation fault and/or memory issues).</li>
    <li>Fixed bug #49267 (Linking fails for iconv on MacOS: &quot;Undefined symbols: _libiconv&quot;).</li>
</ul>
<p>&nbsp;</p>]]></description>
			<link>http://dev.meettea.com/show-87-1.html</link>
			<category domain="http://dev.meettea.com/category-8-1.html">后端那些事</category>
			<pubDate>2010-07-23 13:34</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-86-1.html</guid>
			<title>午茶时光 开篇的序</title>
			<author>shiny</author>
			<description><![CDATA[<p>不知不觉，左三年右三年，从午茶的策划到现在居然快六年了。</p>
<p>六年时间里，我从一个伪文艺少年到IT从业人员；从无病呻吟到只会用if/else思考；
从被深度洗脑到兼容并包，变化不可谓不大。</p>
<p>
现在，终于算有个交代了。<br />
当然，也物是人非。</p>
<ul>
<li>六年时间，80后都开始踏上社会的舞台；</li>
<li>六年时间，韩寒都开着赛车出了独唱团；</li>
<li>六年时间，秋雨大师成了佐餐笑料；</li>
<li>六年时间，新概念都成了旧概念；</li>
<li>六年时间，带三个表都实现了河蟹社会的转变；</li>
<li>六年时间，装X的都发了财；</li>
<li>六年时间，我们的国家奔向西朝鲜的康庄大道上；</li>
<li>六年时间，形形色色的人们用无尽的欲望将五浊恶世演绎得淋漓尽致。</li>
<li>那就把世界末日当作一个善意的谎言，赶在2012之前开辟最后一块净地，实现最后一个梦想吧。</li>
</ul>
<center><a href="http://wucha.sg">http://wucha.sg</a> shiny</center>
<strong>预告：wucha.sg将在内测结束后正式面向公众访问，文章辑录标准是真情实感、有思想、文章耐读、形式不拘。初期不会有很多互动功能。</strong>
附：内测截图
]]></description>
			<link>http://dev.meettea.com/show-86-1.html</link>
			<category domain="http://dev.meettea.com/category-1-1.html">微风日志</category>
			<pubDate>2010-07-21 21:37</pubDate>
		</item>
		<item>
			<guid>http://dev.meettea.com/show-85-1.html</guid>
			<title>【转载】个人使用VPS的心得</title>
			<author>shiny</author>
			<description><![CDATA[<p><strong>一、为什么需要一个VPS</strong><br />
1、熟悉linux的操作<br />
现在基本的PHP岗位都多多少少有精通linux的需要了，什么bash、lamp的构建，不要告诉我你还不会自己编译一个php。<br />
看看PHPCHINA招聘版的帖子吧<br />
http://bbs.phpchina.com/thread-188734-1-1.html<br />
http://bbs.phpchina.com/thread-188833-1-1.html<br />
如果没机会接触服务器，那么vps是最接近线上运行环境的情况了</p>
<p>2、定制自己所需的运行环境<br />
很多人都在问定时执行怎么做，也有人为虚拟主机缺少XXX的支持而烦恼，也有人为程序的兼容性而努力着。<br />
如果使用了VPS，那么这些问题也可以迎刃而解。定时执行可以在shell下使用crond,缺组件可以自己编译php来支持，还能做类似于mysql定时备份等操作。</p>
<p>3、可以尝试no sql、memcached、 HipHop等先进技术<br />
好吧，如果你到今天还未尝试过no sql，那么你也是一个很Out的phper了。<br />
no sql适用对时效性较强的部分，比如Cassandra，facebook和digg.com在使用；<br />
sina app大文件储存使用MongoDB进行储存；<br />
xiami.com的消息通知部分用Redis；<br />
校内(人人)使用Tokyo Cabinet等等等<br />
振奋人心的HipHop(把PHP&ldquo;翻译&rdquo;成c++并编译成可执行文件)<br />
而Redis是linux only的，HipHop仅支持64位linux，没有一个linux还真搞不定，那么那么，你还打算在虚拟主机里YY吗？</p>
<p>4、自由绑定域名，想放几个站就放几个站<br />
介个，虚拟主机就是靠这个赚钱的，而实际上很多站都是没流量的，靠这个矛盾虚拟主机才赚钱。而VPS是不限制站点数量的。</p>
<p>5、ssh或vpn翻墙<br />
国外的VPS兼有翻墙功能，不仅不用满天找翻墙工具了，还能为朋友提供便利。<br />
什么，为什么翻墙？你难道不想接触淫淫网、国内微薄的抄袭对象吗？</p>
<p>6、相当于拥有一个私人svn服务器<br />
google code和sourceforge源码是开放的，svnhost.cn私人源码是要收费的，对于有保密性要求而又没公司服务器支持的可以选择VPS上搭建SVN。</p>
<p>7、独立ip<br />
国外的好处是不会受其他站牵连(比如godaddy的是被墙专业户)<br />
其他好处是SEO方便、可以安装SSL证书(只有独立ip才可以)</p>
<p><strong>二、关于VPS的挑选<br />
</strong>如果是国外的，从速度上看加州的机房对于国内用户访问速度不错(因为是海底光缆的米国入口)，世界范围的ping延迟也平均在150ms左右；比如San Jose或Fremont。<br />
不过也有童鞋测的米国中部的VPS速度也不错，可能是带宽原因。<br />
个人经验：有时候国内的VPS未必比米国的快;挑选nginx、lighttpd之类的WEB服务器省内存;SWAP使用超过100MB后需要减少内存占用了;blablablabla</p>
<p>个人目前在使用<a href="http://www.rashost.com">瑞豪开源</a>RASHOST，经验是，起步门栏低，128M起(700一年)，支持月付，几个虚拟主机就抵一个VPS了；国内商家，中文，支付方便，也卖国外VPS；客服比较耐心；比如张宴之类牛人也在用瑞豪开源；从这段时间的使用来看，还是很不错的，我推荐的朋友也都一直在用。</p>
<p><strong>三、有用的资源</strong><br />
免费SSL证书(不支持opera) <a href="http://dev.meettea.com/show-52-1.html">http://dev.meettea.com/show-52-1.html</a> <br />
Nginx 0.8.x + PHP 5.2.13（FastCGI）搭建胜过Apache十倍的Web服务器 <a href="http://blog.s135.com/nginx_php_v6/">http://blog.s135.com/nginx_php_v6/</a><br />
检测服务器状况 <a href="http://www.jiankongbao.com">http://www.jiankongbao.com</a><br />
瑞豪开源优惠码9折 RASHOST9</p>]]></description>
			<link>http://dev.meettea.com/show-85-1.html</link>
			<category domain="http://dev.meettea.com/category-7-1.html">运维</category>
			<pubDate>2010-07-15 10:41</pubDate>
		</item>
	</channel>
</rss>

