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

<channel>
	<title>Andy's Blog</title>
	<atom:link href="http://www.21andy.com/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.21andy.com/blog</link>
	<description>PHP,WordPress,SEO,网赚,站长</description>
	<lastBuildDate>Sat, 04 Jul 2009 17:09:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>一个低级错误搞了我一个晚上</title>
		<link>http://www.21andy.com/blog/20090705/1343.html</link>
		<comments>http://www.21andy.com/blog/20090705/1343.html#comments</comments>
		<pubDate>Sat, 04 Jul 2009 17:09:03 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[autocomplete]]></category>
		<category><![CDATA[低级错误]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/?p=1343</guid>
		<description><![CDATA[由于性能问题, 用原生的PHP重写了程序, 本来用CodeIgniter写的
性能从0.2-0.5提升到了0.01-0.02以下, 并发从只能10个上升到近100
想不明白CodeIgniter不应该这么慢的, 不过CI是我扩展过的了
不管它了, 以后慎用框架.
一开始就跑题了, 现在说今天发生的低级错误
今天重写了部份程序测试完了性能, 却发现一个重要的Javascript功能不能用了
就是----自动完成, 鼠标怎么点都不聚焦, 像卡死的样子, 一会能点一会不能点的
认认真真的查了源代码, 从头到尾, 从尾到头, 就是没找到问题, 气得我直想砸电脑
本来用Jquery的插件做的autocomplete, 差点让我又"原生"
后来正准备"原生"开始写的时候, 突然想到了, 会不会是布局的问题
原来是我那个文本框离其他元素太近, CSS有问题, 应该是其他元素给盖住了.....
居然还是透明的盖住....晕死
界面还没做好, 所以那个文本框才会离得那么近, 加几个回车就一切都OK了...
下回注意!
]]></description>
			<content:encoded><![CDATA[<p>由于性能问题, 用原生的PHP重写了程序, 本来用CodeIgniter写的<br />
性能从0.2-0.5提升到了0.01-0.02以下, 并发从只能10个上升到近100<br />
想不明白CodeIgniter不应该这么慢的, 不过CI是我扩展过的了<br />
不管它了, 以后慎用框架.</p>
<p>一开始就跑题了, 现在说今天发生的低级错误<br />
今天重写了部份程序测试完了性能, 却发现一个重要的Javascript功能不能用了<br />
就是----自动完成, 鼠标怎么点都不聚焦, 像卡死的样子, 一会能点一会不能点的<br />
认认真真的查了源代码, 从头到尾, 从尾到头, 就是没找到问题, 气得我直想砸电脑</p>
<p>本来用Jquery的插件做的autocomplete, 差点让我又"原生"<br />
后来正准备"原生"开始写的时候, 突然想到了, 会不会是布局的问题<br />
原来是我那个文本框离其他元素太近, CSS有问题, 应该是其他元素给盖住了.....<br />
居然还是透明的盖住....晕死</p>
<p>界面还没做好, 所以那个文本框才会离得那么近, 加几个回车就一切都OK了...<br />
下回注意!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090705/1343.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>真搞不明白酒有什么好喝的</title>
		<link>http://www.21andy.com/blog/20090702/1342.html</link>
		<comments>http://www.21andy.com/blog/20090702/1342.html#comments</comments>
		<pubDate>Thu, 02 Jul 2009 09:11:51 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[酒]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/20090702/1342.html</guid>
		<description><![CDATA[不管是白的黑的黄的红的
不管是便宜的还是贵到让人吐血的
都是一个鸟味, 闻了就想吐
不知道怎么这么多人喜欢喝
发明酒的人应该拿去枪毙
有人说喝了酒是为了酒后的快感,飘飘然的感觉
我怎么就从来没有快感啊?!只有头痛睡不着,心跳呯呯的,要多难受有多难受
如果喝酒是为了自残, 那不如别喝酒了, 还浪费钱
直接一人拿把刀子, 往身上划, 流的血多就感情深, 完了往上撒药
]]></description>
			<content:encoded><![CDATA[<p>不管是白的黑的黄的红的<br />
不管是便宜的还是贵到让人吐血的<br />
都是一个鸟味, 闻了就想吐<br />
不知道怎么这么多人喜欢喝<br />
发明酒的人应该拿去枪毙</p>
<p>有人说喝了酒是为了酒后的快感,飘飘然的感觉<br />
我怎么就从来没有快感啊?!只有头痛睡不着,心跳呯呯的,要多难受有多难受</p>
<p>如果喝酒是为了自残, 那不如别喝酒了, 还浪费钱<br />
直接一人拿把刀子, 往身上划, 流的血多就感情深, 完了往上撒药</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090702/1342.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>VirtualBox引起的硬盘严重问题</title>
		<link>http://www.21andy.com/blog/20090629/1339.html</link>
		<comments>http://www.21andy.com/blog/20090629/1339.html#comments</comments>
		<pubDate>Mon, 29 Jun 2009 05:57:46 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[VirtualBox]]></category>
		<category><![CDATA[VMWare]]></category>
		<category><![CDATA[硬盘]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/?p=1339</guid>
		<description><![CDATA[昨天装了VirtualBox来用虚拟机, 挺喜欢这开源的东西, 没想到.....
今天发现系统很卡, 查了一下硬盘, 吓我一跳, 看图


搞了半天, 都查不出原因, 我还以为是硬盘坏了
最后查出来原来是VirtualBox搞的鬼
GHOST之, 搞定
以后还是老老实实用VMware!!!
]]></description>
			<content:encoded><![CDATA[<p>昨天装了VirtualBox来用虚拟机, 挺喜欢这开源的东西, 没想到.....<br />
今天发现系统很卡, 查了一下硬盘, 吓我一跳, 看图</p>
<p><a href="http://www.21andy.com/blog/uploads/2009/06/hd.gif" rel="lightbox[roadtrip]"><img src="http://www.21andy.com/blog/uploads/2009/06/hd-500x367.gif" alt="VirtualBox引起的硬盘严重问题 hd 500x367" title="hd" width="500" height="367" class="aligncenter size-medium wp-image-1340" /></a></p>
<p><a href="http://www.21andy.com/blog/uploads/2009/06/hd2.gif" rel="lightbox[roadtrip]"><img src="http://www.21andy.com/blog/uploads/2009/06/hd2-500x587.gif" alt="VirtualBox引起的硬盘严重问题 hd2 500x587" title="hd2" width="500" height="587" class="aligncenter size-medium wp-image-1341" /></a></p>
<p>搞了半天, 都查不出原因, 我还以为是硬盘坏了<br />
最后查出来原来是VirtualBox搞的鬼<br />
GHOST之, 搞定</p>
<p>以后还是老老实实用VMware!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090629/1339.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nginx 0.7.x + PHP 5.2.10（FastCGI）搭建胜过Apache十倍的Web服务器（第5版）</title>
		<link>http://www.21andy.com/blog/20090628/1338.html</link>
		<comments>http://www.21andy.com/blog/20090628/1338.html#comments</comments>
		<pubDate>Sun, 28 Jun 2009 06:42:01 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/?p=1338</guid>
		<description><![CDATA[　　[文章作者：张宴 本文版本：v5.4 最后修改：2009.06.26 转载请注明原文链接：http://blog.s135.com/nginx_php_v5/]
　　前言：本文是我撰写的关于搭建“Nginx + PHP（FastCGI）”Web服务器的第5篇文章。本系列文章作为国内最早详细介绍 Nginx + PHP 安装、配置、使用的资料之一，为推动 Nginx 在国内的发展产生了积极的作用。这是一篇关于Nginx 0.7.x系列版本的文章，安装、配置方式与第4篇文章相差不大，但增加了MySQL安装配置的信息、PHP 5.2.10 的 php-fpm 补丁。Nginx 0.7.x系列版本虽然为开发版，但在很多大型网站的生产环境中已经使用。
　　链接：《2007年9月的第1版》、《2007年12月的第2版》、《2008年6月的第3版》、《2008年8月的第4版》
　　Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器，也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的，它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。
　　Nginx 超越 Apache 的高性能和稳定性，使得国内使用 Nginx 作为 Web 服务器的网站也越来越多，其中包括新浪博客、新浪播客、网易新闻等门户网站频道，六间房、56.com等视频分享网站，Discuz!官方论坛、水木社区等知名论坛，豆瓣、YUPOO相册、海内SNS、迅雷在线等新兴Web 2.0网站。
--------------------------------------------------------------------------------
　　Nginx 的官方中文维基：http://wiki.nginx.org/NginxChs
--------------------------------------------------------------------------------
　　在高并发连接的情况下，Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据我的测试结果，Nginx 0.7.61 + PHP 5.2.10 (FastCGI) 可以承受3万以上的并发连接数，相当于同等环境下Apache的10倍。
　　根据我的经验，4GB内存的服务器+Apache（prefork模式）一般只能处理3000个并发连接，因为它们将占用3GB以上的内存，还得为系统预留1GB的内存。我曾经就有两台Apache服务器，因为在配置文件中设置的MaxClients为4000，当Apache并发连接数达到3800时，导致服务器内存和Swap空间用满而崩溃。
　　而这台 Nginx 0.7.61 + PHP 5.2.10 (FastCGI) 服务器在3万并发连接下，开启的10个Nginx进程消耗150M内存（15M*10=150M），开启的64个php-cgi进程消耗1280M内存（20M*64=1280M），加上系统自身消耗的内存，总共消耗不到2GB内存。如果服务器内存较小，完全可以只开启25个php-cgi进程，这样php-cgi消耗的总内存数才500M。
　　在3万并发连接下，访问Nginx [...]]]></description>
			<content:encoded><![CDATA[<p>　　[文章作者：张宴 本文版本：v5.4 最后修改：2009.06.26 转载请注明原文链接：http://blog.s135.com/nginx_php_v5/]</p>
<p>　　前言：本文是我撰写的关于搭建“Nginx + PHP（FastCGI）”Web服务器的第5篇文章。本系列文章作为国内最早详细介绍 Nginx + PHP 安装、配置、使用的资料之一，为推动 Nginx 在国内的发展产生了积极的作用。这是一篇关于Nginx 0.7.x系列版本的文章，安装、配置方式与第4篇文章相差不大，但增加了MySQL安装配置的信息、PHP 5.2.10 的 php-fpm 补丁。Nginx 0.7.x系列版本虽然为开发版，但在很多大型网站的生产环境中已经使用。</p>
<p>　　链接：《2007年9月的第1版》、《2007年12月的第2版》、《2008年6月的第3版》、《2008年8月的第4版》</p>
<p>　　Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器，也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的，它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。</p>
<p>　　Nginx 超越 Apache 的高性能和稳定性，使得国内使用 Nginx 作为 Web 服务器的网站也越来越多，其中包括新浪博客、新浪播客、网易新闻等门户网站频道，六间房、56.com等视频分享网站，Discuz!官方论坛、水木社区等知名论坛，豆瓣、YUPOO相册、海内SNS、迅雷在线等新兴Web 2.0网站。</p>
<p>--------------------------------------------------------------------------------</p>
<p>　　Nginx 的官方中文维基：http://wiki.nginx.org/NginxChs</p>
<p>--------------------------------------------------------------------------------</p>
<p>　　在高并发连接的情况下，Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据我的测试结果，Nginx 0.7.61 + PHP 5.2.10 (FastCGI) 可以承受3万以上的并发连接数，相当于同等环境下Apache的10倍。</p>
<p>　　根据我的经验，4GB内存的服务器+Apache（prefork模式）一般只能处理3000个并发连接，因为它们将占用3GB以上的内存，还得为系统预留1GB的内存。我曾经就有两台Apache服务器，因为在配置文件中设置的MaxClients为4000，当Apache并发连接数达到3800时，导致服务器内存和Swap空间用满而崩溃。</p>
<p>　　而这台 Nginx 0.7.61 + PHP 5.2.10 (FastCGI) 服务器在3万并发连接下，开启的10个Nginx进程消耗150M内存（15M*10=150M），开启的64个php-cgi进程消耗1280M内存（20M*64=1280M），加上系统自身消耗的内存，总共消耗不到2GB内存。如果服务器内存较小，完全可以只开启25个php-cgi进程，这样php-cgi消耗的总内存数才500M。</p>
<p>　　在3万并发连接下，访问Nginx 0.7.61 + PHP 5.2.10 (FastCGI) 服务器的PHP程序，仍然速度飞快。下图为Nginx的状态监控页面，显示的活动连接数为28457（关于Nginx的监控页配置，会在本文接下来所给出的Nginx配置文件中写明）：</p>
<p>　　<img title="nginx_status" src="http://blog.s135.com/attachment/200712/nginx_status.png" alt="Nginx 0.7.x + PHP 5.2.10（FastCGI）搭建胜过Apache十倍的Web服务器（第5版） nginx status" width="294" height="180" /></p>
<p>　　我生产环境下的两台Nginx + PHP5（FastCGI）服务器，跑多个一般复杂的纯PHP动态程序，单台Nginx + PHP5（FastCGI）服务器跑PHP动态程序的处理能力已经超过“700次请求/秒”，相当于每天可以承受6000万（700*60*60*24=60480000）的访问量（更多信息见此），而服务器的系统负载也不高：</p>
<p>　　<img title="nginx_php" src="http://blog.s135.com/attachment/200803/nginx_php_la.gif" alt="Nginx 0.7.x + PHP 5.2.10（FastCGI）搭建胜过Apache十倍的Web服务器（第5版） nginx php la" width="540" height="245" /></p>
<p>--------------------------------------------------------------------------------</p>
<p>　　下面是用100个并发连接分别去压生产环境中同一负载均衡器VIP下、提供相同服务的两台服务器，一台为Nginx，另一台为Apache，Nginx每秒处理的请求数是Apache的两倍多，Nginx服务器的系统负载、CPU使用率远低于Apache：</p>
<p>　　你可以将连接数开到10000～30000，去压Nginx和Apache上的phpinfo.php，这是用浏览器访问Nginx上的phpinfo.php一切正常，而访问Apache服务器的phpinfo.php，则是该页无法显示。4G内存的服务器，即使再优化，Apache也很难在“webbench -c 30000 -t 60 http://xxx.xxx.xxx.xxx/phpinfo.php”的压力情况下正常访问，而调整参数优化后的Nginx可以。</p>
<p>　　webbench 下载地址：http://blog.s135.com/post/288/</p>
<p>　　注意：webbench 做压力测试时，该软件自身也会消耗CPU和内存资源，为了测试准确，请将 webbench 安装在别的服务器上。</p>
<p>　　测试结果：##### Nginx + PHP #####</p>
<blockquote><p>[root@localhost webbench-1.5]# webbench -c 100 -t 30 http://192.168.1.21/phpinfo.php<br />
Webbench - Simple Web Benchmark 1.5<br />
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.</p>
<p>Benchmarking: GET http://192.168.1.21/phpinfo.php<br />
100 clients, running 30 sec.</p>
<p>Speed=102450 pages/min, 16490596 bytes/sec.<br />
Requests: 51225 susceed, 0 failed.</p>
<p>top - 14:06:13 up 27 days, 2:25, 2 users, load average: 14.57, 9.89, 6.51<br />
Tasks: 287 total, 4 running, 283 sleeping, 0 stopped, 0 zombie<br />
Cpu(s): 49.9% us, 6.7% sy, 0.0% ni, 41.4% id, 1.1% wa, 0.1% hi, 0.8% si<br />
Mem: 6230016k total, 2959468k used, 3270548k free, 635992k buffers<br />
Swap: 2031608k total, 3696k used, 2027912k free, 1231444k cached</p></blockquote>
<p>　　测试结果：##### Apache + PHP #####</p>
<blockquote><p>[root@localhost webbench-1.5]# webbench -c 100 -t 30 http://192.168.1.27/phpinfo.php<br />
Webbench - Simple Web Benchmark 1.5<br />
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.</p>
<p>Benchmarking: GET http://192.168.1.27/phpinfo.php<br />
100 clients, running 30 sec.</p>
<p>Speed=42184 pages/min, 31512914 bytes/sec.<br />
Requests: 21092 susceed, 0 failed.</p>
<p>top - 14:06:20 up 27 days, 2:13, 2 users, load average: 62.15, 26.36, 13.42<br />
Tasks: 318 total, 7 running, 310 sleeping, 0 stopped, 1 zombie<br />
Cpu(s): 80.4% us, 10.6% sy, 0.0% ni, 7.9% id, 0.1% wa, 0.1% hi, 0.9% si<br />
Mem: 6230016k total, 3075948k used, 3154068k free, 379896k buffers<br />
Swap: 2031608k total, 12592k used, 2019016k free, 1117868k cached</p></blockquote>
<p>--------------------------------------------------------------------------------</p>
<p>　　为什么Nginx的性能要比Apache高得多？这得益于Nginx使用了最新的epoll（Linux 2.6内核）和kqueue（freebsd）网络I/O模型，而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid、Memcached都采用的是epoll网络I/O模型。</p>
<p>　　处理大量的连接的读写，Apache所采用的select网络I/O模型非常低效。下面用一个比喻来解析Apache采用的select模型和Nginx采用的epoll模型进行之间的区别：</p>
<p>　　假设你在大学读书，住的宿舍楼有很多间房间，你的朋友要来找你。select版宿管大妈就会带着你的朋友挨个房间去找，直到找到你为止。而epoll版宿管大妈会先记下每位同学的房间号，你的朋友来时，只需告诉你的朋友你住在哪个房间即可，不用亲自带着你的朋友满大楼找人。如果来了10000个人，都要找自己住这栋楼的同学时，select版和epoll版宿管大妈，谁的效率更高，不言自明。同理，在高并发服务器中，轮询I/O是最耗时间的操作之一，select和epoll的性能谁的性能更高，同样十分明了。</p>
<p>--------------------------------------------------------------------------------</p>
<p>　　<strong>安装步骤：</strong><br />
　　（系统要求：Linux 2.6+ 内核，本文中的Linux操作系统为CentOS 5.3，另在RedHat AS4上也安装成功）</p>
<p>　　<strong>一、获取相关开源程序：</strong><br />
　　1、【适用CentOS操作系统】利用CentOS Linux系统自带的yum命令安装、升级所需的程序库（RedHat等其他Linux发行版可从安装光盘中找到这些程序库的RPM包，进行安装）：</p>
<div class="hl-surround"><div class="hl-main">sudo -s<br />LANG=C<br />yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers</div></div>
<p>　　2、【适用RedHat操作系统】RedHat等其他Linux发行版可从安装光盘中找到这些程序库的RPM包（事先可通过类似“rpm -qa | grep libjpeg”的命令查看所需的RPM包是否存在，通常是“xxx-devel”不存在，需要安装）。RedHat可以直接利用CentOS的RPM包安装，以下是RPM包下载网址：<br />
　　①、RedHat AS4 &amp; CentOS 4<br />
　　<a href="http://mirrors.163.com/centos/4/os/i386/CentOS/RPMS/">http://mirrors.163.com/centos/4/os/i386/CentOS/RPMS/</a><br />
　　<a href="http://mirrors.163.com/centos/4/os/x86_64/CentOS/RPMS/">http://mirrors.163.com/centos/4/os/x86_64/CentOS/RPMS/</a></p>
<p>　　②、RedHat AS5 &amp; CentOS 5<br />
　　<a href="http://mirrors.163.com/centos/5/os/i386/CentOS/">http://mirrors.163.com/centos/5/os/i386/CentOS/</a><br />
　　<a href="http://mirrors.163.com/centos/5/os/x86_64/CentOS/">http://mirrors.163.com/centos/5/os/x86_64/CentOS/</a></p>
<p>　　③、RPM包搜索网站<br />
　　<a href="http://rpm.pbone.net/">http://rpm.pbone.net/</a><br />
　　<a href="http://www.rpmfind.net/">http://www.rpmfind.net/</a></p>
<p>　　④、RedHat AS4 系统环境，通常情况下缺少的支持包安装：<br />
　　Ⅰ、i386 系统</p>
<div class="hl-surround"><div class="hl-main">wget http://blog.s135.com/soft/linux/nginx_php/rpm/i386/libjpeg-devel-6b-33.i386.rpm<br />rpm -ivh libjpeg-devel-6b-33.i386.rpm<br />wget http://blog.s135.com/soft/linux/nginx_php/rpm/i386/freetype-devel-2.1.9-1.i386.rpm<br />rpm -ivh freetype-devel-2.1.9-1.i386.rpm<br />wget http://blog.s135.com/soft/linux/nginx_php/rpm/i386/libpng-devel-1.2.7-1.i386.rpm<br />rpm -ivh libpng-devel-1.2.7-1.i386.rpm</div></div>
<p>　　Ⅱ、x86_64 系统</p>
<div class="hl-surround"><div class="hl-main">wget http://blog.s135.com/soft/linux/nginx_php/rpm/x86_64/libjpeg-devel-6b-33.x86_64.rpm<br />rpm -ivh libjpeg-devel-6b-33.x86_64.rpm<br />wget http://blog.s135.com/soft/linux/nginx_php/rpm/x86_64/freetype-devel-2.1.9-1.x86_64.rpm<br />rpm -ivh freetype-devel-2.1.9-1.x86_64.rpm<br />wget http://blog.s135.com/soft/linux/nginx_php/rpm/x86_64/libpng-devel-1.2.7-1.x86_64.rpm<br />rpm -ivh libpng-devel-1.2.7-1.x86_64.rpm</div></div>
<p>　　3、【适用CentOS、RedHat及其它Linux操作系统】下载程序源码包：<br />
　　本文中提到的所有开源软件为截止到2009年06月26日的最新稳定版。<br />
　　①、从软件的官方网站下载：</p>
<div class="hl-surround"><div class="hl-main">mkdir -p /data0/software<br />cd /data0/software<br />wget http://sysoev.ru/nginx/nginx-0.7.61.tar.gz<br />wget http://www.php.net/get/php-5.2.10.tar.gz/from/this/mirror<br />wget http://blog.s135.com/soft/linux/nginx_php/phpfpm/php-5.2.10-fpm-0.5.11.diff.gz<br />wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.35.tar.gz/from/http://mysql.he.net/<br />wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz<br />wget &quot;http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&amp;amp;big_mirror=0&quot;<br />wget &quot;http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz?modtime=1194463373&amp;amp;big_mirror=0&quot;<br />wget http://pecl.php.net/get/memcache-2.2.5.tgz<br />wget &quot;http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz?modtime=1175740843&amp;amp;big_mirror=0&quot;<br />wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.9.tar.gz<br />wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2<br />wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz<br />wget http://blog.s135.com/soft/linux/nginx_php/imagick/ImageMagick.tar.gz<br />wget http://pecl.php.net/get/imagick-2.2.2.tgz</div></div>
<p>　　②、从blog.s135.com下载（比较稳定，只允许在本站，或者在Linux/Unix下通过Wget、Curl等命令下载以下软件）：</p>
<div class="hl-surround"><div class="hl-main">mkdir -p /data0/software<br />cd /data0/software<br />wget http://blog.s135.com/soft/linux/nginx_php/nginx/nginx-0.7.61.tar.gz<br />wget http://blog.s135.com/soft/linux/nginx_php/php/php-5.2.10.tar.gz<br />wget http://blog.s135.com/soft/linux/nginx_php/phpfpm/php-5.2.10-fpm-0.5.11.diff.gz<br />wget http://blog.s135.com/soft/linux/nginx_php/mysql/mysql-5.1.35.tar.gz<br />wget http://blog.s135.com/soft/linux/nginx_php/libiconv/libiconv-1.13.tar.gz<br />wget http://blog.s135.com/soft/linux/nginx_php/mcrypt/libmcrypt-2.5.8.tar.gz<br />wget http://blog.s135.com/soft/linux/nginx_php/mcrypt/mcrypt-2.6.8.tar.gz<br />wget http://blog.s135.com/soft/linux/nginx_php/memcache/memcache-2.2.5.tgz<br />wget http://blog.s135.com/soft/linux/nginx_php/mhash/mhash-0.9.9.9.tar.gz<br />wget http://blog.s135.com/soft/linux/nginx_php/pcre/pcre-7.9.tar.gz<br />wget http://blog.s135.com/soft/linux/nginx_php/eaccelerator/eaccelerator-0.9.5.3.tar.bz2<br />wget http://blog.s135.com/soft/linux/nginx_php/pdo/PDO_MYSQL-1.0.2.tgz<br />wget http://blog.s135.com/soft/linux/nginx_php/imagick/ImageMagick.tar.gz<br />wget http://blog.s135.com/soft/linux/nginx_php/imagick/imagick-2.2.2.tgz</div></div>
<p>--------------------------------------------------------------------------------</p>
<p>　　<strong>二、安装PHP 5.2.10（FastCGI模式）</strong><br />
　　1、编译安装PHP 5.2.10所需的支持库：</p>
<div class="hl-surround"><div class="hl-main">tar zxvf libiconv-1.13.tar.gz<br />cd libiconv-1.13/<br />./configure --prefix=/usr/local<br />make<br />make install<br />cd ../<br /><br />tar zxvf libmcrypt-2.5.8.tar.gz<br />cd libmcrypt-2.5.8/<br />./configure<br />make<br />make install<br />/sbin/ldconfig<br />cd libltdl/<br />./configure --enable-ltdl-install<br />make<br />make install<br />cd ../../<br /><br />tar zxvf mhash-0.9.9.9.tar.gz<br />cd mhash-0.9.9.9/<br />./configure<br />make<br />make install<br />cd ../<br /><br />ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la<br />ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so<br />ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4<br />ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8<br />ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a<br />ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la<br />ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so<br />ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2<br />ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1<br /><br />tar zxvf mcrypt-2.6.8.tar.gz<br />cd mcrypt-2.6.8/<br />/sbin/ldconfig<br />./configure<br />make<br />make install<br />cd ../</div></div>
<p>--------------------------------------------------------------------------------</p>
<p>　　2、编译安装MySQL 5.1.35</p>
<div class="hl-surround"><div class="hl-main">/usr/sbin/groupadd mysql<br />/usr/sbin/useradd -g mysql mysql<br />tar zxvf mysql-5.1.35.tar.gz<br />cd mysql-5.1.35/<br />./configure --prefix=/usr/local/webserver/mysql/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile --with-plugins=innobase<br />make &amp;amp;&amp;amp; make install<br />chmod +w /usr/local/webserver/mysql<br />chown -R mysql:mysql /usr/local/webserver/mysql<br />cd ../</div></div>
<p>--------------------------------------------------------------------------------</p>
<p>　　附：以下为附加步骤，如果你想在这台服务器上运行MySQL数据库，则执行以下两步。如果你只是希望让PHP支持MySQL扩展库，能够连接其他服务器上的MySQL数据库，那么，以下两步无需执行。</p>
<p>　　①、创建MySQL数据库存放目录</p>
<div class="hl-surround"><div class="hl-main">mkdir -p /data0/mysql/3306/data/<br />chown -R mysql:mysql /data0/mysql/</div></div>
<p>　　②、以mysql用户帐号的身份建立数据表：</p>
<div class="hl-surround"><div class="hl-main">/usr/local/webserver/mysql/bin/mysql_install_db --basedir=/usr/local/webserver/mysql --datadir=/data0/mysql/3306/data --user=mysql</div></div>
<p>　　③、创建my.cnf配置文件：</p>
<div class="hl-surround"><div class="hl-main">vi /data0/mysql/3306/my.cnf</div></div>
<p>　　输入以下内容：</p>
<blockquote><p>[client]<br />
default-character-set = utf8<br />
port = 3306<br />
socket = /tmp/mysql.sock</p>
<p>[mysql]<br />
prompt="(\u:blog.s135.com:)[\d]&gt; "<br />
no-auto-rehash</p>
<p>[mysqld]<br />
#default-character-set = utf8<br />
user = mysql<br />
port = 3306<br />
socket = /tmp/mysql.sock<br />
basedir = /usr/local/webserver/mysql<br />
datadir = /data0/mysql/3306/data<br />
open_files_limit = 10240<br />
back_log = 600<br />
max_connections = 3000<br />
max_connect_errors = 6000<br />
table_cache = 614<br />
external-locking = FALSE<br />
max_allowed_packet = 32M<br />
sort_buffer_size = 2M<br />
join_buffer_size = 2M<br />
thread_cache_size = 300<br />
thread_concurrency = 8<br />
query_cache_size = 32M<br />
query_cache_limit = 2M<br />
query_cache_min_res_unit = 2k<br />
default-storage-engine = MyISAM<br />
default_table_type = MyISAM<br />
thread_stack = 192K<br />
transaction_isolation = READ-COMMITTED<br />
tmp_table_size = 246M<br />
max_heap_table_size = 246M<br />
long_query_time = 1<br />
log_long_format<br />
log-bin = /data0/mysql/3306/binlog<br />
binlog_cache_size = 4M<br />
binlog_format = MIXED<br />
max_binlog_cache_size = 8M<br />
max_binlog_size = 512M<br />
expire_logs_days = 7<br />
key_buffer_size = 256M<br />
read_buffer_size = 1M<br />
read_rnd_buffer_size = 16M<br />
bulk_insert_buffer_size = 64M<br />
myisam_sort_buffer_size = 128M<br />
myisam_max_sort_file_size = 10G<br />
myisam_max_extra_sort_file_size = 10G<br />
myisam_repair_threads = 1<br />
myisam_recover</p>
<p>skip-name-resolve<br />
master-connect-retry = 10<br />
slave-skip-errors = 1032,1062,126,1114,1146,1048,1396</p>
<p>server-id = 1</p>
<p>innodb_additional_mem_pool_size = 16M<br />
innodb_buffer_pool_size = 2048M<br />
innodb_data_file_path = ibdata1:1024M:autoextend<br />
innodb_file_io_threads = 4<br />
innodb_thread_concurrency = 8<br />
innodb_flush_log_at_trx_commit = 2<br />
innodb_log_buffer_size = 16M<br />
innodb_log_file_size = 128M<br />
innodb_log_files_in_group = 3<br />
innodb_max_dirty_pages_pct = 90<br />
innodb_lock_wait_timeout = 120<br />
innodb_file_per_table = 0<br />
[mysqldump]<br />
quick<br />
max_allowed_packet = 32M</p></blockquote>
<p>　　④、创建管理MySQL数据库的shell脚本：</p>
<div class="hl-surround"><div class="hl-main">vi /data0/mysql/3306/mysql</div></div>
<p>　　输入以下内容（这里的用户名admin和密码12345678接下来的步骤会创建）：</p>
<div class="hl-surround"><div class="hl-main">view plaincopy to clipboardprint?<br />#!/bin/sh<br /><br />mysql_port=3306<br />mysql_username=&quot;admin&quot;<br />mysql_password=&quot;12345678&quot;<br /><br />function_start_mysql()<br />{<br />printf &quot;Starting MySQL...\n&quot;<br />/bin/sh /usr/local/webserver/mysql/bin/mysqld_safe --defaults-file=/data0/mysql/${mysql_port}/my.cnf 2&amp;gt;&amp;amp;1 &amp;gt; /dev/null &amp;amp;<br />}<br /><br />function_stop_mysql()<br />{<br />printf &quot;Stoping MySQL...\n&quot;<br />/usr/local/webserver/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /tmp/mysql.sock shutdown<br />}<br /><br />function_restart_mysql()<br />{<br />printf &quot;Restarting MySQL...\n&quot;<br />function_stop_mysql<br />sleep 5<br />function_start_mysql<br />}<br /><br />function_kill_mysql()<br />{<br />kill -9 $(ps -ef | grep 'bin/mysqld_safe' | grep ${mysql_port} | awk '{printf $2}')<br />kill -9 $(ps -ef | grep 'libexec/mysqld' | grep ${mysql_port} | awk '{printf $2}')<br />}<br /><br />if [ &quot;$1&quot; = &quot;start&quot; ]; then<br />function_start_mysql<br />elif [ &quot;$1&quot; = &quot;stop&quot; ]; then<br />function_stop_mysql<br />elif [ &quot;$1&quot; = &quot;restart&quot; ]; then<br />function_restart_mysql<br />elif [ &quot;$1&quot; = &quot;kill&quot; ]; then<br />function_kill_mysql<br />else<br />printf &quot;Usage: /data0/mysql/${mysql_port}/mysql {start|stop|restart|kill}\n&quot;<br />fi<br />#!/bin/sh<br /><br />mysql_port=3306<br />mysql_username=&quot;admin&quot;<br />mysql_password=&quot;12345678&quot;<br /><br />function_start_mysql()<br />{<br />printf &quot;Starting MySQL...\n&quot;<br />/bin/sh /usr/local/webserver/mysql/bin/mysqld_safe --defaults-file=/data0/mysql/${mysql_port}/my.cnf 2&amp;gt;&amp;amp;1 &amp;gt; /dev/null &amp;amp;<br />}<br /><br />function_stop_mysql()<br />{<br />printf &quot;Stoping MySQL...\n&quot;<br />/usr/local/webserver/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /tmp/mysql.sock shutdown<br />}<br /><br />function_restart_mysql()<br />{<br />printf &quot;Restarting MySQL...\n&quot;<br />function_stop_mysql<br />sleep 5<br />function_start_mysql<br />}<br /><br />function_kill_mysql()<br />{<br />kill -9 $(ps -ef | grep 'bin/mysqld_safe' | grep ${mysql_port} | awk '{printf $2}')<br />kill -9 $(ps -ef | grep 'libexec/mysqld' | grep ${mysql_port} | awk '{printf $2}')<br />}<br /><br />if [ &quot;$1&quot; = &quot;start&quot; ]; then<br />function_start_mysql<br />elif [ &quot;$1&quot; = &quot;stop&quot; ]; then<br />function_stop_mysql<br />elif [ &quot;$1&quot; = &quot;restart&quot; ]; then<br />function_restart_mysql<br />elif [ &quot;$1&quot; = &quot;kill&quot; ]; then<br />function_kill_mysql<br />else<br />printf &quot;Usage: /data0/mysql/${mysql_port}/mysql {start|stop|restart|kill}\n&quot;<br />fi</div></div>
<p>　　⑤、赋予shell脚本可执行权限：</p>
<div class="hl-surround"><div class="hl-main">chmod +x /data0/mysql/3306/mysql</div></div>
<p>　　⑥、启动MySQL：</p>
<div class="hl-surround"><div class="hl-main">/data0/mysql/3306/mysql start</div></div>
<p>　　⑦、通过命令行登录管理MySQL服务器（提示输入密码时直接回车）：</p>
<div class="hl-surround"><div class="hl-main">/usr/local/webserver/mysql/bin/mysql -u root -p -S /tmp/mysql.sock</div></div>
<p>　　⑧、输入以下SQL语句，创建一个具有root权限的用户（admin）和密码（12345678）：</p>
<div class="hl-surround"><div class="hl-main">GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' IDENTIFIED BY '12345678';<br />GRANT ALL PRIVILEGES ON *.* TO 'admin'@'127.0.0.1' IDENTIFIED BY '12345678';</div></div>
<p>　　⑨、（可选）停止MySQL：</p>
<div class="hl-surround"><div class="hl-main">/data0/mysql/3306/mysql stop</div></div>
<p>--------------------------------------------------------------------------------</p>
<p>　　3、编译安装PHP（FastCGI模式）</p>
<div class="hl-surround"><div class="hl-main">tar zxvf php-5.2.10.tar.gz<br />gzip -cd php-5.2.10-fpm-0.5.11.diff.gz | patch -d php-5.2.10 -p1<br />cd php-5.2.10/<br />./configure --prefix=/usr/local/webserver/php --with-config-file-path=/usr/local/webserver/php/etc --with-mysql=/usr/local/webserver/mysql --with-mysqli=/usr/local/webserver/mysql/bin/mysql_config --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl --with-xmlrpc --enable-zip --enable-soap --without-pear<br />make ZEND_EXTRA_LIBS='-liconv'<br />make install<br />cp php.ini-dist /usr/local/webserver/php/etc/php.ini<br />cd ../</div></div>
<p>--------------------------------------------------------------------------------</p>
<p>　　4、编译安装PHP5扩展模块</p>
<div class="hl-surround"><div class="hl-main">tar zxvf memcache-2.2.5.tgz<br />cd memcache-2.2.5/<br />/usr/local/webserver/php/bin/phpize<br />./configure --with-php-config=/usr/local/webserver/php/bin/php-config<br />make<br />make install<br />cd ../<br /><br />tar jxvf eaccelerator-0.9.5.3.tar.bz2<br />cd eaccelerator-0.9.5.3/<br />/usr/local/webserver/php/bin/phpize<br />./configure --enable-eaccelerator=shared --with-php-config=/usr/local/webserver/php/bin/php-config<br />make<br />make install<br />cd ../<br /><br />tar zxvf PDO_MYSQL-1.0.2.tgz<br />cd PDO_MYSQL-1.0.2/<br />/usr/local/webserver/php/bin/phpize<br />./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-pdo-mysql=/usr/local/webserver/mysql<br />make<br />make install<br />cd ../<br /><br />tar zxvf ImageMagick.tar.gz<br />cd ImageMagick-6.5.1-2/<br />./configure<br />make<br />make install<br />cd ../<br /><br />tar zxvf imagick-2.2.2.tgz<br />cd imagick-2.2.2/<br />/usr/local/webserver/php/bin/phpize<br />./configure --with-php-config=/usr/local/webserver/php/bin/php-config<br />make<br />make install<br />cd ../</div></div>
<p>　　5、修改php.ini文件<br />
　　<strong>手工修改：</strong>查找/usr/local/webserver/php/etc/php.ini中的extension_dir = "./"<br />
　　修改为extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/"<br />
　　并在此行后增加以下几行，然后保存：<br />
　　extension = "memcache.so"<br />
　　extension = "pdo_mysql.so"<br />
　　extension = "imagick.so"</p>
<p>　　再查找output_buffering = Off<br />
　　修改为output_buffering = On</p>
<p>　　<strong>自动修改：</strong>若嫌手工修改麻烦，可执行以下shell命令，自动完成对php.ini文件的修改：</p>
<div class="hl-surround"><div class="hl-main">sed -i 's#extension_dir = &quot;./&quot;#extension_dir = &quot;/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/&quot;\nextension = &quot;memcache.so&quot;\nextension = &quot;pdo_mysql.so&quot;\nextension = &quot;imagick.so&quot;\n#' /usr/local/webserver/php/etc/php.ini<br />sed -i 's#output_buffering = Off#output_buffering = On#' /usr/local/webserver/php/etc/php.ini<br />sed -i &quot;s#; always_populate_raw_post_data = On#always_populate_raw_post_data = On#g&quot; /usr/local/webserver/php/etc/php.ini</div></div>
<p>　　6、配置eAccelerator加速PHP：</p>
<div class="hl-surround"><div class="hl-main">mkdir -p /usr/local/webserver/eaccelerator_cache<br />vi /usr/local/webserver/php/etc/php.ini</div></div>
<p>　　按shift+g键跳到配置文件的最末尾，加上以下配置信息：</p>
<div class="hl-surround"><div class="hl-main">[eaccelerator]<br />zend_extension=&quot;/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so&quot;<br />eaccelerator.shm_size=&quot;64&quot;<br />eaccelerator.cache_dir=&quot;/usr/local/webserver/eaccelerator_cache&quot;<br />eaccelerator.enable=&quot;1&quot;<br />eaccelerator.optimizer=&quot;1&quot;<br />eaccelerator.check_mtime=&quot;1&quot;<br />eaccelerator.debug=&quot;0&quot;<br />eaccelerator.filter=&quot;&quot;<br />eaccelerator.shm_max=&quot;0&quot;<br />eaccelerator.shm_ttl=&quot;3600&quot;<br />eaccelerator.shm_prune_period=&quot;3600&quot;<br />eaccelerator.shm_only=&quot;0&quot;<br />eaccelerator.compress=&quot;1&quot;<br />eaccelerator.compress_level=&quot;9&quot;</div></div>
<p>--------------------------------------------------------------------------------</p>
<p>　　7、创建www用户和组，以及供blog.s135.com和www.s135.com两个虚拟主机使用的目录：</p>
<div class="hl-surround"><div class="hl-main">/usr/sbin/groupadd www<br />/usr/sbin/useradd -g www www<br />mkdir -p /data0/htdocs/blog<br />chmod +w /data0/htdocs/blog<br />chown -R www:www /data0/htdocs/blog<br />mkdir -p /data0/htdocs/www<br />chmod +w /data0/htdocs/www<br />chown -R www:www /data0/htdocs/www</div></div>
<p>　　8、创建php-fpm配置文件（php-fpm是为PHP打的一个FastCGI管理补丁，可以平滑变更php.ini配置而无需重启php-cgi）：<br />
　　在/usr/local/webserver/php/etc/目录中创建php-fpm.conf文件：</p>
<div class="hl-surround"><div class="hl-main">rm -f /usr/local/webserver/php/etc/php-fpm.conf<br />vi /usr/local/webserver/php/etc/php-fpm.conf</div></div>
<p>　　输入以下内容（如果您安装 Nginx + PHP 用于程序调试，请将以下的0改为1，以便显示PHP错误信息，否则，Nginx 会报状态为500的空白错误页）：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Olive;">&lt;?</span><span style="color: Green;">xml</span><span style="color: Gray;"> </span><span style="color: #00008b;">version</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1.0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">?&gt;</span><span style="color: Gray;">&nbsp; <br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">configuration</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp; All relative paths in this config are relative to php's install prefix&nbsp; &nbsp;<br />&nbsp; <br />&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">section</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">global_options</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp;Pid file&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">pid_file</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">/usr/local/webserver/php/logs/php-fpm.pid</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp;Error log file&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">error_log</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">/usr/local/webserver/php/logs/php-fpm.log</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp;Log level&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">log_level</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">notice</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp;When this amount of php processes exited with SIGSEGV or SIGBUS ...&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">emergency_restart_threshold</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">10</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp;... in a less than this interval of time, a graceful restart will be initiated.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;Useful to work around accidental curruptions in accelerator's shared memory.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">emergency_restart_interval</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">1m</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp;Time limit on waiting child's reaction on signals from master&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">process_control_timeout</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">5s</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp;Set to 'no' to debug fpm&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">daemonize</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">yes</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">section</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">workers</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">section</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">pool</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Name of pool. Used in logs and stats.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">name</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">default</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Address to accept fastcgi requests on.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;Valid syntax is 'ip.ad.re.ss:port' or just 'port' or '/path/to/unix/socket'&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">listen_address</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">127.0.0.1:9000</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">listen_options</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Set listen(2) backlog&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">backlog</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">-1</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Set permissions for unix socket, if one used.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;In Linux read/write permissions must be set in order to allow connections from web server.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Many BSD-derrived systems allow connections regardless of permissions.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">owner</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">group</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">mode</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">0666</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Additional php.ini defines, specific to this pool of workers.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">php_defines</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">sendmail_path</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">/usr/sbin/sendmail -t -i</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">display_errors</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">1</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Unix user of processes&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">user</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">www</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Unix group of processes&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">group</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">www</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Process manager settings&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">pm</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Sets style of controling worker process count.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Valid values are 'static' and 'apache-like'&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">style</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">static</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Sets the limit on the number of simultaneous requests that will be served.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Equivalent to Apache MaxClients directive.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Used with any pm_style.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">max_children</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">128</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Settings group for 'apache-like' pm style&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">apache_like</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Sets the number of server processes created on startup.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Used only when 'apache-like' pm_style is selected&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">StartServers</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">20</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Sets the desired minimum number of idle server processes.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Used only when 'apache-like' pm_style is selected&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">MinSpareServers</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">5</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Sets the desired maximum number of idle server processes.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Used only when 'apache-like' pm_style is selected&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">MaxSpareServers</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">35</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;The timeout (in seconds) for serving a single request after which the worker process will be terminated&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;Should be used when 'max_execution_time' ini option does not stop script execution for some reason&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;'0s' means 'off'&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">request_terminate_timeout</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">0s</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;'0s' means 'off'&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">request_slowlog_timeout</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">0s</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;The log file for slow requests&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">slowlog</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">logs/slow.log</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Set open file desc rlimit&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">rlimit_files</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">51200</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Set max core size rlimit&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">rlimit_core</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">0</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Chroot to this directory at the start, absolute path&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">chroot</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Chdir to this directory at the start, absolute path&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">chdir</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Redirect workers' stdout and stderr into main error log.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;If not set, they will be redirected to /dev/null, according to FastCGI specs&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">catch_workers_output</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">yes</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;How much requests each process should execute before respawn.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;Useful to work around memory leaks in 3rd party libraries.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;For endless request processing please specify 0&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;Equivalent to PHP_FCGI_MAX_REQUESTS&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">max_requests</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">102400</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;Makes sense only with AF_INET listening socket.&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">allowed_clients</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">127.0.0.1</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;Pass environment variables like LD_LIBRARY_PATH&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;All $VARIABLEs are taken from current environment&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">environment</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">HOSTNAME</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">$HOSTNAME</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">PATH</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">/usr/local/bin:/usr/bin:/bin</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">TMP</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">/tmp</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">TMPDIR</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">/tmp</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">TEMP</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">/tmp</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">OSTYPE</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">$OSTYPE</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">MACHTYPE</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">$MACHTYPE</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">MALLOC_CHECK_</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">2</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">value</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">section</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br />&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">workers</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; <br />&nbsp; <br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">configuration</span><span style="color: Olive;">&gt;</span></div></div>
<p> </p>
<p> </p>
<p>　　9、启动php-cgi进程，监听127.0.0.1的9000端口，进程数为200（如果服务器内存小于3GB，可以只开启64个进程），用户为www：</p>
<div class="hl-surround"><div class="hl-main">ulimit -SHn 51200<br />/usr/local/webserver/php/sbin/php-fpm start</div></div>
<p>　　注：/usr/local/webserver/php/sbin/php-fpm还有其他参数，包括：start|stop|quit|restart|reload|logrotate，修改php.ini后不重启php-cgi，重新加载配置文件使用reload。</p>
<p>--------------------------------------------------------------------------------</p>
<p>　　三、安装Nginx 0.7.61<br />
　　1、安装Nginx所需的pcre库：</p>
<div class="hl-surround"><div class="hl-main">tar zxvf pcre-7.9.tar.gz<br />cd pcre-7.9/<br />./configure<br />make &amp;amp;&amp;amp; make install<br />cd ../</div></div>
<p>　　2、安装Nginx</p>
<div class="hl-surround"><div class="hl-main">tar zxvf nginx-0.7.61.tar.gz<br />cd nginx-0.7.61/<br />./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module<br />make &amp;amp;&amp;amp; make install<br />cd ../</div></div>
<p>　　3、创建Nginx日志目录</p>
<div class="hl-surround"><div class="hl-main">mkdir -p /data1/logs<br />chmod +w /data1/logs<br />chown -R www:www /data1/logs</div></div>
<p>　　4、创建Nginx配置文件<br />
　　①、在/usr/local/webserver/nginx/conf/目录中创建nginx.conf文件：</p>
<div class="hl-surround"><div class="hl-main">rm -f /usr/local/webserver/nginx/conf/nginx.conf<br />vi /usr/local/webserver/nginx/conf/nginx.conf</div></div>
<p>　　输入以下内容：</p>
<div class="hl-surround"><div class="hl-main">user www www;<br /><br />worker_processes 8;<br /><br />error_log /data1/logs/nginx_error.log crit;<br /><br />pid /usr/local/webserver/nginx/nginx.pid;<br /><br />#Specifies the value for maximum file descriptors that can be opened by this process.<br />worker_rlimit_nofile 51200;<br /><br />events<br />{<br />use epoll;<br />worker_connections 51200;<br />}<br /><br />http<br />{<br />include mime.types;<br />default_type application/octet-stream;<br /><br />#charset gb2312;<br /><br />server_names_hash_bucket_size 128;<br />client_header_buffer_size 32k;<br />large_client_header_buffers 4 32k;<br />client_max_body_size 8m;<br /><br />sendfile on;<br />tcp_nopush on;<br /><br />keepalive_timeout 60;<br /><br />tcp_nodelay on;<br /><br />fastcgi_connect_timeout 300;<br />fastcgi_send_timeout 300;<br />fastcgi_read_timeout 300;<br />fastcgi_buffer_size 64k;<br />fastcgi_buffers 4 64k;<br />fastcgi_busy_buffers_size 128k;<br />fastcgi_temp_file_write_size 128k;<br /><br />gzip on;<br />gzip_min_length 1k;<br />gzip_buffers 4 16k;<br />gzip_http_version 1.0;<br />gzip_comp_level 2;<br />gzip_types text/plain application/x-javascript text/css application/xml;<br />gzip_vary on;<br /><br />#limit_zone crawler $binary_remote_addr 10m;<br /><br />server<br />{<br />listen 80;<br />server_name blog.s135.com;<br />index index.html index.htm index.php;<br />root /data0/htdocs/blog;<br /><br />#limit_conn crawler 20;<br /><br />location ~ .*\.(php|php5)?$<br />{<br />#fastcgi_pass unix:/tmp/php-cgi.sock;<br />fastcgi_pass 127.0.0.1:9000;<br />fastcgi_index index.php;<br />include fcgi.conf;<br />}<br /><br />location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$<br />{<br />expires 30d;<br />}<br /><br />location ~ .*\.(js|css)?$<br />{<br />expires 1h;<br />}<br /><br />log_format access '$remote_addr - $remote_user [$time_local] &quot;$request&quot; '<br />'$status $body_bytes_sent &quot;$http_referer&quot; '<br />'&quot;$http_user_agent&quot; $http_x_forwarded_for';<br />access_log /data1/logs/access.log access;<br />}<br /><br />server<br />{<br />listen 80;<br />server_name www.s135.com;<br />index index.html index.htm index.php;<br />root /data0/htdocs/www;<br /><br />location ~ .*\.(php|php5)?$<br />{<br />#fastcgi_pass unix:/tmp/php-cgi.sock;<br />fastcgi_pass 127.0.0.1:9000;<br />fastcgi_index index.php;<br />include fcgi.conf;<br />}<br /><br />log_format wwwlogs '$remote_addr - $remote_user [$time_local] &quot;$request&quot; '<br />'$status $body_bytes_sent &quot;$http_referer&quot; '<br />'&quot;$http_user_agent&quot; $http_x_forwarded_for';<br />access_log /data1/logs/wwwlogs.log wwwlogs;<br />}<br /><br />server<br />{<br />listen 80;<br />server_name status.blog.s135.com;<br /><br />location / {<br />stub_status on;<br />access_log off;<br />}<br />}<br />}</div></div>
<p>　　②、在/usr/local/webserver/nginx/conf/目录中创建fcgi.conf文件：</p>
<div class="hl-surround"><div class="hl-main">vi /usr/local/webserver/nginx/conf/fcgi.conf</div></div>
<p>　　输入以下内容：</p>
<blockquote><p>fastcgi_param GATEWAY_INTERFACE CGI/1.1;<br />
fastcgi_param SERVER_SOFTWARE nginx;</p>
<p>fastcgi_param QUERY_STRING $query_string;<br />
fastcgi_param REQUEST_METHOD $request_method;<br />
fastcgi_param CONTENT_TYPE $content_type;<br />
fastcgi_param CONTENT_LENGTH $content_length;</p>
<p>fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br />
fastcgi_param SCRIPT_NAME $fastcgi_script_name;<br />
fastcgi_param REQUEST_URI $request_uri;<br />
fastcgi_param DOCUMENT_URI $document_uri;<br />
fastcgi_param DOCUMENT_ROOT $document_root;<br />
fastcgi_param SERVER_PROTOCOL $server_protocol;</p>
<p>fastcgi_param REMOTE_ADDR $remote_addr;<br />
fastcgi_param REMOTE_PORT $remote_port;<br />
fastcgi_param SERVER_ADDR $server_addr;<br />
fastcgi_param SERVER_PORT $server_port;<br />
fastcgi_param SERVER_NAME $server_name;</p>
<p># PHP only, required if PHP was built with --enable-force-cgi-redirect<br />
fastcgi_param REDIRECT_STATUS 200;</p></blockquote>
<p>　　5、启动Nginx</p>
<div class="hl-surround"><div class="hl-main">ulimit -SHn 51200<br />/usr/local/webserver/nginx/sbin/nginx</div></div>
<p>--------------------------------------------------------------------------------</p>
<p>　　四、配置开机自动启动Nginx + PHP</p>
<div class="hl-surround"><div class="hl-main">vi /etc/rc.local</div></div>
<p>　　在末尾增加以下内容：</p>
<blockquote><p>ulimit -SHn 51200<br />
/usr/local/webserver/php/sbin/php-fpm start<br />
/usr/local/webserver/nginx/sbin/nginx</p></blockquote>
<p>--------------------------------------------------------------------------------</p>
<p>　　五、优化Linux内核参数</p>
<div class="hl-surround"><div class="hl-main">vi /etc/sysctl.conf</div></div>
<p>　　在末尾增加以下内容：</p>
<blockquote><p># Add<br />
net.ipv4.tcp_max_syn_backlog = 65536<br />
net.core.netdev_max_backlog = 32768<br />
net.core.somaxconn = 32768</p>
<p>net.core.wmem_default = 8388608<br />
net.core.rmem_default = 8388608<br />
net.core.rmem_max = 16777216<br />
net.core.wmem_max = 16777216</p>
<p>net.ipv4.tcp_timestamps = 0<br />
net.ipv4.tcp_synack_retries = 2<br />
net.ipv4.tcp_syn_retries = 2</p>
<p>net.ipv4.tcp_tw_recycle = 1<br />
#net.ipv4.tcp_tw_len = 1<br />
net.ipv4.tcp_tw_reuse = 1</p>
<p>net.ipv4.tcp_mem = 94500000 915000000 927000000<br />
net.ipv4.tcp_max_orphans = 3276800</p>
<p>#net.ipv4.tcp_fin_timeout = 30<br />
#net.ipv4.tcp_keepalive_time = 120<br />
net.ipv4.ip_local_port_range = 1024 65535</p></blockquote>
<p>　　使配置立即生效：</p>
<div class="hl-surround"><div class="hl-main">/sbin/sysctl -p</div></div>
<p>--------------------------------------------------------------------------------</p>
<p>　　六、在不停止Nginx服务的情况下平滑变更Nginx配置<br />
　　1、修改/usr/local/webserver/nginx/conf/nginx.conf配置文件后，请执行以下命令检查配置文件是否正确：</p>
<div class="hl-surround"><div class="hl-main">/usr/local/webserver/nginx/sbin/nginx -t</div></div>
<p>　　如果屏幕显示以下两行信息，说明配置文件正确：<br />
　　the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok<br />
　　the configuration file /usr/local/webserver/nginx/conf/nginx.conf was tested successfully</p>
<p>　　2、这时，输入以下命令查看Nginx主进程号：</p>
<div class="hl-surround"><div class="hl-main">ps -ef | grep &quot;nginx: master process&quot; | grep -v &quot;grep&quot; | awk -F ' ' '{print $2}'</div></div>
<p>　　屏幕显示的即为Nginx主进程号，例如：<br />
　　6302<br />
　　这时，执行以下命令即可使修改过的Nginx配置文件生效：</p>
<div class="hl-surround"><div class="hl-main">kill -HUP 6302</div></div>
<p>　　或者无需这么麻烦，找到Nginx的Pid文件：</p>
<div class="hl-surround"><div class="hl-main">kill -HUP `cat /usr/local/webserver/nginx/nginx.pid`</div></div>
<p>--------------------------------------------------------------------------------</p>
<p>　　七、编写每天定时切割Nginx日志的脚本<br />
　　1、创建脚本/usr/local/webserver/nginx/sbin/cut_nginx_log.sh</p>
<div class="hl-surround"><div class="hl-main">vi /usr/local/webserver/nginx/sbin/cut_nginx_log.sh</div></div>
<p>　　输入以下内容：</p>
<div class="hl-surround"><div class="hl-main">#!/bin/bash<br /># This script run at 00:00<br /><br /># The Nginx logs path<br />logs_path=&quot;/usr/local/webserver/nginx/logs/&quot;<br /><br />mkdir -p ${logs_path}$(date -d &quot;yesterday&quot; +&quot;%Y&quot;)/$(date -d &quot;yesterday&quot; +&quot;%m&quot;)/<br />mv ${logs_path}access.log ${logs_path}$(date -d &quot;yesterday&quot; +&quot;%Y&quot;)/$(date -d &quot;yesterday&quot; +&quot;%m&quot;)/access_$(date -d &quot;yesterday&quot; +&quot;%Y%m%d&quot;).log<br />kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`</div></div>
<p>　　2、设置crontab，每天凌晨00:00切割nginx访问日志</p>
<div class="hl-surround"><div class="hl-main">crontab -e</div></div>
<p>　　输入以下内容：</p>
<blockquote><p>00 00 * * * /bin/bash /usr/local/webserver/nginx/sbin/cut_nginx_log.sh</p></blockquote>
<p>--------------------------------------------------------------------------------</p>
<p>　　本文若有小的修改，会第一时间在以下网址发布：<br />
　　http://blog.s135.com/nginx_php_v5/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090628/1338.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP取二进制文件头快速判断文件类型</title>
		<link>http://www.21andy.com/blog/20090624/1337.html</link>
		<comments>http://www.21andy.com/blog/20090624/1337.html#comments</comments>
		<pubDate>Wed, 24 Jun 2009 03:12:02 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[二进制]]></category>
		<category><![CDATA[文件类型]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/?p=1337</guid>
		<description><![CDATA[&#60;?php$filename = &#34;D:\\296.mid&#34;;$file&#160; &#160; &#160;= fopen($filename, &#34;rb&#34;);$bin&#160; &#160; &#160; = fread($file, 2); //只读2字节fclose($file);$strInfo&#160; = @unpack(&#34;c2chars&#34;, $bin);$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);$fileType = '';switch ($typeCode) {&#160;&#160; &#160;case 7790:&#160;&#160; &#160; &#160; &#160;$fileType = 'exe';&#160;&#160; &#160; &#160; &#160;break;&#160;&#160; &#160;case 7784:&#160;&#160; &#160; &#160; &#160;$fileType = 'midi';&#160;&#160; &#160; &#160; &#160;break;&#160;&#160; &#160;case 8297:&#160;&#160; &#160; &#160; &#160;$fileType = 'rar';&#160;&#160; &#160; &#160; &#160;break;&#160;&#160; &#160;case 255216:&#160;&#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$filename</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">D:</span><span style="color: Navy;">\\</span><span style="color: Red;">296.mid</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$file</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp;= </span><span style="color: Blue;">fopen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$filename</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">rb</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$bin</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; = </span><span style="color: Blue;">fread</span><span style="color: Olive;">(</span><span style="color: #00008b;">$file</span><span style="color: Gray;">, </span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//只读2字节</span><span style="color: Gray;"><br /></span><span style="color: Blue;">fclose</span><span style="color: Olive;">(</span><span style="color: #00008b;">$file</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$strInfo</span><span style="color: Gray;">&nbsp; = @</span><span style="color: Blue;">unpack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">c2chars</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #00008b;">$bin</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$typeCode</span><span style="color: Gray;"> = </span><span style="color: Blue;">intval</span><span style="color: Olive;">(</span><span style="color: #00008b;">$strInfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">chars1</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: #00008b;">$strInfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">chars2</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$fileType</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">''</span><span style="color: Gray;">;<br /></span><span style="color: Green;">switch</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$typeCode</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">case</span><span style="color: Gray;"> </span><span style="color: Maroon;">7790</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$fileType</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">exe</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">case</span><span style="color: Gray;"> </span><span style="color: Maroon;">7784</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$fileType</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">midi</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">case</span><span style="color: Gray;"> </span><span style="color: Maroon;">8297</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$fileType</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">rar</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">case</span><span style="color: Gray;"> </span><span style="color: Maroon;">255216</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$fileType</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">jpg</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">case</span><span style="color: Gray;"> </span><span style="color: Maroon;">7173</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$fileType</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">gif</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">case</span><span style="color: Gray;"> </span><span style="color: Maroon;">6677</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$fileType</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">bmp</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">case</span><span style="color: Gray;"> </span><span style="color: Maroon;">13780</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$fileType</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">png</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">default</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">unknown</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">this is a(an) </span><span style="color: #8b0000;">'</span><span style="color: Gray;">.</span><span style="color: #00008b;">$fileType</span><span style="color: Gray;">.</span><span style="color: #8b0000;">'</span><span style="color: Red;"> file:</span><span style="color: #8b0000;">'</span><span style="color: Gray;">.</span><span style="color: #00008b;">$typeCode</span><span style="color: Gray;">;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090624/1337.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>这次搞Google的不是百度,而是...</title>
		<link>http://www.21andy.com/blog/20090622/1335.html</link>
		<comments>http://www.21andy.com/blog/20090622/1335.html#comments</comments>
		<pubDate>Mon, 22 Jun 2009 14:22:21 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/?p=1335</guid>
		<description><![CDATA[前几天央视1套强力打击了一下Google.
新闻联播+焦点访谈, 搞得Google智能提示的搜索功能马上就不见了.
很多人把这事怪到百度头上, 以为百度是幕后的**...
其实这次搞Google的不是百度,而是咱很河蟹的"绿坝 花季护航"!
这无耻的东西, 打这几个字我都觉得恶心
无耻的剽窃还居然申请国家专利!
2009年7月1日以后, 将强制在所有国内品牌机电脑上预装!
更多内容, 请自己搜索, 看看你就明白为什么这次搞Google的是它了
这是一次营销事件, 旨在告诉人们 "网络很黄很暴力!"
接着, 就会告诉人们"绿坝可以!".....
又把人民群众当SB
]]></description>
			<content:encoded><![CDATA[<p>前几天央视1套强力打击了一下Google.<br />
新闻联播+焦点访谈, 搞得Google智能提示的搜索功能马上就不见了.<br />
很多人把这事怪到百度头上, 以为百度是幕后的**...</p>
<p>其实这次搞Google的不是百度,而是咱很河蟹的"绿坝 花季护航"!</p>
<p>这无耻的东西, 打这几个字我都觉得恶心</p>
<p>无耻的剽窃还居然申请国家专利!<br />
2009年7月1日以后, 将强制在所有国内品牌机电脑上预装!</p>
<p>更多内容, 请自己搜索, 看看你就明白为什么这次搞Google的是它了</p>
<p>这是一次营销事件, 旨在告诉人们 "网络很黄很暴力!"</p>
<p>接着, 就会告诉人们"绿坝可以!".....</p>
<p>又把人民群众当SB</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090622/1335.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>2009最佳PHP框架 Yii</title>
		<link>http://www.21andy.com/blog/20090616/1333.html</link>
		<comments>http://www.21andy.com/blog/20090616/1333.html#comments</comments>
		<pubDate>Tue, 16 Jun 2009 07:22:42 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP框架]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[框架]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/?p=1333</guid>
		<description><![CDATA[Yii是一个美国华人开发的PHP框架, 以下是Yii官方网站上自己的介绍
是的，它就是Yii。一个高性能的基于组件的框架，是PHP开发大型Web应用程序的最佳选择。Yii配备完整的丰富的功能，包括MVC，DAO/ActiveRecord，I18N/L10N ，缓存，基于AJAX的jQuery支持，认证和基于角色的访问控制，辅助生成工具，输入验证，组件，事件，主题， Web服务，等等。严格地按照OOP编写，Yii易于使用，并且是非常灵活和可扩展。
官方网站: http://www.yiiframework.com/
Yii 是什么
Yii 是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。它将 Web 编程中的可重用性发挥到极致，能够显著加速开发进程。Yii（读作“易”）代表简单(easy)、高效(efficient)、可扩展(extensible)。
需求
要运行一个基于 Yii 开发的 Web 应用，你需要一个支持 PHP 5.1.0 （或更高版本）的 Web 服务器。
对于想使用 Yii 的开发者而言，熟悉面向对象编程(OOP)会使开发更加轻松，因为 Yii 就是一个纯 OOP 框架。
Yii 适合做什么？
Yii 是一个通用 Web 编程框架，能够开发任何类型的 Web 应用。它是轻量级的，又装配了很好很强大的缓存组件，因此尤其适合开发大流量的应用，比如门户、论坛、内容管理系统(CMS)、电子商务系统，等等。
Yii 和其它框架比起来怎样？
和大多数 PHP 框架一样，Yii 是一个 MVC 框架。
Yii 以性能优异、功能丰富、文档清晰而胜出其它框架。它从一开始就为严谨的 Web 应用开发而精心设计，不是某个项目的副产品或第三方代码的组合，而是融合了作者丰富的 Web 应用开发经验和其它热门 Web 编程框架（或应用）优秀思想的结晶。
以前刚出来的时候, 文档不全, 现在挺全了.
官方论坛里还有中文版块 http://www.yiiframework.com/forum/index.php/board,11.0.html
文档也有中文版 http://www.yiiframework.com/doc/guide/zh_cn/index
优点实在太多了, 怎一个爽字了得! 而且还比CodeIgniter快

现在开始, 从CodeIgniter全面转向Yii
来看看Yii和Codeigniter的流行度对比

不过现在用户好像不够多, 估计在未来一年里会多起来.
不知道能否超越CodeIgniter, [...]]]></description>
			<content:encoded><![CDATA[<p>Yii是一个美国华人开发的PHP框架, 以下是Yii官方网站上自己的介绍</p>
<blockquote><p>是的，它就是Yii。一个高性能的基于组件的框架，是PHP开发大型Web应用程序的最佳选择。Yii配备完整的丰富的功能，包括MVC，DAO/ActiveRecord，I18N/L10N ，缓存，基于AJAX的jQuery支持，认证和基于角色的访问控制，辅助生成工具，输入验证，组件，事件，主题， Web服务，等等。严格地按照OOP编写，Yii易于使用，并且是非常灵活和可扩展。</p></blockquote>
<p>官方网站: <a href="http://www.yiiframework.com/">http://www.yiiframework.com/</a></p>
<blockquote><p>Yii 是什么<br />
Yii 是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。它将 Web 编程中的可重用性发挥到极致，能够显著加速开发进程。Yii（读作“易”）代表简单(easy)、高效(efficient)、可扩展(extensible)。</p>
<p>需求<br />
要运行一个基于 Yii 开发的 Web 应用，你需要一个支持 PHP 5.1.0 （或更高版本）的 Web 服务器。</p>
<p>对于想使用 Yii 的开发者而言，熟悉面向对象编程(OOP)会使开发更加轻松，因为 Yii 就是一个纯 OOP 框架。</p>
<p>Yii 适合做什么？<br />
Yii 是一个通用 Web 编程框架，能够开发任何类型的 Web 应用。它是轻量级的，又装配了很好很强大的缓存组件，因此尤其适合开发大流量的应用，比如门户、论坛、内容管理系统(CMS)、电子商务系统，等等。</p>
<p>Yii 和其它框架比起来怎样？<br />
和大多数 PHP 框架一样，Yii 是一个 MVC 框架。</p>
<p>Yii 以性能优异、功能丰富、文档清晰而胜出其它框架。它从一开始就为严谨的 Web 应用开发而精心设计，不是某个项目的副产品或第三方代码的组合，而是融合了作者丰富的 Web 应用开发经验和其它热门 Web 编程框架（或应用）优秀思想的结晶。</p></blockquote>
<p>以前刚出来的时候, 文档不全, 现在挺全了.</p>
<p>官方论坛里还有中文版块 <a href="http://www.yiiframework.com/forum/index.php/board,11.0.html">http://www.yiiframework.com/forum/index.php/board,11.0.html</a></p>
<p>文档也有中文版 <a href="http://www.yiiframework.com/doc/guide/zh_cn/index">http://www.yiiframework.com/doc/guide/zh_cn/index</a></p>
<p>优点实在太多了, 怎一个爽字了得! 而且还比CodeIgniter快</p>
<p><a href="http://www.21andy.com/blog/upload/2009/0616/9a41b055712191ef.png" rel="lightbox"><img src="http://www.21andy.com/blog/upload/2009/0616/9a41b055712191ef_thumb.png" alt="2009最佳PHP框架 Yii 9a41b055712191ef thumb"  title="2009最佳PHP框架 Yii" /></a></p>
<p>现在开始, 从CodeIgniter全面转向Yii</p>
<p>来看看Yii和Codeigniter的流行度对比</p>
<p><img title="Yii VS Codeigniter" src="http://www.google.com/trends/viz?q=yii,codeigniter&amp;graph=weekly_img&amp;sa=N" alt="2009最佳PHP框架 Yii " width="580" height="260" /></p>
<p>不过现在用户好像不够多, 估计在未来一年里会多起来.<br />
不知道能否超越CodeIgniter, 也许由于难度比CodeIgniter大得多, 可能不能.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090616/1333.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>最佳CodeIgniter Auth扩展Tank Auth</title>
		<link>http://www.21andy.com/blog/20090616/1332.html</link>
		<comments>http://www.21andy.com/blog/20090616/1332.html#comments</comments>
		<pubDate>Mon, 15 Jun 2009 16:47:06 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[Auth]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Tank Auth]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/?p=1332</guid>
		<description><![CDATA[先给下载地址:
Tank Auth  http://www.konyukhov.com/soft/tank_auth/
这2天整CodeIgniter的Auth差点没把我累死
先后看了FreakAuth, dx_auth, Redux Auth, BackendPro,auth_library
选定了DX auth, 在研究的过程中, 看到 What Code Igniter authentication library is best? 这篇文章, 几乎以上所有的auth都有缺点
作者还提到了20件Auth应该做到的事情, 见下面的引用
在看完这篇文章后, 我先择了Redux Auth, 目前相对来说它做得最好.
可就在我研究Redux Auth的时候, 又找到了Tank Auth, 是DX Auth的改进精简版, 可惜拿掉了DX Auth的Role部份, 用户资料部份也有待完善, 如果要拿来用, 得自己动动手.等作者还是真难.
似乎作者已经一二个月没更新了, 也没了动静.
目前来看, Tank Auth是最好的. 希望不要成太监了

DX Auth
Pros

Very full featured
Medium footprint (25+ files), but manages to feel quite slim
Excellent documentation, although some is in [...]]]></description>
			<content:encoded><![CDATA[<p>先给下载地址:</p>
<p><strong>Tank Auth </strong> <a href="http://www.konyukhov.com/soft/tank_auth/">http://www.konyukhov.com/soft/tank_auth/</a></p>
<p>这2天整CodeIgniter的Auth差点没把我累死</p>
<p>先后看了FreakAuth, dx_auth, Redux Auth, BackendPro,auth_library</p>
<p>选定了DX auth, 在研究的过程中, 看到 <a href="http://stackoverflow.com/questions/346980/what-code-igniter-authentication-library-is-best" target="_blank">What Code Igniter authentication library is best?</a> 这篇文章, 几乎以上所有的auth都有缺点</p>
<p>作者还提到了20件Auth应该做到的事情, 见下面的引用</p>
<p>在看完这篇文章后, 我先择了Redux Auth, 目前相对来说它做得最好.</p>
<p>可就在我研究Redux Auth的时候, 又找到了Tank Auth, 是DX Auth的改进精简版, 可惜拿掉了DX Auth的Role部份, 用户资料部份也有待完善, 如果要拿来用, 得自己动动手.等作者还是真难.</p>
<p>似乎作者已经一二个月没更新了, 也没了动静.</p>
<p>目前来看, Tank Auth是最好的. 希望不要成太监了</p>
<blockquote>
<h2>DX Auth</h2>
<p>Pros</p>
<ul>
<li>Very full featured</li>
<li>Medium footprint (25+ files), but manages to feel quite slim</li>
<li>Excellent documentation, although some is in slightly broken English</li>
<li>Language file support</li>
<li>reCAPTCHA supported</li>
<li>Hooks into CI's validation system</li>
<li>Activation emails</li>
<li>Unactivated accounts auto-expire</li>
<li>Suggests grc.com for salts (not bad for a PRNG)</li>
<li>Banning with stored 'reason' strings</li>
<li>Simple yet effective error handling</li>
</ul>
<p>Cons</p>
<ul>
<li>Only lets users 'reset' a lost password (rather than letting them pick a new one upon reactivation)</li>
<li>Homebrew pseudo-event model - good intention, but misses the mark</li>
<li>Two password fields in the user table, bad style</li>
<li>Uses two separate user tables (one for 'temp' users - ambiguous and redundant)</li>
<li>Uses potentially unsafe md5 hashing</li>
<li>Failed login attempts only stored by IP, not by username - unsafe!</li>
<li>Autologin key not hashed in the database - practically as unsafe as storing passwords in cleartext!</li>
<li>Role system is a complete mess: is_admin function with hard-coded role names, is_role a complete mess, check_uri_permissions is a mess, the whole permissions table is a bad idea (a URI can change and render pages unprotected; permissions should always be stored exactly where the sensitive logic is). Dealbreaker!</li>
<li>Includes a native (poor) CAPTCHA</li>
<li>reCAPTCHA function interface is messy</li>
</ul>
<h2>FreakAuth Light</h2>
<p>Pros</p>
<ul>
<li>Very full featured</li>
<li>Mostly quite well documented code</li>
<li>Separation of user and profile data is a nice touch</li>
<li>Hooks into CI's validation system</li>
<li>Activation emails</li>
<li>Language file support</li>
<li>Actively developed</li>
</ul>
<p>Cons</p>
<ul>
<li>Feels a bit bloated (50+ files)</li>
<li>And yet it lacks automatic cookie login (!)</li>
<li>Doesn't support logins with both username and password</li>
<li>Seems to have issues with UTF-8 characters</li>
<li>Requires a lot of autoloading (impeding performance)</li>
<li>Badly micromanaged config file</li>
<li>Terrible View-Controller separation, with lots of program logic in views and output hard-coded into controllers. Dealbreaker!</li>
<li>Poor HTML code in the included views</li>
<li>Includes substandard CAPTCHA</li>
<li>Commented debug echoes everywhere</li>
<li>Forces a specific folder structure</li>
<li>Forces a specific Ajax library (can be switched, but shouldn't be there in the first place)</li>
<li>No max limit on login attempts - VERY unsafe! Dealbreaker!</li>
<li>Hijacks form validation</li>
<li>Uses potentially unsafe md5 hashing</li>
</ul>
<h2>pc_user</h2>
<p>Pros</p>
<ul>
<li>Good feature set for its tiny footprint</li>
<li>Lightweight, no bloat (3 files)</li>
<li>Elegant automatic cookie login</li>
<li>Comes with optional test implementation (nice touch)</li>
</ul>
<p>Cons</p>
<ul>
<li>Uses the old CI database syntax (less safe)</li>
<li>Doesn't hook into CI's validation system</li>
<li>Kinda unintuitive status (role) system (indexes upside down - impractical)</li>
<li>Uses potentially unsafe sha1 hashing</li>
</ul>
<h2>Fresh Powered</h2>
<p>Pros</p>
<ul>
<li>Small footprint (6 files)</li>
</ul>
<p>Cons</p>
<ul>
<li>Lacks a lot of essential features. Dealbreaker!</li>
<li>Everything is hard-coded. Dealbreaker!</li>
</ul>
<h2>Redux</h2>
<p>Pros</p>
<ul>
<li>Tiny footprint, no bloat (3 files)</li>
<li>Excellent documentation</li>
<li>Database normalized to 3rd normal form (nice touch)</li>
<li>Activation emails</li>
<li>Sleek coding style</li>
<li>Suggests grc.com for salts (not bad for a PRNG)</li>
</ul>
<p>Cons</p>
<ul>
<li>Requires autoloading (impeding performance)</li>
<li>Uses the inherently unsafe concept of 'security questions'. Dealbreaker!</li>
<li>Return types are a bit of a hodgepodge of true, false, error and success codes</li>
<li>Doesn't hook into CI's validation system</li>
<li>Doesn't allow a user to resend a 'lost password' code</li>
</ul>
<p><strong>EDIT</strong>: <em>Mathew Davies, who develops Redux Auth, says a bunch of the cons in my list (including the security questions dealbreaker) have been fixed in the latest beta, so that should definitely be worth checking out</em></p>
<h2>SimpleLoginSecure</h2>
<p>Pros</p>
<ul>
<li>Tiny footprint (4 files)</li>
<li>Minimalistic, absolutely no bloat</li>
<li>Uses phpass for hashing (excellent)</li>
</ul>
<p>Cons</p>
<ul>
<li>Only login, logout, create and delete</li>
<li>Lacks a lot of essential features. Dealbreaker!</li>
<li>More of a starting point than a library</li>
</ul>
</blockquote>
<blockquote>
<h2>Authentication for CodeIgniter done <em>right</em></h2>
<p>Here's my MINIMAL required list of features from an authentication library. It also happens to be a subset of my own library's feature list ;)</p>
<ol>
<li>Tiny footprint with optional test implementation</li>
<li>Full documentation</li>
<li>No autoloading required. Just-in-time loading of libraries for performance</li>
<li>Language file support; no hard-coded strings</li>
<li>reCAPTCHA supported but optional</li>
<li>Recommended TRUE random salt generation (e.g. using random.org or random.irb.hr)</li>
<li>Optional add-ons to support 3rd party login (OpenID, Facebook Connect, Google Account, etc.)</li>
<li>Login using either username or email</li>
<li>Separation of user and profile data</li>
<li>Emails for activation and lost passwords</li>
<li>Automatic cookie login feature</li>
<li>Configurable phpass for hashing (properly salted of course!)</li>
<li>Hashing of passwords</li>
<li>Hashing of autologin codes</li>
<li>Hashing of lost password codes</li>
<li>Hooks into CI's validation system</li>
<li>NO security questions!</li>
<li>Enforced strong password policy server-side, with optional client-side (Javascript) validator</li>
<li>Enforced maximum number of failed login attempts with <strong>BEST PRACTICES countermeasures</strong> against both dictionary and DoS attacks!</li>
<li>All database access done through prepared (bound) statements!</li>
</ol>
<p>Note: those last few points are <em>not</em> super-high-security overkill that you don't need for your web application. <strong>If an authentication library doesn't meet these security standards 100%, DO NOT USE IT!</strong></p></blockquote>
<p>另把Tank Auth的内容COPY过来</p>
<h1>Tank Auth</h1>
<p>Tank Auth is an authorization library for PHP-framework <a href="http://codeigniter.com/">CodeIgniter</a>. It's based on <a href="http://dexcell.shinsengumiteam.com/dx_auth/">DX Auth</a>, althouth the code was seriously reworked.</p>
<p><a style="FONT-SIZE: 1.2em" href="http://www.21andy.com/blog/wp-admin/tank_auth.zip">Download Tank Auth 1.0.3</a></p>
<h2 id="features">Features</h2>
<p>The key points of the library are:</p>
<h3>It's simple</h3>
<ul>
<li>Basic auth options (login, logout, register, unregister).</li>
<li>Very compact (less than 20 files and 4 DB-tables).</li>
<li>Username is optional, only email is obligatory.</li>
</ul>
<h3>It's secure</h3>
<ul>
<li>Using <a href="http://www.openwall.com/phpass/">phpass</a> library for password hashing (instead of unsafe md5).</li>
<li>Counting login attempt for bruteforce preventing (optional). Failed login attempts determined by IP and by username.</li>
<li>Logging last login IP-address and time (optional).</li>
<li>CAPTCHA for registration and repetitive login attempt (optional).</li>
<li>Unactivated accounts and forgotten password requests auto-expire.</li>
</ul>
<h3>It's easy to manage</h3>
<ul>
<li>Strict MVC model: controller for controlling, views for representation and library as model interface.</li>
<li>Language file support.</li>
<li>View files contain only necessary HTML code without redundant decoration.</li>
<li>Most of the features are optional and can be tuned or switched-off in well-documented config file.</li>
</ul>
<h3>It's full featured</h3>
<ul>
<li>Login using username, email address or both (depending on config settings).</li>
<li>Registration is instant or after activation by email (optional).</li>
<li>"Remember me" option.</li>
<li>Forgot password (letting users pick a new password upon reactivation).</li>
<li>Change password or email for registered users.</li>
<li>Email can be changed even BEFORE account is activated.</li>
<li>Ban user (optional).</li>
<li>User Profile (optional).</li>
<li>CAPTCHA support (CI-native and reCAPTCHA are available).</li>
<li>HTML or plain-text emails.</li>
</ul>
<h2 id="install">Installing Tank Auth</h2>
<ol>
<li>Download the latest version of the library.</li>
<li>Unzip the package.</li>
<li>Copy the <strong>application</strong> folder content to your CI <strong>application</strong> folder.</li>
<li>Copy the <strong>captcha</strong> folder to your CI folder. Make sure this folder is writable by web server.</li>
<li>Install database schema into your MySQL database.</li>
<li>Open the <strong>application/config/config.php</strong> file in your CI installation and change <strong>$config['sess_use_database']</strong> value to <strong>TRUE</strong>.</li>
</ol>
<p>That's it!</p>
<p>Please don't forget to look into config files (<strong>tank_auth.php</strong> and <strong>email.php</strong>) if something will go wrong. The library should work perfectly right after installation, but depending on your server condition and your own needs some options would better be changed.</p>
<h2 id="nutshell">The library in a nutshell</h2>
<p>The library uses MVC model, which means that all database-related methods are incapsulated in model files, and the library itself is used as interface to these methods. A controller (<strong>auth</strong>) dispatches incoming requests, calls the library methods and renders corresponding views (to show in browser or to send as emails). The controller includes the following methods:</p>
<ul>
<li><strong>login</strong>: Login user on the site. If login is successful and user account is activated, s/he is redirected to the home page. If account is not activated, then <strong>send_again</strong> is invoked (see below). In case of login failure user remains on the same page.</li>
<li><strong>logout</strong>: Logout user.</li>
<li><strong>register</strong>: Register user on the site. If registration is successful, a new user account is created. If <strong>email_activation</strong> flag in config-file is set to TRUE, then this account have to be activated by clicking special link sent by email; otherwise it is activated already. Please notice: after registration user remains unauthorised; to authorize login is still required.</li>
<li><strong>send_again</strong>: Send activation email again, to the same or new email address. This method is invoked every time after non-activated user logins on the site. It may be useful when user didn't receive activation mail sent on registration due to problem with mailbox or a misprint in email address. User may change their email or leave it as is.</li>
<li><strong>activate</strong>: Activate user account. Normally this method is invoked by clicking a link in activation email. User is verified by user Id and authentication code in the URL.</li>
<li><strong>forgot_password</strong>: Generate special reset code (to change password) and send it to user. Obviously this method may be used when user has forgotten their password.</li>
<li><strong>reset_password</strong>: Replace user password (forgotten) with a new one (set by user). The method can be called by clicking on link in mail. User is verified by user Id and authentication code in the URL.</li>
<li><strong>change_password</strong>: "Normal" password changing (as compared with resetting forgotten password). Can be called only when user is authorized and activated. For higher security user's old password is needed.</li>
<li><strong>change_email</strong>: Change user's email. Can be called only when user is authorized and activated. For higher security user's password is required. The new email won't be applied until it is activated by clicking a link in a mail sent to this email address.</li>
<li><strong>reset_email</strong>: Activate new email address and replace user's email with a new one. This method can be called by clicking on link in mail. User is verified by user Id and authentication code in the URL.</li>
<li><strong>unregister</strong>: Delete user account. Can be called only when user is authorized and activated. For higher security user's password is required.</li>
</ul>
<p>Since the <strong>auth</strong> controller does all the management of user account (including login and logout), so it unlikely that you will have to call the most of the library methods directly. But some of them definitely you will:</p>
<ul>
<li><strong>is_logged_in</strong>: Check if user authorized on the site.</li>
<li><strong>get_user_id</strong>: Get user_id if user is authorized on the site, FALSE otherwise.</li>
<li><strong>get_username</strong>: Get username for authorized user, FALSE otherwise. This method is meaningless if username is not used on registration (in this case it returns an empty string for every user).</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090616/1332.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最佳CodeIgniter ORM解决方案 DataMapper</title>
		<link>http://www.21andy.com/blog/20090616/1330.html</link>
		<comments>http://www.21andy.com/blog/20090616/1330.html#comments</comments>
		<pubDate>Mon, 15 Jun 2009 16:25:28 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[DataMapper]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/?p=1330</guid>
		<description><![CDATA[最佳CodeIgniter ORM解决方案

DataMapper is an Object Relational Mapper written in PHP for CodeIgniter. It is designed to map your Database tables into easy to work with objects, fully aware of the relationships between each other.
官方网站: http://www.overzealous.com/dmz/
下载地址: http://www.overzealous.com/dmz/pages/download.html
]]></description>
			<content:encoded><![CDATA[<p><strong>最佳CodeIgniter ORM解决方案</strong></p>
<p><img title="最佳CodeIgniter ORM解决方案 DataMapper OverZealous Edition" src="http://www.21andy.com/blog/upload/2009/0615/69a56c28545813c1.png" border="0" alt="最佳CodeIgniter ORM解决方案 DataMapper OverZealous Edition" hspace="10" vspace="10" width="243" height="150" /></p>
<p>DataMapper is an <strong>Object Relational Mapper </strong>written in PHP for CodeIgniter. It is designed to map your Database tables into easy to work with objects, fully aware of the relationships between each other.</p>
<p>官方网站: <a href="http://www.overzealous.com/dmz/">http://www.overzealous.com/dmz/</a><br />
下载地址: <a href="http://www.overzealous.com/dmz/pages/download.html">http://www.overzealous.com/dmz/pages/download.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090616/1330.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>总结!最佳jQuery窗口插件jqModal</title>
		<link>http://www.21andy.com/blog/20090615/1328.html</link>
		<comments>http://www.21andy.com/blog/20090615/1328.html#comments</comments>
		<pubDate>Mon, 15 Jun 2009 07:18:54 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[Dialog]]></category>
		<category><![CDATA[Ext]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Modal]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[窗口]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/?p=1328</guid>
		<description><![CDATA[这篇的内容太长
http://www.21andy.com/blog/20090611/1324.html
我来总结一下
经过我这几天的测试和研究, 最好的是jqModal
jqModal
http://dev.iceburg.net/jquery/jqModal/
jqModal文件小, 速度快, 可定制性非常好, 我已经用它模仿Ext的窗口做了一个,满意度100%, 支持拖动, 拉伸窗口, 上个图给大家看看

其他几个没选的原因:
boxy
可以说非常好, 在Opera,Firefox下表现很好
可惜,可惜在IE下响应很慢! 而且文件有点大.
FancyBox
可定制性太差, 文档不全, 抛弃
其他的不用看了!!!
]]></description>
			<content:encoded><![CDATA[<p>这篇的内容太长<br />
<a href="http://www.21andy.com/blog/20090611/1324.html">http://www.21andy.com/blog/20090611/1324.html</a></p>
<p>我来总结一下</p>
<p>经过我这几天的测试和研究, 最好的是<strong>jqModal</strong></p>
<blockquote><p><strong>jqModal<br />
</strong><a href="http://dev.iceburg.net/jquery/jqModal/#examples">http://dev.iceburg.net/jquery/jqModal/</a></p></blockquote>
<p><strong>jqModal</strong>文件小, 速度快, 可定制性非常好, 我已经用它模仿Ext的窗口做了一个,满意度100%, 支持拖动, 拉伸窗口, 上个图给大家看看</p>
<p><img title="ext_box" src="http://www.21andy.com/blog/uploads/2009/06/ext_box.png" alt="总结!最佳jQuery窗口插件jqModal ext box" width="520" height="369" /></p>
<p>其他几个没选的原因:</p>
<p><strong>boxy<br />
</strong>可以说非常好, 在Opera,Firefox下表现很好<br />
可惜,可惜在IE下响应很慢! 而且文件有点大.</p>
<p><strong>FancyBox</strong><br />
可定制性太差, 文档不全, 抛弃</p>
<p>其他的不用看了!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090615/1328.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>百万级高并发网站MySQL应用攻略</title>
		<link>http://www.21andy.com/blog/20090613/1326.html</link>
		<comments>http://www.21andy.com/blog/20090613/1326.html#comments</comments>
		<pubDate>Sat, 13 Jun 2009 07:11:27 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/?p=1326</guid>
		<description><![CDATA[百万级高并发网站MySQL应用攻略
作者: 未知
　　在长时间的网站开发过程中，能作一个百万IP的网站对我来说真是一个新的挑战，由于本人的水平有限，所以一直就职于一个小公司，在这里也只是抱着重在参与的想法。在以后我所讲述到的内容知识点上如有不适之处请大家多多批评指教。
　　在一开始接触PHP接触MYSQL的时候就听不少人说：“Mysql就跑跑一天几十万IP的小站还可以，要是几百万IP就不行了”，原话不记得 了，大体就是这个意思。一直也没有好的机会去验证这个说法，一是从没有接手过这么大流量的网站，二是平时工作也比较忙，懒得去管这些，反正现在用不着，抱 着这个想法把这个问题一直留到了最近，才把这个问题搞明白。
　　就在前几天公司旗下一网站(由于这是公司的商业内容我就不说是那个网站了，免得有兄弟说是AD)以下简称A站，这A站在年后流量猛增从一天的七八十万猛跑到了好几百万的IP，一天下来接近一千万的Pv让整个服务器在高压下超负荷的工作着，时不时的服务就出现当机。
　　最首先反映出情况的是数据统计，一天下来一个数据也没有统计上，原来是mysql挂了。
　　本文就围绕这个问题来讲讲我们公司几个技术人员的解决方案。
　　1. Mysql服务器集群
　　由于是小公司在资金和成本上都有所限制，而且在技术上也没有几个技术员接触过，所以这个方法自然就让大伙否决了。
　　这里说说我个人的理解!做集群不但添加资费的开销，而且在技术上也有很大的挑战，对于我们公司目前的情况是不大现实的。集群无非就是把一台服务器的压力转接到两台或是多台服务器上，我是这么理解的，也许我理解有误，还请大家指教。
　　2. 分而治之
　　这个方法和集群差不多，不过是把统计的代码放在不同的服务器上跑，由于公司有不少配置低的服务器跑几万到几十万IP还是没有问题的，我们可以把几百万流量分成十来个几十万的量分而统计。
　　优点：充分的利用了现在的资源，解决了目前的问题。
　　缺点：这样的方法不是长久之计，迟早还是会出问题的。而且在统计数据的时候比较麻烦。
　　3. 统计代码的修改
　　由于之前采用的是在插入数据之前加以判断，这个IP是否存在，来路等的处理，无形中增加了服务器的压力，所以大伙把统计代码改成来一个就插入数据库，不管三七二十一等以后在处理。
　　这个方法基本上把当天的数据保留下来了，可是在处理的时候由于数据量的庞大，来来回回还是把服务器跑死了，而且在插入的时候由于当时设计数据结构的时候留有的索引，也大大的消耗了不少的服务器资源。
　　那么把索引去掉到最后处理的时候又是老慢的，得不偿失。
　　4. 统计方式的修改
　　最后这一个方法，效果非常的明显。那是什么方法呢!
　　这里就主要介绍这个方法：
　　A、 保留原用的数据结构不变，并把所有的数据按一定的结构存入文件。
　　结构：可以是xml,json，也可以是你自己想的任何有规律的数据排放。
　　例如
1 221.2.70.52,http://www.baidu.com,windowxp\r\n2 221.2.70.52,http://www.baidu.com,windowxp\r\n
写入文件:fopen，fwrite??no 这里介绍一个非常好用的技巧，也许大家都知道，但是像我这样的菜鸟大概都不知道，那就是用error_log，这不是写错误日志的吗?对就是他，非常方便。 
error_log(&#34;内容&#34;, 3, &#34;/date.dat&#34;);
    这里我就不说他的具体用了，不明白的朋友可以查一下手册。 
　　B、数据文件的命名
　　为什么这里要讲文件的命名呢?如果就一味的把数据的写入文件不作任何的处理那么他和直接插入数据库有多大的区别呢?那么我们所作的一切都是无用功了。
　　首先是在时间的利用上:date(‘YmdH’)得到的值是如：2008121112这有什么好入，这样一来这个数据就是一个小时一个文件必免了文件过大，而且不用去判断自动生成。
　　IP的应用：由于在很多数据上都是一个IP操作的，所以把相同IP的数据放在一个文件里在后面的处理就非常方便处理。请看后面的介绍，这里我们取IP成三位为文件名字的一部分。
　　C、 数据的导入处理
　　通过以上两位的操作当天的数据会一个不少的保留下来，接下来怎么处理其实并不是很重要了。但是这里还是讲讲我的想法。
　　入库前处理：
　　前面讲到把IP三位相同的放一个文件就是为了入库前到它们进行处理，首先可以用最笨的方法把数据拆成N个数据。在进行重复数据的删除。
　　如果一个IP浏览多页那么PV在这里就可以得到统计，并把访问的页面进行处理，组成新的数据。
　　导入方法：
　　这里要介绍一下数据的导入方法
$sql = &#34;LOAD DATA INFILE '&#34;.$file.&#34;' INTO TABLE `test` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'(`time` , `md5`)&#34;;
    就这一个语句，在导入几十万数据的时候可以说是刷刷的，用法我这里也不过多介绍了，大家有不明白的可以查手册，所以说解决数据库的瓶颈的办法不定要加设备，也不一定要换数据库，只要换一个思路就能解决不少问题。 
　　至此所以有数据也就讲的差不多了。由于我肚子里的墨水太少，如有不得当之处还请大家见谅。
]]></description>
			<content:encoded><![CDATA[<p><strong>百万级高并发网站MySQL应用攻略</strong></p>
<p>作者: 未知</p>
<p>　　在长时间的网站开发过程中，能作一个百万IP的网站对我来说真是一个新的挑战，由于本人的水平有限，所以一直就职于一个小公司，在这里也只是抱着重在参与的想法。在以后我所讲述到的内容知识点上如有不适之处请大家多多批评指教。</p>
<p>　　在一开始接触PHP接触MYSQL的时候就听不少人说：“Mysql就跑跑一天几十万IP的小站还可以，要是几百万IP就不行了”，原话不记得 了，大体就是这个意思。一直也没有好的机会去验证这个说法，一是从没有接手过这么大流量的网站，二是平时工作也比较忙，懒得去管这些，反正现在用不着，抱 着这个想法把这个问题一直留到了最近，才把这个问题搞明白。</p>
<p>　　就在前几天公司旗下一网站(由于这是公司的商业内容我就不说是那个网站了，免得有兄弟说是AD)以下简称A站，这A站在年后流量猛增从一天的七八十万猛跑到了好几百万的IP，一天下来接近一千万的Pv让整个服务器在高压下超负荷的工作着，时不时的服务就出现当机。</p>
<p>　　最首先反映出情况的是数据统计，一天下来一个数据也没有统计上，原来是mysql挂了。</p>
<p>　　本文就围绕这个问题来讲讲我们公司几个技术人员的解决方案。</p>
<p>　　<strong>1. Mysql服务器集群</strong></p>
<p>　　由于是小公司在资金和成本上都有所限制，而且在技术上也没有几个技术员接触过，所以这个方法自然就让大伙否决了。</p>
<p>　　这里说说我个人的理解!做集群不但添加资费的开销，而且在技术上也有很大的挑战，对于我们公司目前的情况是不大现实的。集群无非就是把一台服务器的压力转接到两台或是多台服务器上，我是这么理解的，也许我理解有误，还请大家指教。</p>
<p>　　<strong>2. 分而治之</strong></p>
<p>　　这个方法和集群差不多，不过是把统计的代码放在不同的服务器上跑，由于公司有不少配置低的服务器跑几万到几十万IP还是没有问题的，我们可以把几百万流量分成十来个几十万的量分而统计。</p>
<p>　　优点：充分的利用了现在的资源，解决了目前的问题。</p>
<p>　　缺点：这样的方法不是长久之计，迟早还是会出问题的。而且在统计数据的时候比较麻烦。</p>
<p>　　<strong>3. 统计代码的修改</strong></p>
<p>　　由于之前采用的是在插入数据之前加以判断，这个IP是否存在，来路等的处理，无形中增加了服务器的压力，所以大伙把统计代码改成来一个就插入数据库，不管三七二十一等以后在处理。</p>
<p>　　这个方法基本上把当天的数据保留下来了，可是在处理的时候由于数据量的庞大，来来回回还是把服务器跑死了，而且在插入的时候由于当时设计数据结构的时候留有的索引，也大大的消耗了不少的服务器资源。</p>
<p>　　那么把索引去掉到最后处理的时候又是老慢的，得不偿失。</p>
<p>　　<strong>4. 统计方式的修改</strong></p>
<p>　　最后这一个方法，效果非常的明显。那是什么方法呢!</p>
<p>　　这里就主要介绍这个方法：</p>
<p>　　<strong>A、 保留原用的数据结构不变，并把所有的数据按一定的结构存入文件。</strong></p>
<p>　　结构：可以是xml,json，也可以是你自己想的任何有规律的数据排放。</p>
<p>　　例如</p>
<div class="hl-surround"><div class="hl-main">1 221.2.70.52,http://www.baidu.com,windowxp\r\n<br />2 221.2.70.52,http://www.baidu.com,windowxp\r\n</div></div>
<p>写入文件:fopen，fwrite??no 这里介绍一个非常好用的技巧，也许大家都知道，但是像我这样的菜鸟大概都不知道，那就是用error_log，这不是写错误日志的吗?对就是他，非常方便。 </p>
<div class="hl-surround"><div class="hl-main">error_log(&quot;内容&quot;, 3, &quot;/date.dat&quot;);</div></div>
<p>    这里我就不说他的具体用了，不明白的朋友可以查一下手册。 </p>
<p>　　<strong>B、数据文件的命名</strong></p>
<p>　　为什么这里要讲文件的命名呢?如果就一味的把数据的写入文件不作任何的处理那么他和直接插入数据库有多大的区别呢?那么我们所作的一切都是无用功了。</p>
<p>　　首先是在时间的利用上:date(‘YmdH’)得到的值是如：2008121112这有什么好入，这样一来这个数据就是一个小时一个文件必免了文件过大，而且不用去判断自动生成。</p>
<p>　　IP的应用：由于在很多数据上都是一个IP操作的，所以把相同IP的数据放在一个文件里在后面的处理就非常方便处理。请看后面的介绍，这里我们取IP成三位为文件名字的一部分。</p>
<p>　　<strong>C、 数据的导入处理</strong></p>
<p>　　通过以上两位的操作当天的数据会一个不少的保留下来，接下来怎么处理其实并不是很重要了。但是这里还是讲讲我的想法。</p>
<p>　　入库前处理：</p>
<p>　　前面讲到把IP三位相同的放一个文件就是为了入库前到它们进行处理，首先可以用最笨的方法把数据拆成N个数据。在进行重复数据的删除。</p>
<p>　　如果一个IP浏览多页那么PV在这里就可以得到统计，并把访问的页面进行处理，组成新的数据。</p>
<p>　　导入方法：</p>
<p>　　这里要介绍一下数据的导入方法</p>
<div class="hl-surround"><div class="hl-main">$sql = &quot;LOAD DATA INFILE '&quot;.$file.&quot;' INTO TABLE `test` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'(`time` , `md5`)&quot;;</div></div>
<p>    就这一个语句，在导入几十万数据的时候可以说是刷刷的，用法我这里也不过多介绍了，大家有不明白的可以查手册，所以说解决数据库的瓶颈的办法不定要加设备，也不一定要换数据库，只要换一个思路就能解决不少问题。 </p>
<p>　　至此所以有数据也就讲的差不多了。由于我肚子里的墨水太少，如有不得当之处还请大家见谅。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090613/1326.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Content-Type大全</title>
		<link>http://www.21andy.com/blog/20090613/1325.html</link>
		<comments>http://www.21andy.com/blog/20090613/1325.html#comments</comments>
		<pubDate>Sat, 13 Jun 2009 06:51:36 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[Content-Type]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[MIME]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/20090613/1325.html</guid>
		<description><![CDATA[Multipart Internet Mail Extensions (MIME)
http://www.utoronto.ca/webdocs/HTMLdocs/Book/Book-3ed/appb/mimetype.html



Description of Data Content
Typical Filename Extensions
MIME type/subtype


Text and Text-Related Types
 
 


HTML text data (RFC 1866)
html htm
text/html


Plain text: documents; program listings
txt c c++ pl cc h
text/plain


Richtext (obsolete - replaced by text/enriched)
 
text/richtext


Structure enhanced text
(etx?)
text/x-setext


Enriched text markup (RFC 1896)
 
text/enriched


Tab-separated values (tabular)
(tsv?)
text/tab-separated-values


SGML documents (RFC 1874)
 
text/sgml


Speech synthesis data (MVP Solutions)
talk
text/x-speech


 
 
 


Document Stylesheet Types
 
 


Cascading Stylesheets
css
text/css


DSSSL-online stylesheets
 
application/dsssl (proposed)


 
 
 


Image Types
 
 


GIF
gif
image/gif


X-Windows bitmap [...]]]></description>
			<content:encoded><![CDATA[<p>Multipart Internet Mail Extensions (MIME)<br />
<a href="http://www.utoronto.ca/webdocs/HTMLdocs/Book/Book-3ed/appb/mimetype.html">http://www.utoronto.ca/webdocs/HTMLdocs/Book/Book-3ed/appb/mimetype.html</a></p>
<table border="1" cellpadding="2" bgcolor="#eeeeee">
<tbody>
<tr>
<td>Description of Data Content</td>
<td>Typical Filename Extensions</td>
<td>MIME type/subtype</td>
</tr>
<tr>
<td><a name="text"><strong>Text</strong></a><strong> and Text-Related Types</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>HTML text data (RFC 1866)</td>
<td>html htm</td>
<td>text/html</td>
</tr>
<tr>
<td>Plain text: documents; program listings</td>
<td>txt c c++ pl cc h</td>
<td>text/plain</td>
</tr>
<tr>
<td>Richtext (obsolete - replaced by text/enriched)</td>
<td> </td>
<td>text/richtext</td>
</tr>
<tr>
<td>Structure enhanced text</td>
<td>(etx?)</td>
<td>text/x-setext</td>
</tr>
<tr>
<td>Enriched text markup (RFC 1896)</td>
<td> </td>
<td>text/enriched</td>
</tr>
<tr>
<td>Tab-separated values (tabular)</td>
<td>(tsv?)</td>
<td>text/tab-separated-values</td>
</tr>
<tr>
<td>SGML documents (RFC 1874)</td>
<td> </td>
<td>text/sgml</td>
</tr>
<tr>
<td>Speech synthesis data (MVP Solutions)</td>
<td>talk</td>
<td>text/x-speech</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><strong>Document </strong><a name="styl"><strong>Stylesheet</strong></a><strong> Types</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Cascading Stylesheets</td>
<td>css</td>
<td>text/css</td>
</tr>
<tr>
<td>DSSSL-online stylesheets</td>
<td> </td>
<td>application/dsssl (proposed)</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="imag"><strong>Image</strong></a><strong> Types</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>GIF</td>
<td>gif</td>
<td>image/gif</td>
</tr>
<tr>
<td>X-Windows bitmap (b/w)</td>
<td>xbm</td>
<td>image/x-xbitmap</td>
</tr>
<tr>
<td>X-Windows pixelmap (8-bit color)</td>
<td>xpm</td>
<td>image/x-xpixmap</td>
</tr>
<tr>
<td>Portable Network Graphics</td>
<td>png</td>
<td>image/x-png</td>
</tr>
<tr>
<td>Image Exchange Format (RFC 1314)</td>
<td>ief</td>
<td>image/ief</td>
</tr>
<tr>
<td>JPEG</td>
<td>jpeg jpg jpe</td>
<td>image/jpeg</td>
</tr>
<tr>
<td>TIFF</td>
<td>tiff tif</td>
<td>image/tiff</td>
</tr>
<tr>
<td>RGB</td>
<td>rgb</td>
<td>image/rgb</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>image/x-rgb</td>
</tr>
<tr>
<td>Group III Fax (RFC 1494)</td>
<td>g3f</td>
<td>image/g3fax</td>
</tr>
<tr>
<td>X Windowdump format</td>
<td>xwd</td>
<td>image/x-xwindowdump</td>
</tr>
<tr>
<td>Macintosh PICT format</td>
<td>pict</td>
<td>image/x-pict</td>
</tr>
<tr>
<td>PPM (UNIX PPM package)</td>
<td>ppm</td>
<td>image/x-portable-pixmap</td>
</tr>
<tr>
<td>PGM (UNIX PPM package)</td>
<td>pgm</td>
<td>image/x-portable-graymap</td>
</tr>
<tr>
<td>PBM (UNIX PPM package)</td>
<td>pbm</td>
<td>image/x-portable-bitmap</td>
</tr>
<tr>
<td>PNM (UNIX PPM package)</td>
<td>pnm</td>
<td>image/x-portable-anymap</td>
</tr>
<tr>
<td>Microsoft Windows bitmap</td>
<td>bmp</td>
<td>image/x-ms-bmp</td>
</tr>
<tr>
<td>CMU raster</td>
<td>ras</td>
<td>image/x-cmu-raster</td>
</tr>
<tr>
<td>Kodak Photo-CD</td>
<td>pcd</td>
<td>image/x-photo-cd</td>
</tr>
<tr>
<td>Computer Graphics Metafile</td>
<td>cgm</td>
<td>image/cgm</td>
</tr>
<tr>
<td>North Am. Presentation Layer Protocol</td>
<td> </td>
<td>image/naplps</td>
</tr>
<tr>
<td>CALS Type 1 or 2</td>
<td>mil cal</td>
<td>image/x-cals</td>
</tr>
<tr>
<td>Fractal Image Format (Iterated Systems)</td>
<td>fif</td>
<td>image/fif</td>
</tr>
<tr>
<td>QuickSilver active image (Micrografx)</td>
<td>dsf</td>
<td>image/x-mgx-dsf</td>
</tr>
<tr>
<td>CMX vector image (Corel)</td>
<td>cmx</td>
<td>image/x-cmx</td>
</tr>
<tr>
<td>Wavelet-compressed (Summus)</td>
<td>wi</td>
<td>image/wavelet</td>
</tr>
<tr>
<td>AutoCad Drawing (SoftSource)</td>
<td>dwg</td>
<td>image/vnd.dwg</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>image/x-dwg</td>
</tr>
<tr>
<td>AutoCad DXF file (SoftSource)</td>
<td>dxf</td>
<td>image/vnd.dxf</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>image/x-dxf</td>
</tr>
<tr>
<td>Simple Vector Format (SoftSource)</td>
<td>svf</td>
<td>image/vnd.svf</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>also vector/x-svf</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="audi"><strong>Audio/Voice/Music</strong></a><strong> Related Types</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>"basic"audio - 8-bit u-law PCM</td>
<td>au snd</td>
<td>audio/basic</td>
</tr>
<tr>
<td>Macintosh audio format (AIpple)</td>
<td>aif aiff aifc</td>
<td>audio/x-aiff</td>
</tr>
<tr>
<td>Microsoft audio</td>
<td>wav</td>
<td>audio/x-wav</td>
</tr>
<tr>
<td>MPEG audio</td>
<td>mpa abs mpega</td>
<td>audio/x-mpeg</td>
</tr>
<tr>
<td>MPEG-2 audio</td>
<td>mp2a mpa2</td>
<td>audio/x-mpeg-2</td>
</tr>
<tr>
<td>compressed speech (Echo Speech Corp.)</td>
<td>es</td>
<td>audio/echospeech</td>
</tr>
<tr>
<td>Toolvox speech audio (Voxware)</td>
<td>vox</td>
<td>audio/voxware</td>
</tr>
<tr>
<td>RapidTransit compressed audio (Fast Man)</td>
<td>lcc</td>
<td>application/fastman</td>
</tr>
<tr>
<td>Realaudio (Progressive Networks)</td>
<td>ra ram</td>
<td>application/x-pn-realaudio</td>
</tr>
<tr>
<td>NIFF music notation data format</td>
<td> </td>
<td>application/vnd.music-niff</td>
</tr>
<tr>
<td>MIDI music data</td>
<td>mmid</td>
<td>x-music/x-midi</td>
</tr>
<tr>
<td>Koan music data (SSeyo)</td>
<td>skp</td>
<td>application/vnd.koan</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>application/x-koan</td>
</tr>
<tr>
<td>Speech synthesis data (MVP Solutions)</td>
<td>talk</td>
<td>text/x-speech</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="vide"><strong>Video</strong></a><strong> Types</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>MPEG video</td>
<td>mpeg mpg mpe</td>
<td>video/mpeg</td>
</tr>
<tr>
<td>MPEG-2 video</td>
<td>mpv2 mp2v</td>
<td>video/mpeg-2</td>
</tr>
<tr>
<td>Macintosh Quicktime</td>
<td>qt mov</td>
<td>video/quicktime</td>
</tr>
<tr>
<td>Microsoft video</td>
<td>avi</td>
<td>video/x-msvideo</td>
</tr>
<tr>
<td>SGI Movie format</td>
<td>movie</td>
<td>video/x-sgi-movie</td>
</tr>
<tr>
<td>VDOlive streaming video (VDOnet)</td>
<td>vdo</td>
<td>video/vdo</td>
</tr>
<tr>
<td>Vivo streaming video (Vivo software)</td>
<td>viv</td>
<td>video/vnd.vivo</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>video/vivo</td>
</tr>
<tr>
<td><a name="spec"><strong>Special</strong></a><strong> HTTP/Web Application Types</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Proxy autoconfiguration (Netscape browsers)</td>
<td>pac</td>
<td>application/x-ns-proxy-autoconfig</td>
</tr>
<tr>
<td>See Chapter 6</td>
<td> </td>
<td>application/x-www-form-urlencoded</td>
</tr>
<tr>
<td>See Chapter 9</td>
<td> </td>
<td>application/x-www-local-exec</td>
</tr>
<tr>
<td>See Chapter 9 (Netscape extension)</td>
<td> </td>
<td>multipart/x-mixed-replace</td>
</tr>
<tr>
<td>See Chapter 9 and Appendix B</td>
<td> </td>
<td>multipart/form-data</td>
</tr>
<tr>
<td>Netscape Cooltalk chat data (Netscape)</td>
<td>ice</td>
<td>x-conference/x-cooltalk</td>
</tr>
<tr>
<td>Interactive chat (Ichat)</td>
<td> </td>
<td>application/x-chat</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Application Types</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="trel"><strong>Text-Related</strong></a></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>PostScript</td>
<td>ai eps ps</td>
<td>application/postscript</td>
</tr>
<tr>
<td>Microsoft Rich Text Format</td>
<td>rtf</td>
<td>application/rtf</td>
</tr>
<tr>
<td>Adobe Acrobat PDF</td>
<td>pdf</td>
<td>application/pdf</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>application/x-pdf</td>
</tr>
<tr>
<td>Maker Interchange Format (FrameMaker)</td>
<td>mif</td>
<td>application/vnd.mif</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>application/x-mif</td>
</tr>
<tr>
<td>Troff document</td>
<td>t tr roff</td>
<td>application/x-troff</td>
</tr>
<tr>
<td>Troff document with MAN macros</td>
<td>man</td>
<td>application/x-troff-man</td>
</tr>
<tr>
<td>Troff document with ME macros</td>
<td>me</td>
<td>application/x-troff-me</td>
</tr>
<tr>
<td>Troff document with MS macros</td>
<td>ms</td>
<td>application/x-troff-ms</td>
</tr>
<tr>
<td>LaTeX document</td>
<td>latex</td>
<td>application/x-latex</td>
</tr>
<tr>
<td>Tex/LateX document</td>
<td>tex</td>
<td>application/x-tex</td>
</tr>
<tr>
<td>GNU TexInfo document</td>
<td>texinfo texi</td>
<td>application/x-texinfo</td>
</tr>
<tr>
<td>TeX dvi format</td>
<td>dvi</td>
<td>application/x-dvi</td>
</tr>
<tr>
<td>MacWrite document</td>
<td>??</td>
<td>application/macwriteii</td>
</tr>
<tr>
<td>MS word document</td>
<td>??</td>
<td>application/msword</td>
</tr>
<tr>
<td>WordPerfect 5.1 document</td>
<td>??</td>
<td>application/wordperfect5.1</td>
</tr>
<tr>
<td>SGML application (RFC 1874)</td>
<td> </td>
<td>application/sgml</td>
</tr>
<tr>
<td>Office Document Architecture</td>
<td>oda</td>
<td>application/oda</td>
</tr>
<tr>
<td>Envoy Document</td>
<td>evy</td>
<td>application/envoy</td>
</tr>
<tr>
<td>Wang Info. Tranfer Format (Wang)</td>
<td> </td>
<td>application/wita</td>
</tr>
<tr>
<td>DEC Document Transfer Format (DEC)</td>
<td> </td>
<td>application/dec-dx</td>
</tr>
<tr>
<td>IBM Document Content Architecture (IBM)</td>
<td> </td>
<td>application/dca-rft</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>CommonGround Digital Paper (No Hands Software)</td>
<td> </td>
<td>application/commonground</td>
</tr>
<tr>
<td>FrameMaker Documents (Frame)</td>
<td>doc fm frm frame</td>
<td>application/vnd.framemaker</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>application/x-framemaker</td>
</tr>
<tr>
<td>Remote printing at arbitrary printers (RFC 1486)</td>
<td> </td>
<td>application/remote-printing</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="arch"><strong>Archive/Compressed</strong></a><strong> Archives</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Gnu tar format</td>
<td>gtar</td>
<td>application/x-gtar</td>
</tr>
<tr>
<td>4.3BSD tar format</td>
<td>tar</td>
<td>application/x-tar</td>
</tr>
<tr>
<td>POSIX tar format</td>
<td>ustar</td>
<td>application/x-ustar</td>
</tr>
<tr>
<td>Old CPIO format</td>
<td>bcpio</td>
<td>application/x-bcpio</td>
</tr>
<tr>
<td>POSIX CPIO format</td>
<td>cpio</td>
<td>application/x-cpio</td>
</tr>
<tr>
<td>UNIX sh shell archive</td>
<td>shar</td>
<td>application/x-shar</td>
</tr>
<tr>
<td>DOS/PC - Pkzipped archive</td>
<td>zip</td>
<td>application/zip</td>
</tr>
<tr>
<td>Macintosh Binhexed archive</td>
<td>hqx</td>
<td>application/mac-binhex40</td>
</tr>
<tr>
<td>Macintosh Stuffit Archive</td>
<td>sit sea</td>
<td>application/x-stuffit</td>
</tr>
<tr>
<td>Fractal Image Format</td>
<td>fif</td>
<td>application/fractals</td>
</tr>
<tr>
<td>Binary, UUencoded</td>
<td>bin uu</td>
<td>application/octet-stream</td>
</tr>
<tr>
<td>PC executable</td>
<td>exe</td>
<td>application/octet-stream</td>
</tr>
<tr>
<td>WAIS "sources"</td>
<td>src wsrc</td>
<td>application/x-wais-source</td>
</tr>
<tr>
<td>NCSA HDF data format</td>
<td>hdf</td>
<td>application/hdf</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="prog"><strong>Downloadable</strong></a><strong> Program/Scripts</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Javascript program</td>
<td>js ls mocha</td>
<td>text/javascript</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>application/x-javascript</td>
</tr>
<tr>
<td>VBScript program</td>
<td> </td>
<td>text/vbscript</td>
</tr>
<tr>
<td>UNIX bourne shell program</td>
<td>sh</td>
<td>application/x-sh</td>
</tr>
<tr>
<td>UNIX c-shell program</td>
<td>csh</td>
<td>application/x-csh</td>
</tr>
<tr>
<td>Perl program</td>
<td>pl</td>
<td>application/x-perl</td>
</tr>
<tr>
<td>Tcl (Tool Control Language) program</td>
<td>tcl</td>
<td>application/x-tcl</td>
</tr>
<tr>
<td>Atomicmail program scripts (obsolete)</td>
<td> </td>
<td>application/atomicmail</td>
</tr>
<tr>
<td>Slate documents - executable enclosures (BBN)</td>
<td> </td>
<td>application/slate</td>
</tr>
<tr>
<td>Undefined binary data (often executable progs)</td>
<td> </td>
<td>application/octet-stream</td>
</tr>
<tr>
<td>RISC OS Executable programs (ANT Limited)</td>
<td> </td>
<td>application/riscos</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="anim"><strong>Animation/Multimedia</strong></a></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Andrew Toolkit inset</td>
<td> </td>
<td>application/andrew-inset</td>
</tr>
<tr>
<td>FutureSplash vector animation (FutureWave)</td>
<td>spl</td>
<td>application/futuresplash</td>
</tr>
<tr>
<td>mBED multimedia data (mBED)</td>
<td>mbd</td>
<td>application/mbedlet</td>
</tr>
<tr>
<td>Macromedia Shockwave (Macromedia)</td>
<td> </td>
<td>application/x-director</td>
</tr>
<tr>
<td>Sizzler real-time video/animation</td>
<td> </td>
<td>application/x-sprite</td>
</tr>
<tr>
<td>PowerMedia multimedia (RadMedia)</td>
<td>rad</td>
<td>application/x-rad-powermedia</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="pres"><strong>Presentation</strong></a></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>PowerPoint presentation (Microsoft)</td>
<td>ppz</td>
<td>application/mspowerpoint</td>
</tr>
<tr>
<td>PointPlus presentation data (Net Scene)</td>
<td>css</td>
<td>application/x-pointplus</td>
</tr>
<tr>
<td>ASAP WordPower (Software Publishing Corp.)</td>
<td>asp</td>
<td>application/x-asap</td>
</tr>
<tr>
<td>Astound Web Player multimedia data (GoldDisk)</td>
<td>asn</td>
<td>application/astound</td>
</tr>
<tr>
<td><a name="spece"><strong>Special</strong></a><strong> Embedded Object</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>OLE script e.g. Visual Basic (Ncompass)</td>
<td>axs</td>
<td>application/x-olescript</td>
</tr>
<tr>
<td>OLE Object (Microsoft/NCompass)</td>
<td>ods</td>
<td>application/x-oleobject</td>
</tr>
<tr>
<td>OpenScape OLE/OCX objects (Business@Web)</td>
<td>opp</td>
<td>x-form/x-openscape</td>
</tr>
<tr>
<td>Visual Basic objects (Amara)</td>
<td>wba</td>
<td>application/x-webbasic</td>
</tr>
<tr>
<td>Specialized data entry forms (Alpha Software)</td>
<td>frm</td>
<td>application/x-alpha-form</td>
</tr>
<tr>
<td>client-server objects (Wayfarer Communications)</td>
<td>wfx</td>
<td>x-script/x-wfxclient</td>
</tr>
<tr>
<td><a name="gene"><strong>General</strong></a><strong> Applications</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Undefined binary data (often executable progs)</td>
<td> </td>
<td>application/octet-stream</td>
</tr>
<tr>
<td>CALS (U.S. D.O.D data format - RFC 1895)</td>
<td> </td>
<td>application/cals-1840</td>
</tr>
<tr>
<td>Pointcast news data (Pointcast)</td>
<td>pcn</td>
<td>application/x-pcn</td>
</tr>
<tr>
<td>Excel spreadsheet (Microsoft)</td>
<td> </td>
<td>application/vnd.ms-excel</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>application/x-msexcel</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>application/ms-excel</td>
</tr>
<tr>
<td>PowerPoint (Microsoft)</td>
<td>ppt</td>
<td>application/vnd.ms-powerpoint</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>application/ms-powerpoint</td>
</tr>
<tr>
<td>Microsoft Project (Microsoft)</td>
<td> </td>
<td>application/vnd.ms-project</td>
</tr>
<tr>
<td>Works data (Microsoft)</td>
<td> </td>
<td>application/vnd.ms-works</td>
</tr>
<tr>
<td>MAPI data (Microsoft)</td>
<td> </td>
<td>application/vnd.ms-tnef</td>
</tr>
<tr>
<td>Artgallery data (Microsoft)</td>
<td> </td>
<td>application/vnd.artgalry</td>
</tr>
<tr>
<td>SourceView document (Dataware Electronics)</td>
<td>svd</td>
<td>application/vnd.svd</td>
</tr>
<tr>
<td>Truedoc (Bitstream)</td>
<td> </td>
<td>application/vnd.truedoc</td>
</tr>
<tr>
<td>Net Install - software install (20/20 Software)</td>
<td>ins</td>
<td>application/x-net-install</td>
</tr>
<tr>
<td>Carbon Copy - remote control/access (Microcom)</td>
<td>ccv</td>
<td>application/ccv</td>
</tr>
<tr>
<td>Spreadsheets (Visual Components)</td>
<td>vts</td>
<td>workbook/formulaone</td>
</tr>
<tr>
<td>Cybercash digital money (Cybercash)</td>
<td> </td>
<td>application/cybercash</td>
</tr>
<tr>
<td>Format for sending generic Macintosh files</td>
<td> </td>
<td>application/applefile</td>
</tr>
<tr>
<td>Active message -- connect to active mail app.</td>
<td> </td>
<td>application/activemessage</td>
</tr>
<tr>
<td>X.400 mail message body part (RFC 1494)</td>
<td> </td>
<td>application/x400-bp</td>
</tr>
<tr>
<td>USENET news message id (RFC 1036)</td>
<td> </td>
<td>application/news-message-id</td>
</tr>
<tr>
<td>USENET news message (RFC 1036)</td>
<td> </td>
<td>application/news-transmission</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="mult"><strong>Multipart</strong></a><strong> Types (mostly email)</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Messages with multiple parts</td>
<td> </td>
<td>multipart/mixed</td>
</tr>
<tr>
<td>Messages with multiple, alternative parts</td>
<td> </td>
<td>multipart/alternative</td>
</tr>
<tr>
<td>Message with multiple, related parts</td>
<td> </td>
<td>multipart/related</td>
</tr>
<tr>
<td>Multiple parts are digests</td>
<td> </td>
<td>multipart/digest</td>
</tr>
<tr>
<td>For reporting of email status (admin.)</td>
<td> </td>
<td>multipart/report</td>
</tr>
<tr>
<td>Order of parts does not matter</td>
<td> </td>
<td>multipart/parallel</td>
</tr>
<tr>
<td>Macintosh file data</td>
<td> </td>
<td>multipart/appledouble</td>
</tr>
<tr>
<td>Aggregate messages; descriptor as header</td>
<td> </td>
<td>multipart/header-set</td>
</tr>
<tr>
<td>Container for voice-mail</td>
<td> </td>
<td>multipart/voice-message</td>
</tr>
<tr>
<td>HTML FORM data (see Ch. 9 and App. B)</td>
<td> </td>
<td>multipart/form-data</td>
</tr>
<tr>
<td>Infinite multiparts - See Chapter 9 (Netscape)</td>
<td> </td>
<td>multipart/x-mixed-replace</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="mesg"><strong>Message</strong></a><strong> Types (mostly email)</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>MIME message</td>
<td> </td>
<td>message/rfc822</td>
</tr>
<tr>
<td>Partial message</td>
<td> </td>
<td>message/partial</td>
</tr>
<tr>
<td>Message containing external references</td>
<td> </td>
<td>message/external-body</td>
</tr>
<tr>
<td>Message containing USENET news</td>
<td> </td>
<td>message/news</td>
</tr>
<tr>
<td>HTTP message</td>
<td> </td>
<td>message/http</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="vrml"><strong>2D/3D</strong></a><strong> Data/Virtual Reality Types</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>VRML data file</td>
<td>wrl vrml</td>
<td>x-world/x-vrml(changing to model/vrml)</td>
</tr>
<tr>
<td>WIRL - VRML data (VREAM)</td>
<td>vrw</td>
<td>x-world/x-vream</td>
</tr>
<tr>
<td>Play3D 3d scene data (Play3D)</td>
<td>p3d</td>
<td>application/x-p3d</td>
</tr>
<tr>
<td>Viscape Interactive 3d world data (Superscape)</td>
<td>svr</td>
<td>x-world/x-svr</td>
</tr>
<tr>
<td>WebActive 3d data (Plastic Thought)</td>
<td>wvr</td>
<td>x-world/x-wvr</td>
</tr>
<tr>
<td>QuickDraw3D scene data (Apple)</td>
<td>3dmf</td>
<td>x-world/x-3dmf</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="math"><strong>Scientific/Math/CAD</strong></a><strong> Types</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Chemical types -- to communicate information about chemical models</td>
<td> </td>
<td>chemical/* (several subtypes)</td>
</tr>
<tr>
<td>Mathematica notebook</td>
<td>ma</td>
<td>application/mathematica</td>
</tr>
<tr>
<td>Computational meshes for numerical simulations</td>
<td>msh</td>
<td>x-model/x-mesh(evolving to model/mesh)</td>
</tr>
<tr>
<td>Vis5D 5-dimensional data</td>
<td>v5d</td>
<td>application/vis5d</td>
</tr>
<tr>
<td>IGES models -- CAD/CAM (CGM) data</td>
<td>igs</td>
<td>application/iges(evolving to model/iges?)</td>
</tr>
<tr>
<td>Autocad WHIP vector drawings</td>
<td>dwf</td>
<td>drawing/x-dwf</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Largely Platform-Specific Types</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><a name="sgi"><strong>Silicon</strong></a><strong> Graphics Specific Types</strong></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Showcase Presentations</td>
<td>showcase slides sc sho show</td>
<td>application/x-showcase</td>
</tr>
<tr>
<td>Insight Manual pages</td>
<td>ins insight</td>
<td>application/x-insight</td>
</tr>
<tr>
<td>Iris Annotator data</td>
<td>ano</td>
<td>application/x-annotator</td>
</tr>
<tr>
<td>Directory Viewer</td>
<td>dir</td>
<td>application/x-dirview</td>
</tr>
<tr>
<td>Software License</td>
<td>lic</td>
<td>application/x-enterlicense</td>
</tr>
<tr>
<td>Fax manager file</td>
<td>faxmgr</td>
<td>application/x-fax-manager</td>
</tr>
<tr>
<td>Fax job data file</td>
<td>faxmgrjob</td>
<td>application/x-fax-manager-job</td>
</tr>
<tr>
<td>IconBook data</td>
<td>icnbk</td>
<td>application/x-iconbook</td>
</tr>
<tr>
<td>?</td>
<td>wb</td>
<td>application/x-inpview</td>
</tr>
<tr>
<td>Installable software in 'inst' format</td>
<td>inst</td>
<td>application/x-install</td>
</tr>
<tr>
<td>Mail folder</td>
<td>mail</td>
<td>application/x-mailfolder</td>
</tr>
<tr>
<td>?</td>
<td>pp ppages</td>
<td>application/x-ppages</td>
</tr>
<tr>
<td>Data for printer (via lpr)</td>
<td>sgi-lpr</td>
<td>application/x-sgi-lpr</td>
</tr>
<tr>
<td>Software in 'tardist' format</td>
<td>tardist</td>
<td>application/x-tardist</td>
</tr>
<tr>
<td>Software in compressed 'tardist' format</td>
<td>ztardist</td>
<td>application/x-ztardist</td>
</tr>
<tr>
<td>WingZ spreadsheet</td>
<td>wkz</td>
<td>application/x-wingz</td>
</tr>
<tr>
<td>Open Inventor 3-D scenes</td>
<td>iv</td>
<td>graphics/x-inventor</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090613/1325.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最佳jQuery窗口插件(Modal Dialog Plugins)</title>
		<link>http://www.21andy.com/blog/20090611/1324.html</link>
		<comments>http://www.21andy.com/blog/20090611/1324.html#comments</comments>
		<pubDate>Wed, 10 Jun 2009 16:25:29 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[Dialog]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Modal]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[窗口]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/20090611/1324.html</guid>
		<description><![CDATA[以下我全试了, FancyBox, Boxy, FaceBox, BlockUI这四个最好, 它们各有所长.
FancyBox
21Andy.com译: FancyBox非常小且容易使用, 有很好的外观, 简洁和容易扩展的CSS, 可惜暂不支持Modal.
The FancyBox plugin is very simple and easy to implement, looks fantastic out of the box, and has very clean CSS for you to expand upon or modify to your liking. Unfortunately it lacks some features that others may have such as modal support but it [...]]]></description>
			<content:encoded><![CDATA[<p>以下我全试了, FancyBox, Boxy, FaceBox, BlockUI这四个最好, 它们各有所长.</p>
<h2>FancyBox</h2>
<p>21Andy.com译: FancyBox非常小且容易使用, 有很好的外观, 简洁和容易扩展的CSS, 可惜暂不支持Modal.<br />
The FancyBox plugin is very simple and easy to implement, looks fantastic out of the box, and has very clean CSS for you to expand upon or modify to your liking. Unfortunately it lacks some features that others may have such as modal support but it is work checking out.<br />
<a href="http://www.21andy.com/blog/upload/2009/0610/079294b396ffff77.jpg" rel="lightbox[roadtrip]"><img src="http://www.21andy.com/blog/upload/2009/0610/079294b396ffff77_thumb.jpg" title="最佳jQuery窗口插件(Modal Dialog Plugins)" alt="最佳jQuery窗口插件(Modal Dialog Plugins) 079294b396ffff77 thumb" /></a></p>
<ul>
<li><strong>外观:</strong> 5/5 分</li>
<li><strong>容易使用:</strong> 5/5 分</li>
<li><strong>功能:</strong> 3/5 分</li>
<li><strong>图片文字:</strong> 是</li>
<li><strong>相册Rel:</strong> 是</li>
<li><strong>内联支持:</strong> 是</li>
<li><strong>Iframe支持:</strong> 是</li>
<li><strong>Modal支持:</strong> 不</li>
<li><strong>可定制性:</strong> 低</li>
<li><strong>下载:</strong> <a href="http://fancy.klade.lv/">FancyBox</a></li>
</ul>
<h2>Boxy</h2>
<p>Boxy is probably my favorite modal dialog jquery plugin so far, its not bad looking out of the box, very simple to implement, and has quite a few strong/simplistic features which are very polished. If you are in need of this sort of functionality for an application check it out!</p>
<p><a href="http://www.21andy.com/blog/upload/2009/0610/d24441ec909e1397.jpg" rel="lightbox[roadtrip]"><img src="http://www.21andy.com/blog/upload/2009/0610/d24441ec909e1397.jpg" title="最佳jQuery窗口插件(Modal Dialog Plugins)" alt="最佳jQuery窗口插件(Modal Dialog Plugins) d24441ec909e1397" /></a></p>
<ul>
<li><strong>外观:</strong> 4/5 分</li>
<li><strong>容易使用:</strong> 5/5 分</li>
<li><strong>功能:</strong> 4/5 分</li>
<li><strong>图片文字:</strong> 不</li>
<li><strong>相册Rel:</strong> 不</li>
<li><strong>内联支持:</strong> 是</li>
<li><strong>Iframe支持:</strong> 是</li>
<li><strong>Modal支持:</strong> 是</li>
<li><strong>可定制性:</strong> 高</li>
<li><strong>下载:</strong> <a href="http://onehackoranother.com/projects/jquery/boxy/">Boxy</a></li>
</ul>
<h2>FaceBox</h2>
<p>21Andy.com译: 懒得译了, 手酸.... -_!!<br />
Although this popup script looks pretty slick I found that it loads fairly clunky, and seriously lacks in polish/features. I had to adjust paths right off the bat to get images to display properly, and it does not have basic support such as the rel attribute for galleries, title attribute for captions etc.</p>
<p>That being said if you love the Facebook popup look check it out!<br />
<a href="http://www.21andy.com/blog/upload/2009/0610/768af12649c46b53.jpg" rel="lightbox[roadtrip]"><img src="http://www.21andy.com/blog/upload/2009/0610/768af12649c46b53_thumb.jpg" title="最佳jQuery窗口插件(Modal Dialog Plugins)" alt="最佳jQuery窗口插件(Modal Dialog Plugins) 768af12649c46b53 thumb" /></a></p>
<ul>
<li><strong>外观:</strong> 4/5 分</li>
<li><strong>容易使用:</strong> 4/5 分</li>
<li><strong>功能:</strong> 2/5 分</li>
<li><strong>图片文字:</strong> 不</li>
<li><strong>相册Rel:</strong> 不</li>
<li><strong>内联支持:</strong> 是</li>
<li><strong>Iframe支持:</strong> 不</li>
<li><strong>Modal支持:</strong> 不</li>
<li><strong>可定制性:</strong> 低</li>
<li><strong>下载:</strong> <a href="http://famspam.com/facebox/">FaceBox</a></li>
</ul>
<h2>BlockUI</h2>
<p>This again is more of a developers dialog solution, and a pretty good one at that. Along with providing highly customizable JavaScript modal dialog support, it also can block page elements, or the entire page until Ajax (or other processing) is complete, which is very handy for applications.</p>
<p>BlockUI is ugly out of the box however the site has some good clean examples and how to implement them. It is a little strange in the fact that CSS is applied via JavaScript configuration rather than a stylesheet.</p>
<p><a href="http://www.21andy.com/blog/upload/2009/0610/9fcceed088a2304c.jpg" rel="lightbox[roadtrip]"><img src="http://www.21andy.com/blog/upload/2009/0610/9fcceed088a2304c.jpg" title="最佳jQuery窗口插件(Modal Dialog Plugins)" alt="最佳jQuery窗口插件(Modal Dialog Plugins) 9fcceed088a2304c" /></a></p>
<ul>
<li><strong>外观:</strong> 1/5 分</li>
<li><strong>容易使用:</strong> 3/5 分</li>
<li><strong>功能:</strong> 5/5 分</li>
<li><strong>图片文字:</strong> 不</li>
<li><strong>相册Rel:</strong> 不</li>
<li><strong>内联支持:</strong> 是</li>
<li><strong>Iframe支持:</strong> 是</li>
<li><strong>Modal支持:</strong> 是</li>
<li><strong>可定制性:</strong> 高</li>
<li><strong>下载:</strong> <a href="http://www.malsup.com/jquery/block/#download">BlockUI</a></li>
</ul>
<h2>Impromptu</h2>
<p>21Andy.com译: 懒得译了, 手酸.... -_!!<br />
Not that Impromptu looks bad, I would hardly call it generic enough to be suitable for every site out of the box. For those of you looking for image support this is probably not the popup plugin for you, as it primarily was created for dialog support replacing alert(), prompt() etc. I did however get it working with images pretty quick, but either way this is more of an dialog popup script.</p>
<p><a href="http://www.21andy.com/blog/upload/2009/0610/87a867d6bccd5b05.jpg" rel="lightbox[roadtrip]"><img src="http://www.21andy.com/blog/upload/2009/0610/87a867d6bccd5b05.jpg" title="最佳jQuery窗口插件(Modal Dialog Plugins)" alt="最佳jQuery窗口插件(Modal Dialog Plugins) 87a867d6bccd5b05" /></a></p>
<ul>
<li><strong>外观:</strong> 3/5 分</li>
<li><strong>容易使用:</strong> 3/5 分</li>
<li><strong>功能:</strong> 4/5 分</li>
<li><strong>图片文字:</strong> 不</li>
<li><strong>相册Rel:</strong> 不</li>
<li><strong>内联支持:</strong> 不</li>
<li><strong>Iframe支持:</strong> 不</li>
<li><strong>Modal支持:</strong> 是</li>
<li><strong>可定制性:</strong> 中</li>
<li><strong>下载:</strong> <a href="http://trentrichardson.com/Impromptu/index.php">Impromptu</a></li>
</ul>
<h2>nyroModal</h2>
<p>This popup dialog plugin has tons of features and an overall sexy look and smooth animation. My main problem with this one is that the consistency was no really there it did nto feel as solid as some of the others and I was getting strange CSS break-age with some images/pages.</p>
<p><a href="http://www.21andy.com/blog/upload/2009/0610/2f333e7266c06326.jpg" rel="lightbox[roadtrip]"><img src="http://www.21andy.com/blog/upload/2009/0610/2f333e7266c06326_thumb.jpg" title="最佳jQuery窗口插件(Modal Dialog Plugins)" alt="最佳jQuery窗口插件(Modal Dialog Plugins) 2f333e7266c06326 thumb" /></a></p>
<ul>
<li><strong>外观:</strong> 4/5 分</li>
<li><strong>容易使用:</strong> 4/5 分</li>
<li><strong>功能:</strong> 5/5 分</li>
<li><strong>图片文字:</strong> 是</li>
<li><strong>相册Rel:</strong> 是</li>
<li><strong>内联支持:</strong> 是</li>
<li><strong>Iframe支持:</strong> 是</li>
<li><strong>Modal支持:</strong> 是</li>
<li><strong>可定制性:</strong> 高</li>
<li><strong>下载:</strong> <a href="http://nyromodal.nyrodev.com/">nyroModal</a></li>
</ul>
<h2>FancyZoom</h2>
<p>Another Fancy-something?? I guess so! they are very similar too, taking the Apple approach. I find this one to be fine, but the animations lag a little which I think really decreases user experience. Packing nearly the same features as FancyBox (less) I would suggest checking it out before this one.</p>
<p><a href="http://www.21andy.com/blog/upload/2009/0610/42b65514375b0b27.jpg" rel="lightbox[roadtrip]"><img src="http://www.21andy.com/blog/upload/2009/0610/42b65514375b0b27_thumb.jpg" title="最佳jQuery窗口插件(Modal Dialog Plugins)" alt="最佳jQuery窗口插件(Modal Dialog Plugins) 42b65514375b0b27 thumb" /></a></p>
<ul>
<li><strong>外观:</strong> 3/5 分</li>
<li><strong>容易使用:</strong> 4/5 分</li>
<li><strong>功能:</strong> 1/5 分</li>
<li><strong>图片文字:</strong> 是</li>
<li><strong>相册Rel:</strong> 是</li>
<li><strong>内联支持:</strong> 不</li>
<li><strong>Iframe支持:</strong> 不</li>
<li><strong>Modal支持:</strong> 不</li>
<li><strong>可定制性:</strong> 低</li>
<li><strong>下载:</strong> <a href="http://www.dfc-e.com/metiers/multimedia/opensource/jquery-fancyzoom/">FancyZoom</a></li>
</ul>
<h2>Flyout</h2>
<p>The most interesting thing about Flyout is its support for easing functions, making the animations much more amusing, as well as some interesting loading effects. Other than the effects this plugin seriously lacks in standard functionality and because of that I would certainly not recommend it.</p>
<p><a href="http://www.21andy.com/blog/upload/2009/0610/b0626560a37ae570.jpg" rel="lightbox[roadtrip]"><img src="http://www.21andy.com/blog/upload/2009/0610/b0626560a37ae570_thumb.jpg" title="最佳jQuery窗口插件(Modal Dialog Plugins)" alt="最佳jQuery窗口插件(Modal Dialog Plugins) b0626560a37ae570 thumb" /></a></p>
<ul>
<li><strong>外观:</strong> 2/5 分</li>
<li><strong>容易使用:</strong> 4/5 分</li>
<li><strong>功能:</strong> 1/5 分</li>
<li><strong>图片文字:</strong> 不</li>
<li><strong>相册Rel:</strong> 不</li>
<li><strong>内联支持:</strong> 不</li>
<li><strong>Iframe支持:</strong> 不</li>
<li><strong>Modal支持:</strong> 不</li>
<li><strong>可定制性:</strong> 低</li>
<li><strong>下载:</strong> <a href="http://www.nixbox.com/demos/jquery.flyout.php">Flyout</a></li>
</ul>
<p><strong>其他jQuery窗口插件(Modal Dialog Plugins)</strong></p>
<p><strong>simplemodal</strong>: <a href="http://www.ericmmartin.com/projects/simplemodal/">http://www.ericmmartin.com/projects/simplemodal/</a><br />
<strong>jqModal</strong>: <a href="http://dev.iceburg.net/jquery/jqModal/#examples">http://dev.iceburg.net/jquery/jqModal/#examples</a><br />
simplemodal、jqModal 。这两个是最简单的，灵活性很好，需要配置的多，学习成本高。<br />
如果你希望定制自己的Dialog，这两个插件，可以作为基础包，在基础包在封装一下。就可以很方便的满足你的要求。</p>
<p><a href="http://jquery.com/demo/thickbox/">http://jquery.com/demo/thickbox/</a><br />
thickbox是我以前用了很长时间的, 现在不推荐了.</p>
<p><a href="http://www.malsup.com/jquery/block/">http://www.malsup.com/jquery/block/</a><br />
BlockUI效果很好。而且官方的帮助也很详细，如果只是简单的使用遮蔽，推荐使用，上手也容易。</p>
<p><a href="http://docs.jquery.com/UI/Dialog">http://docs.jquery.com/UI/Dialog</a><br />
官方的要，还要引几个扩展的JS,支持窗口缩放什么的，但生产的代码也太复杂了，不推荐。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090611/1324.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQL数据库灾难恢复</title>
		<link>http://www.21andy.com/blog/20090610/1323.html</link>
		<comments>http://www.21andy.com/blog/20090610/1323.html#comments</comments>
		<pubDate>Wed, 10 Jun 2009 09:02:13 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[恢复]]></category>
		<category><![CDATA[灾难]]></category>
		<category><![CDATA[还原]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/20090610/1323.html</guid>
		<description><![CDATA[MySQL数据库灾难恢复
当 MySQL Server 因为各种无法预期的原因而损坏(Crash)的时候，你就必须要进行灾难恢复。如果你有做好定期的数据库备份那么灾难还原的时候应该会轻松很多，只要将备份起来的数据还原回去即可，但光是这样子还是会造成部份数据的遗失，例如 "现在" 至 "最后一次备份" 之间的数据，这时我们可以通过 MySQL 提供的 Binary Log 机制将可能遗失的数据降至最低。
Binary Log 的运作原理很简单，它只是单纯的将所有会修改到数据库内容的操作记录在 Log 文件中，然后通过这个 Binary Log 你就可以重新执行所有会修改到数据库内容的操作。例如若你最后一次备份的时间是 1/1 AM 0:00 ，并且有启用 Binary Log 功能记录 1/1 AM 0:00 这个时间点以后所有会修改到数据库内容的操作，假设你的 MySQL Server 在 1/2 AM 10:00 故障，你就可以将 1/1 AM 0:00 备份的数据还原回去，然后利用 Binary Log 将 1/1 AM 0:00 ~ 1/2 AM 10:00 之间所有的操作重新执行一次，这样子一来你就可以将数据库还原到当机的那个时间点。
使用 Binary Log [...]]]></description>
			<content:encoded><![CDATA[<p><strong>MySQL数据库灾难恢复</strong></p>
<p>当 MySQL Server 因为各种无法预期的原因而损坏(Crash)的时候，你就必须要进行灾难恢复。如果你有做好定期的数据库备份那么灾难还原的时候应该会轻松很多，只要将备份起来的数据还原回去即可，但光是这样子还是会造成部份数据的遗失，例如 "现在" 至 "最后一次备份" 之间的数据，这时我们可以通过 MySQL 提供的 Binary Log 机制将可能遗失的数据降至最低。</p>
<p>Binary Log 的运作原理很简单，它只是单纯的将所有会修改到数据库内容的操作记录在 Log 文件中，然后通过这个 Binary Log 你就可以重新执行所有会修改到数据库内容的操作。例如若你最后一次备份的时间是 1/1 AM 0:00 ，并且有启用 Binary Log 功能记录 1/1 AM 0:00 这个时间点以后所有会修改到数据库内容的操作，假设你的 MySQL Server 在 1/2 AM 10:00 故障，你就可以将 1/1 AM 0:00 备份的数据还原回去，然后利用 Binary Log 将 1/1 AM 0:00 ~ 1/2 AM 10:00 之间所有的操作重新执行一次，这样子一来你就可以将数据库还原到当机的那个时间点。</p>
<p>使用 Binary Log 进行灾难恢复的步骤：<br />
启用 Binary Log<br />
使用 mysqlbinlog 将 Binary Log 转换成可执行的 SQL 命令 </p>
<p>在接下来的文章中会使用的范例与假设：<br />
最后一次备份的时间点为 1/1 AM 0:00<br />
MySQL Server 在 1/2 AM 10:00 故障 </p>
<p><strong>一、启用 Binary Log </strong></p>
<p>修改 MySQL Server 的系统设置文件(eg. /etc/my.cnf)，在 [mysqld] 区块中加上 log-bin=mysql-bin 选项，然后重新启动 MySQL Server，例如：</p>
<div class="hl-surround"><div class="hl-main">[mysqld]<br />log-bin=mysql-bin</div></div>
<p>启用后你应该可以在 MySQL 的 Data Dir 里面发现如下的文件： </p>
<blockquote><p>mysql-bin.index<br />
mysql-bin.000001<br />
mysql-bin.000002<br />
...............<br />
mysql-bin.00000X</p></blockquote>
<p>MySQL 在以下几种情况会进行 lograrote： </p>
<ul>
<li>执行 Flush Logs 命令 </li>
<li>MySQL Server 重新启动 </li>
<li>设置文件中有进行额外的设置</li>
</ul>
<p>注：<br />
请注意，当你使用 mysqldump 进行数据库备份时请记得加上 <strong>--flush-logs</strong> 选项，例如：</p>
<div class="hl-surround"><div class="hl-main">mysqldump --flush-logs -u root -p 数据库名称 &gt; example.sql</div></div>
<p>这么做的目的是在备份时让 MySQL Server 进行 logrotate，这样子日后要辨别 "最后一次备份时间点" 之后的 Binary Log 会比较方便，因为若你没有主动(或通过设置)去删除 Binary Log，则只要你的硬盘空间够大，MySQL 会无限期的保存 Binary Log，也就是说你的 Binary Log 里面所记载的数据有可能包含 "最后一次备份时间点" 之前的数据。</p>
<p><strong>二、使用 mysqlbinlog 将 Binary Log 转换成可执行的 SQL 命令 </strong></p>
<p>Binary Log 是无法被 MySQL Server 直接执行、也无法直接以人眼去阅读的，必须要先使用 MySQL 所提供的 mysqlbinlog 程式，将 Binary Log 转换为 MySQL Server 可以执行的 SQL 命令。mysqlbinlog 的语法如下：</p>
<div class="hl-surround"><div class="hl-main">mysqlbinlog -H --set-charset=&quot;utf8&quot; --start-datatime=&quot;2007-01-01 00:00:00&quot; --stop-datatime=&quot;2007-01-02 10:00:00&quot; mysql-bin.[0-9]* &gt; example.sql</div></div>
<blockquote><p>-H：Display a hex dump of the log in comments.<br />
--set-charset：设置编码<br />
--start-datatime：要转换的开始时间点<br />
--stop-datatime：要转换的结束时间点</p></blockquote>
<p>mysql-bin.[0-9]*：这里要注意的是，要一次处理所有的 Binary Log，因为储存在 Binary Log 中的数据有可能会 "跨文件"，例如从 mysql-bin.000001 的结尾接到 mysql-bin.000002 的开头。</p>
<p>example.sql：转换出来的文件名称，这个名称可以自已取。</p>
<p>需要加 -H 选项的原因如下：</p>
<blockquote><p>mysqlbinlog didn't escape the string content of user variables, and did not deal well when these variables were in non-ASCII character sets; this is now fixed by always printing the string content of user variables in hexadecimal. The character set and collation of the string is now also printed. (Bug #3875) </p></blockquote>
<p><strong>三, 实际执行转换后的 Binary Log </strong><br />
很简单，只要一行简单的命令：</p>
<div class="hl-surround"><div class="hl-main">mysql &lt; example.sql</div></div>
<p>如果没有什么错误讯息发生，那么只要等它执行完就大功告成了。话又说回来，要是执行失败呢？这是有可能的。MySQL 在处理 Binary Log 时有一些 Bug 存在，它的 Bug Report 似乎是说在最新版本的 MySQL Server 中已修正此 Bug，我没有实际测试过所以不清楚，但若是你和我一样也遇到这个 Bug 的话，也不用太担心。这些问题其实不难解决，自己 Workaround 即可。</p>
<p>目前看到的情况有：<br />
Comment 没有正确标示<br />
Comment 语法错误<br />
不正确的使用 DELIMITER<br />
奇怪的 STOP 命令(不太确定这是做什么用的) </p>
<p>自己用 sed 去修改转换过后的 example.sql 即可。</p>
<div class="hl-surround"><div class="hl-main">sed -f replace.rules example.sql &gt; final.sql</div></div>
<p>replace.rules文件的内容：</p>
<div class="hl-surround"><div class="hl-main">s/\(Query.*thread\)/#\1/g<br />s/\(###.*###\)//g<br />s/DELIMITER ;//g<br />s/Stop//g</div></div>
<p>上面几行的意义：</p>
<div class="hl-surround"><div class="hl-main">s/\(Query.*thread\)/#\1/g</div></div>
<p>MySQL 的 Binary Log 在处理 Comment 的时候，有的时候会漏加 "#" 符号在 Comment Line 的最前面。<br />
例如本来是：</p>
<div class="hl-surround"><div class="hl-main">Query thread_id=227528 exec_time=- error_code=0</div></div>
<p>要改成：</p>
<div class="hl-surround"><div class="hl-main">#Query thread_id=227528 exec_time=- error_code=0</div></div>
<div class="hl-surround"><div class="hl-main">s/\(###.*###\)//g</div></div>
<p>在某些 SQL statement(例如 REPLACE INTO search)的最后面会有一些 Comment 存在，但这些 Comment 的语法不正确反而会造成执行失败，故删除之。<br />
类似以下的行都应该删除：</p>
<div class="hl-surround"><div class="hl-main">### Bitfield: user.options ###<br />### SAVE ORDERED IDS TO SEARCH CACHE ###</div></div>
<p>........等等</p>
<div class="hl-surround"><div class="hl-main">s/DELIMITER ;//g</div></div>
<p>删除不正确的 DELIMITER 命令，像以下这样就是不正确的：</p>
<div class="hl-surround"><div class="hl-main">DELIMITER ;</div></div>
<div class="hl-surround"><div class="hl-main">s/Stop//g</div></div>
<p>有的时候会在 Binary Log 中出现 Stop 这个命令而导致执行失败，故删除之。但我不太确定这个 Stop 命令实质上的用途是什么。 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090610/1323.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>抽烟技巧</title>
		<link>http://www.21andy.com/blog/20090610/1322.html</link>
		<comments>http://www.21andy.com/blog/20090610/1322.html#comments</comments>
		<pubDate>Wed, 10 Jun 2009 05:09:30 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[抽烟]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/20090610/1322.html</guid>
		<description><![CDATA[1. 泡一杯茶
2. 把过滤嘴放在茶里弄湿了
3. 开始抽吧
这样可以过滤焦油...试试
]]></description>
			<content:encoded><![CDATA[<p>1. 泡一杯茶<br />
2. 把过滤嘴放在茶里弄湿了<br />
3. 开始抽吧</p>
<p>这样可以过滤焦油...试试</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090610/1322.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用Ext JS开发网站管理系统的优缺点</title>
		<link>http://www.21andy.com/blog/20090609/1321.html</link>
		<comments>http://www.21andy.com/blog/20090609/1321.html#comments</comments>
		<pubDate>Mon, 08 Jun 2009 17:53:56 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[Ext]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/20090609/1321.html</guid>
		<description><![CDATA[Ext JS真的是非常的强大, 完美的UI, 结构良好的代码.
这几天在写一个程序, 用的Ext做的后台, 但后来我又放弃了.
改用jQuery+原生javascript来提高性能. jQuery UI不用.
第一眼见到Ext的那些演示的时候, 相信你和我一样都会为之所动.
但在目前的实际应用中, 我认为它是不合适的
一是文件太大, GZIP压缩后也还是大(相对来说)
二是耗CPU资源厉害, 特别是功能多的时候, 耗的资源更厉害, 比原生javascript慢了将近10倍
对比结果是测试一个Grid得来的, 开着任务管理器在看对比, 当然, 原生的javascript我没做到那么好看和复杂的功能了.
简洁实用才是王道.
三是学习成本比较高, 做什么都要查文档.
Ext的适用环境: 服务器与客户端连接的速度要快, 机器的配置要高.
用jQuery, 本来就奢侈, 更不用说Ext了.
不过话说回来, Ext用起来还真的是爽, html, css基本都不用写了, 特别适合不会做界面的程序员. 这也是众多程序员吹捧的原因.
如果实在喜欢Ext, 可以把它的风格仿制一套出来, 放到自己的框架中.
]]></description>
			<content:encoded><![CDATA[<p>Ext JS真的是非常的强大, 完美的UI, 结构良好的代码.<br />
这几天在写一个程序, 用的Ext做的后台, 但后来我又放弃了.<br />
改用jQuery+原生javascript来提高性能. jQuery UI不用.<br />
第一眼见到Ext的那些演示的时候, 相信你和我一样都会为之所动.<br />
但在目前的实际应用中, 我认为它是不合适的</p>
<p>一是文件太大, GZIP压缩后也还是大(相对来说)</p>
<p>二是耗CPU资源厉害, 特别是功能多的时候, 耗的资源更厉害, 比原生javascript慢了将近10倍<br />
对比结果是测试一个Grid得来的, 开着任务管理器在看对比, 当然, 原生的javascript我没做到那么好看和复杂的功能了.<br />
简洁实用才是王道.</p>
<p>三是学习成本比较高, 做什么都要查文档.</p>
<p>Ext的适用环境: 服务器与客户端连接的速度要快, 机器的配置要高.<br />
用jQuery, 本来就奢侈, 更不用说Ext了.</p>
<p>不过话说回来, Ext用起来还真的是爽, html, css基本都不用写了, 特别适合不会做界面的程序员. 这也是众多程序员吹捧的原因.</p>
<p>如果实在喜欢Ext, 可以把它的风格仿制一套出来, 放到自己的框架中.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090609/1321.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP Daemon</title>
		<link>http://www.21andy.com/blog/20090608/1320.html</link>
		<comments>http://www.21andy.com/blog/20090608/1320.html#comments</comments>
		<pubDate>Mon, 08 Jun 2009 08:34:00 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[Daemon]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[定时]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/20090608/1320.html</guid>
		<description><![CDATA[PEAR有一个System_Daemon
作者网站上的说明: http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/
类似这样安装:
aptitude -y updateaptitude -y install php-pearpear install -f system_daemon
像这样使用:
require_once &#34;System/Daemon.php&#34;;// Bare minimum setupSystem_Daemon::setOption(&#34;appName&#34;, &#34;simple&#34;);System_Daemon::setOption(&#34;authorEmail&#34;, &#34;kevin@example.com&#34;);&#160;// Spawn Deamon!System_Daemon::start();&#160;// Your PHP Here!while (true) {&#160;&#160; &#160;doTask();}&#160;// Stop daemon!System_Daemon::stop();
综合实例
#!/usr/bin/php -q&#60;?php/**&#160;* System_Daemon turns PHP-CLI scripts into daemons.&#160;* &#160;* PHP version 5&#160;*&#160;* @category  System&#160;* @package &#160; System_Daemon&#160;* @author &#160; &#160;Kevin &#60;kevin@vanzonneveld.net&#62;&#160;* @copyright 2008 Kevin van Zonneveld&#160;* @license &#160; http://www.opensource.org/licenses/bsd-license.php&#160;* [...]]]></description>
			<content:encoded><![CDATA[<p>PEAR有一个<a href="http://pear.php.net/package/System_Daemon/download">System_Daemon</a></p>
<p>作者网站上的说明: <a href="http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/">http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/</a></p>
<p><strong>类似这样安装:</strong></p>
<div class="hl-surround"><div class="hl-main">aptitude -y update<br />aptitude -y install php-pear<br />pear install -f system_daemon</div></div>
<p><strong>像这样使用:</strong></p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">require_once</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">System/Daemon.php</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// Bare minimum setup</span><span style="color: Gray;"><br /></span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">setOption</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">appName</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">simple</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">setOption</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">authorEmail</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">kevin@example.com</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">// Spawn Deamon!</span><span style="color: Gray;"><br /></span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">start</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">// Your PHP Here!</span><span style="color: Gray;"><br /></span><span style="color: Green;">while</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">doTask</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">// Stop daemon!</span><span style="color: Gray;"><br /></span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">stop</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></div></div>
<h2>综合实例</h2>
<div class="hl-surround"><div class="hl-main"><span style="color: Gray;">#!/usr/bin/php -q<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">/**<br />&nbsp;* System_Daemon turns PHP-CLI scripts into daemons.<br />&nbsp;* <br />&nbsp;* PHP version 5<br />&nbsp;*<br />&nbsp;*</span><span style="color: Blue;"> @category </span><span style="color: #ffa500;"> System<br />&nbsp;*</span><span style="color: Blue;"> @package </span><span style="color: #ffa500;">&nbsp; System_Daemon<br />&nbsp;*</span><span style="color: Blue;"> @author </span><span style="color: #ffa500;">&nbsp; &nbsp;Kevin &lt;</span><span style="color: Blue;">kevin@vanzonneveld.net</span><span style="color: #ffa500;">&gt;<br />&nbsp;*</span><span style="color: Blue;"> @copyright </span><span style="color: #ffa500;">2008 Kevin van Zonneveld<br />&nbsp;*</span><span style="color: Blue;"> @license </span><span style="color: #ffa500;">&nbsp; </span><span style="color: Blue;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #ffa500;"><br />&nbsp;*</span><span style="color: Blue;"> @version </span><span style="color: #ffa500;">&nbsp; SVN: Release: </span><span style="color: Blue;">$Id: logparser.php 215 2009-04-25 10:10:18Z kevin $</span><span style="color: #ffa500;"><br />&nbsp;*</span><span style="color: Blue;"> @link </span><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">http://trac.plutonia.nl/projects/system_daemon</span><span style="color: #ffa500;"><br />&nbsp;*/</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">/**<br />&nbsp;* System_Daemon Example Code<br />&nbsp;* <br />&nbsp;* If you run this code successfully, a daemon will be spawned<br />&nbsp;* but unless have already generated the init.d script, you have<br />&nbsp;* no real way of killing it yet.<br />&nbsp;* <br />&nbsp;* In this case wait 3 runs, which is the maximum for this example. <br />&nbsp;* <br />&nbsp;* <br />&nbsp;* In panic situations, you can always kill you daemon by typing<br />&nbsp;* <br />&nbsp;* killall -9 logparser.php<br />&nbsp;* OR:<br />&nbsp;* killall -9 php<br />&nbsp;* <br />&nbsp;*/</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">// Allowed arguments &amp; their defaults </span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$runmode</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">no-daemon</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: Green;">false</span><span style="color: Gray;">, <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">help</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: Green;">false</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">write-initd</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: Green;">false</span><span style="color: Gray;"><br /></span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">// Scan command line attributes for allowed arguments</span><span style="color: Gray;"><br /></span><span style="color: Green;">foreach</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$argv</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$k</span><span style="color: Gray;">=&gt;</span><span style="color: #00008b;">$arg</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$arg</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">--</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$runmode</span><span style="color: Olive;">[</span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$arg</span><span style="color: Gray;">, </span><span style="color: Maroon;">2</span><span style="color: Olive;">)]))</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$runmode</span><span style="color: Olive;">[</span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$arg</span><span style="color: Gray;">, </span><span style="color: Maroon;">2</span><span style="color: Olive;">)]</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">// Help mode. Shows allowed argumentents and quit directly</span><span style="color: Gray;"><br /></span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$runmode</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">help</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Usage: </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: #00008b;">$argv</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> [runmode]</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Available runmodes:</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">foreach</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$runmode</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$runmod</span><span style="color: Gray;">=&gt;</span><span style="color: #00008b;">$val</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> --</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: #00008b;">$runmod</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">die</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">// Make it possible to test in source directory</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">// This is for PEAR developers only</span><span style="color: Gray;"><br /></span><span style="color: Blue;">ini_set</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">include_path</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">ini_get</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">include_path</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: #8b0000;">'</span><span style="color: Red;">:..</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">// Include Class</span><span style="color: Gray;"><br /></span><span style="color: Blue;">error_reporting</span><span style="color: Olive;">(</span><span style="color: Blue;">E_ALL</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">require_once</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">System/Daemon.php</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">// Setup</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$options</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">appName</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">logparser</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">appDir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: Blue;">dirname</span><span style="color: Olive;">(</span><span style="color: Green;">__FILE__</span><span style="color: Olive;">)</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">appDescription</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Parses vsftpd logfiles and stores them in MySQL</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">authorName</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Kevin van Zonneveld</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">authorEmail</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">kevin@vanzonneveld.net</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">sysMaxExecutionTime</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">sysMaxInputTime</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">sysMemoryLimit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1024M</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">appRunAsGID</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: Maroon;">1000</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">appRunAsUID</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: Maroon;">1000</span><span style="color: Gray;"><br /></span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">setOptions</span><span style="color: Olive;">(</span><span style="color: #00008b;">$options</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">// Overrule the signal handler with any function</span><span style="color: Gray;"><br /></span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">setSigHandler</span><span style="color: Olive;">(</span><span style="color: Blue;">SIGCONT</span><span style="color: Gray;">, </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">System_Daemon</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">defaultSigHandler</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp;<br /></span><span style="color: #ffa500;">// This program can also be run in the forground with runmode --no-daemon</span><span style="color: Gray;"><br /></span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: #00008b;">$runmode</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">no-daemon</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">])</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// Spawn Daemon </span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">start</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">// With the runmode --write-initd, this program can automatically write a </span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">// system startup file called: 'init.d'</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">// This will make sure your daemon will be started on reboot </span><span style="color: Gray;"><br /></span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: #00008b;">$runmode</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">write-initd</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">])</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">LOG_INFO</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">not writing </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">an init.d script this time</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"> </span><span style="color: Green;">else</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">((</span><span style="color: #00008b;">$initd_location</span><span style="color: Gray;"> = </span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">writeAutoRun</span><span style="color: Olive;">())</span><span style="color: Gray;"> === </span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">LOG_NOTICE</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">unable to write </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">init.d script</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"> </span><span style="color: Green;">else</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">LOG_INFO</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">sucessfully written </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">startup script: </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: #00008b;">$initd_location</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">// Run your code</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">// Here comes your own actual code</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">// This variable gives your own code the ability to breakdown the daemon:</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$runningOkay</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">// This variable keeps track of how many 'runs' or 'loops' your daemon has</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">// done so far. For example purposes, we're quitting on 3.</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$cnt</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">// While checks on 3 things in this case:</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">// - That the Daemon Class hasn't reported it's dying</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">// - That your own code has been running Okay</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">// - That we're not executing more than 3 runs </span><span style="color: Gray;"><br /></span><span style="color: Green;">while</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">isDying</span><span style="color: Olive;">()</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: #00008b;">$runningOkay</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: #00008b;">$cnt</span><span style="color: Gray;"> &lt;=</span><span style="color: Maroon;">3</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// What mode are we in?</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$mode</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">'</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: Olive;">(</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">isInBackground</span><span style="color: Olive;">()</span><span style="color: Gray;"> ? </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;"> : </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">non-</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;">.<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">daemon' mode</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// Log something using the Daemon class's logging facility</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// Depending on runmode it will either end up:</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//&nbsp; - In the /var/log/logparser.log</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//&nbsp; - On screen (in case we're not a daemon yet)&nbsp; </span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">LOG_INFO</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">getOption</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">appName</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> running in </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: #00008b;">$mode</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: #00008b;">$cnt</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/3</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// In the actuall logparser program, You could replace 'true'</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// With e.g. a&nbsp; parseLog('vsftpd') function, and have it return</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// either true on success, or false on failure.</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$runningOkay</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//$runningOkay = parseLog('vsftpd');</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// Should your parseLog('vsftpd') return false, then</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// the daemon is automatically shut down.</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// An extra log entry would be nice, we're using level 3,</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// which is critical.</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// Level 4 would be fatal and shuts down the daemon immediately,</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// which in this case is handled by the while condition.</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: #00008b;">$runningOkay</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">LOG_ERR</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">parseLog() </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">produced an error, </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">so this will be my last run</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// Relax the system by sleeping for a little bit</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">// iterate also clears statcache</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">iterate</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$cnt</span><span style="color: Gray;">++;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">// Shut down the daemon nicely</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">// This is ignored if the class is actually running in the foreground</span><span style="color: Gray;"><br /></span><span style="color: Blue;">System_Daemon</span><span style="color: Gray;">::</span><span style="color: Blue;">stop</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">?&gt;</span></div></div>
<h2>控制 Daemon</h2>
<p><strong>执行daemon</strong></p>
<div class="hl-surround"><div class="hl-main">chmod a+x ./logparser.php<br />./logparser.php</div></div>
<p><strong>检查daemon</strong><br />
Your daemon has no way of communicating through your console, so check for messages in:</p>
<div class="hl-surround"><div class="hl-main">tail /var/log/logparser.log</div></div>
<p>看看是不是还在运行:</p>
<div class="hl-surround"><div class="hl-main">ps uf -C logparser.php</div></div>
<p><strong>Kill daemon</strong><br />
Without the start/stop files (see below for howto), you need to:</p>
<div class="hl-surround"><div class="hl-main">killall -9 logparser.php</div></div>
<p><strong>开始 / 停止 (只支持Debian &#038; Ubuntu)</strong><br />
真正的daemons有一个init.d文件. 记得怎么样启动apache吧?</p>
<div class="hl-surround"><div class="hl-main">/etc/init.d/apache2 restart</div></div>
<p>用这个方法停止更好:</p>
<div class="hl-surround"><div class="hl-main">/etc/init.d/logparser stop<br />/etc/init.d/logparser start</div></div>
<p>Well with System_Daemon you can write autostartup files using the <strong>writeAutoRun()</strong> method, look:</p>
<div class="hl-surround"><div class="hl-main">$path = System_Daemon::writeAutoRun();</div></div>
<p>On success, this will return the path to the autostartup file: /etc/init.d/logparser, and you're good to go!</p>
<p><strong>启动时运行daemon</strong><br />
在 <strong>Debian &#038; Ubuntu</strong> 上输入以下命令:</p>
<div class="hl-surround"><div class="hl-main">update-rc.d logparser defaults</div></div>
<p>现在系统启动就会自动运行logparser. </p>
<p>如果要停止, 输入如下命令:</p>
<div class="hl-surround"><div class="hl-main">update-rc.d -f logparser remove</div></div>
<p>另外, PHP的进程控制, 可以看<br />
<a href="http://www.php.net/manual/en/book.pcntl.php">http://www.php.net/manual/en/book.pcntl.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090608/1320.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>模拟炒股系统开发的难点</title>
		<link>http://www.21andy.com/blog/20090608/1319.html</link>
		<comments>http://www.21andy.com/blog/20090608/1319.html#comments</comments>
		<pubDate>Mon, 08 Jun 2009 06:04:33 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[股票]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/20090608/1319.html</guid>
		<description><![CDATA[21Andy.com原创
最难的部份是委托单
如某股票当前股价是6.00元, 用户下了5.90的买入单
系统就要按监控周期不停的监控这张委托单和股票的价格变化, 直到股票的价格]]></description>
			<content:encoded><![CDATA[<p>21Andy.com原创</p>
<p>最难的部份是委托单</p>
<p>如某股票当前股价是6.00元, 用户下了5.90的买入单<br />
系统就要按监控周期不停的监控这张委托单和股票的价格变化, 直到股票的价格<=5.90<br />
在多用户多委托单的情况下, 解决起来还是比较麻烦的, 这也是整个系统的核心所在.<br />
因为委托单是自动成交的, 所以必须把股票的实时行情本地化, 这将加大开销.</p>
<p>自己举个例子算一下数据:<br />
上深所有A股 = 2000支<br />
用户数 = 100人<br />
每人每天下单数量 = 10单<br />
监控是否可以成交周期 = 5秒</p>
<p>21Andy.com原创</p>
<p>这样每5秒就要执行一次, 以下代码我直接在这里现写的, 未测试...</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #00008b;">$stocks</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$db</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">get_result</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">SELECT code,price FROM last_price ORDER BY code ASC;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 这里会有严重的问题</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//$order_codes = $db-&gt;get_col('SELECT DISTINCT code FROM orders;');</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$buy_orders</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$db</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">get_result</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">SELECT code,price FROM orders WHERE type = 'buy';</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$sell_orders</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$db</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">get_result</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">SELECT code,price FROM orders WHERE type = 'sell';</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">foreach</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$stocks</span><span style="color: Gray;"> </span><span style="color: Green;">AS</span><span style="color: Gray;"> </span><span style="color: #00008b;">$stock</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: #ffa500;">// 遍历所有股票 2000支</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">foreach</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$buy_orders</span><span style="color: Gray;"> </span><span style="color: Green;">AS</span><span style="color: Gray;"> </span><span style="color: #00008b;">$border</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: #ffa500;">// 遍历个股买入委托 1000单 = 100人*10单</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$stock</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">code</span><span style="color: Gray;"> != </span><span style="color: #00008b;">$border</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">code</span><span style="color: Gray;"> || </span><span style="color: #00008b;">$stock</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">price</span><span style="color: Gray;"> &gt;= </span><span style="color: #00008b;">$border</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">price</span><span style="color: Olive;">)</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">continue</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">// 开始买入委托成交, 更新订单成交时间, 移出order表</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">foreach</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$sell_orders</span><span style="color: Gray;"> </span><span style="color: Green;">AS</span><span style="color: Gray;"> </span><span style="color: #00008b;">$sorder</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: #ffa500;">// 遍历个股卖出委托&nbsp; 1000单 = 100人*10单</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$stock</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">code</span><span style="color: Gray;"> != </span><span style="color: #00008b;">$sorder</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">code</span><span style="color: Gray;"> || </span><span style="color: #00008b;">$stock</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">price</span><span style="color: Gray;"> &lt;= </span><span style="color: #00008b;">$border</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">price</span><span style="color: Olive;">)</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">continue</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">// 开始卖出委托成交,&nbsp; 更新订单成交时间, 移出order表</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span><span style="color: Gray;"></span></div></div>
<p>我上面注了, "这里会有严重的问题", last_price表是所有股票的最新行情, 那么它的变化可能就是1秒以内的事<br />
而监控5秒才执行一次, 这里会错过价格变化.<br />
其实上面的可以简化为</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #00008b;">$buy_orders</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$db</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">get_result</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">SELECT o.code,o.price FROM orders o JOIN last_price l ON o.code = l.code WHERE o.type = 'buy' AND o.price &lt;= l.price;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 可成交的买入委托</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$sell_orders</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$db</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">get_result</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">SELECT o.code,o.price FROM orders o JOIN last_price l ON o.code = l.code WHERE o.type = 'sell' AND o.price &gt;= l.price;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 可成交的卖出委托</span><span style="color: Gray;"></span></div></div>
<p>总结办法有2个:<br />
1. 在更新每支股票股价的时候, 查找每支股票相应可以成交的委托单<br />
可以实时最快成交. 但这样消耗可能会很大, 每1秒都要重复做的事: 更新2000支股票的价格, 还要每支股票查找一次可以成交的订单, 还要其他成交后一系列的操作.<br />
2. 定时遍历股票<br />
这就是我上面说的方法, 但这样会错过价格变化, 取价格的方法不对. 不能取单一时间的价格, 而是要取时间段的最小(大)价格.这样就不能从最终价格表来取, 而要从历史价格表取.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090608/1319.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>4种生成定单号的解决方案</title>
		<link>http://www.21andy.com/blog/20090608/1318.html</link>
		<comments>http://www.21andy.com/blog/20090608/1318.html#comments</comments>
		<pubDate>Sun, 07 Jun 2009 16:55:33 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[脚本收藏]]></category>
		<category><![CDATA[定单号]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/20090608/1318.html</guid>
		<description><![CDATA[生成定单号方案一:
create table tbl_test (id bigint not null auto_increment, value varchar(20) not null, primary key (id));alter table tbl_test auto_increment = 100000000;
或者
create table tbl_test (id bigint not null auto_increment, value varchar(20) not null, primary key (id));mysql_query($conn, &#34;insert into tbl_test (value) values ('foo')&#34;);
$order_id = &#34;1&#34; . sprintf(&#34;%08d&#34;, mysql_insert_id($conn));
这二者一样, 都是从100000000开始
生成定单号方案二:
表类型Myisam, 用2个主键字段
prefix: varchar类型，主键id: int类型，主键，并自增
注意，两个字段都是主键
订单号就会像这样
prefix id
A      [...]]]></description>
			<content:encoded><![CDATA[<p><strong>生成定单号方案一:</strong></p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">create</span><span style="color: Gray;"> </span><span style="color: Green;">table</span><span style="color: Gray;"> </span><span style="color: Blue;">tbl_test</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">id</span><span style="color: Gray;"> </span><span style="color: Blue;">bigint</span><span style="color: Gray;"> </span><span style="color: Green;">not</span><span style="color: Gray;"> </span><span style="color: Green;">null</span><span style="color: Gray;"> </span><span style="color: Blue;">auto_increment</span><span style="color: Gray;">, </span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">20</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">not</span><span style="color: Gray;"> </span><span style="color: Green;">null</span><span style="color: Gray;">, </span><span style="color: Green;">primary</span><span style="color: Gray;"> </span><span style="color: Green;">key</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">id</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br /></span><span style="color: Green;">alter</span><span style="color: Gray;"> </span><span style="color: Green;">table</span><span style="color: Gray;"> </span><span style="color: Blue;">tbl_test</span><span style="color: Gray;"> </span><span style="color: Blue;">auto_increment</span><span style="color: Gray;"> = </span><span style="color: Maroon;">100000000</span><span style="color: Gray;">;</span></div></div>
<p>或者</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">create</span><span style="color: Gray;"> </span><span style="color: Green;">table</span><span style="color: Gray;"> </span><span style="color: Blue;">tbl_test</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">id</span><span style="color: Gray;"> </span><span style="color: Blue;">bigint</span><span style="color: Gray;"> </span><span style="color: Green;">not</span><span style="color: Gray;"> </span><span style="color: Green;">null</span><span style="color: Gray;"> </span><span style="color: Blue;">auto_increment</span><span style="color: Gray;">, </span><span style="color: Green;">value</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">20</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">not</span><span style="color: Gray;"> </span><span style="color: Green;">null</span><span style="color: Gray;">, </span><span style="color: Green;">primary</span><span style="color: Gray;"> </span><span style="color: Green;">key</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">id</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">mysql_query</span><span style="color: Olive;">(</span><span style="color: Gray;">$</span><span style="color: Blue;">conn</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">insert into tbl_test (value) values ('foo')</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<div class="hl-surround"><div class="hl-main"><span style="color: #00008b;">$order_id</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> . </span><span style="color: Blue;">sprintf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">%08d</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">mysql_insert_id</span><span style="color: Olive;">(</span><span style="color: #00008b;">$conn</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></div></div>
<p>这二者一样, 都是从100000000开始</p>
<p><strong>生成定单号方案二:</strong><br />
表类型Myisam, 用2个主键字段</p>
<div class="hl-surround"><div class="hl-main">prefix: varchar类型，主键<br />id: int类型，主键，并自增</div></div>
<p>注意，两个字段都是主键<br />
订单号就会像这样</p>
<blockquote><p>prefix id<br />
A      1<br />
A      2<br />
...<br />
B      1<br />
B      2</p></blockquote>
<p><strong>生成定单号方案三:</strong><br />
类似tinyurl的生成方法, 这种方法定单号很短, 但定单号看起来就不那么"专业"了...</p>
<p><strong>生成定单号方案四:</strong><br />
这种方法生成的定单号, 看起来相当"专业", 但也很长...<br />
有个小技巧, 每个网站用户, 都会有一个唯一的ID, 再加上时间, 就能确保唯一性<br />
保守一点, 咱网站用户最多让他100万个吧<br />
那就是090608 010925 1000000<br />
一共6+6+7=19位</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090608/1318.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CodeIgniter DX Auth 中文手册翻译</title>
		<link>http://www.21andy.com/blog/20090607/1317.html</link>
		<comments>http://www.21andy.com/blog/20090607/1317.html#comments</comments>
		<pubDate>Sun, 07 Jun 2009 10:10:44 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[Auth]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[DX Auth]]></category>
		<category><![CDATA[验证]]></category>

		<guid isPermaLink="false">http://www.21andy.com/blog/20090607/1317.html</guid>
		<description><![CDATA[翻译: Fanbin
DX Auth User Guide Version 1.0 参考手册
原文：http://dexcell.shinsengumiteam.com/dx_auth/index.html
欢迎使用 DX Auth
DX Auth 是一个CodeIgniter（PHP框架）的身份验证库。她的目标是是你容易地实现安全，容易的在你的项目中使用身份验证库，同时给你选择简单验证系统或全能验证系统的灵活性。
DX Auth 是以国际化思路构建的，所以所有的字符串都是在语言文件中可用的。（除了捆绑的示例，因为那时你的代码而不是库）。
它由 Jason Ashdown 基于 CL Auth 0.2.5 开发。
DX Auth的特色有哪些？
基本验证（登录，注销，注册，修改密码）。
记住我。
使用用户名或E-mail或两者登录（依赖于你的配置）。
忘记密码。
踢人。
最后登录的IP地址和时间（可选）。
E-mail 激活（可选）。
用户档案（可选）。
基于角色（管理员，用户，版主，等）。也支持继承（可选）。
基于URI和角色限制页面访问（可选）。
为每个角色自定义权限（可选）。
登录尝试（可选）。你可以使用它在指定的尝试次数后显示验证码以阻止机器人。
事件（例如：你可以自己加上在用户激活后发送欢迎站内信的代码）。
验证码（可选，自带的和reCAPTICHA均可用）。
简单的管理员面板（这样你可以对它自定义，把它包含进你自己的管理员面板，或者如果你不需要就删了它）。
多数特性是可选的，意味着你可以在配置文件里把它关掉，删掉，或放着不用它。
CL Auth 0.2.5 后的更新
如果你以前用过 CL Auth，你或许想知道在 CL Auth 0.2.5 后有些什么更新。
Bug 修正。
添加、修改函数
修改了代码结构
组改为角色
直接与 CI 绑定的 session 兼容
为国际化添加语言文件
所有的函数命名以 “lower_case” 风格取代了“camelCase”风格。
源代码书写遵循 CI 用户手册规范
添加源代码注释，这样你可以容易地跟进。
带有详细解释的 CodeIgniter 风格用户手册。
还有其他一些我忘了的鸟...
看起来挺好，从哪儿开始呢？请阅读“开始”或者看示例。
DX Auth 在 CI 1.7.0 下测试通过，但在以前版本中应该也可以使用。
CodeIgniter DX Auth 插件安装
原文：http://dexcell.shinsengumiteam.com/dx_auth/installation/index.html
下载 DX Auth
点此下载  官方页面：http://dexcell.shinsengumiteam.com/dx_auth/installation/downloads.html
安装说明
安装带有示例的 DX [...]]]></description>
			<content:encoded><![CDATA[<h2>翻译: Fanbin</h2>
<h2>DX Auth User Guide Version 1.0 参考手册</h2>
<p>原文：<a href="http://dexcell.shinsengumiteam.com/dx_auth/index.html">http://dexcell.shinsengumiteam.com/dx_auth/index.html</a></p>
<p>欢迎使用 DX Auth</p>
<p>DX Auth 是一个CodeIgniter（PHP框架）的身份验证库。她的目标是是你容易地实现安全，容易的在你的项目中使用身份验证库，同时给你选择简单验证系统或全能验证系统的灵活性。</p>
<p>DX Auth 是以国际化思路构建的，所以所有的字符串都是在语言文件中可用的。（除了捆绑的示例，因为那时你的代码而不是库）。</p>
<p>它由 Jason Ashdown 基于 CL Auth 0.2.5 开发。</p>
<p>DX Auth的特色有哪些？</p>
<p>基本验证（登录，注销，注册，修改密码）。<br />
记住我。<br />
使用用户名或E-mail或两者登录（依赖于你的配置）。<br />
忘记密码。<br />
踢人。<br />
最后登录的IP地址和时间（可选）。<br />
E-mail 激活（可选）。<br />
用户档案（可选）。<br />
基于角色（管理员，用户，版主，等）。也支持继承（可选）。<br />
基于URI和角色限制页面访问（可选）。<br />
为每个角色自定义权限（可选）。<br />
登录尝试（可选）。你可以使用它在指定的尝试次数后显示验证码以阻止机器人。<br />
事件（例如：你可以自己加上在用户激活后发送欢迎站内信的代码）。<br />
验证码（可选，自带的和reCAPTICHA均可用）。<br />
简单的管理员面板（这样你可以对它自定义，把它包含进你自己的管理员面板，或者如果你不需要就删了它）。<br />
多数特性是可选的，意味着你可以在配置文件里把它关掉，删掉，或放着不用它。</p>
<p>CL Auth 0.2.5 后的更新</p>
<p>如果你以前用过 CL Auth，你或许想知道在 CL Auth 0.2.5 后有些什么更新。</p>
<p>Bug 修正。<br />
添加、修改函数<br />
修改了代码结构<br />
组改为角色<br />
直接与 CI 绑定的 session 兼容<br />
为国际化添加语言文件<br />
所有的函数命名以 “lower_case” 风格取代了“camelCase”风格。<br />
源代码书写遵循 CI 用户手册规范<br />
添加源代码注释，这样你可以容易地跟进。<br />
带有详细解释的 CodeIgniter 风格用户手册。<br />
还有其他一些我忘了的鸟...<br />
看起来挺好，从哪儿开始呢？请阅读“开始”或者看示例。</p>
<p>DX Auth 在 CI 1.7.0 下测试通过，但在以前版本中应该也可以使用。</p>
<h2>CodeIgniter DX Auth 插件安装</h2>
<p>原文：<a href="http://dexcell.shinsengumiteam.com/dx_auth/installation/index.html">http://dexcell.shinsengumiteam.com/dx_auth/installation/index.html</a></p>
<p><strong>下载 DX Auth</strong></p>
<p><a href="http://dexcell.shinsengumiteam.com/dx_auth/dx_auth.php">点此下载 </a> 官方页面：<a href="http://dexcell.shinsengumiteam.com/dx_auth/installation/downloads.html">http://dexcell.shinsengumiteam.com/dx_auth/installation/downloads.html</a></p>
<p><strong>安装说明</strong></p>
<p><strong>安装带有示例的 DX Auth</strong></p>
<ol>
<li>将压缩包解压。</li>
<li>复制 captcha 文件夹到你的 CI 文件夹。让 Web 服务器对此文件夹可写。</li>
<li>复制 application 文件夹到你的 CI application 文件夹。</li>
<li>将 DX Auth 的数据库结构安装到你的数据库。</li>
<li>打开 application/config/config.php。修改 $config['sess_use_database'] 为 TRUE。</li>
</ol>
<p><strong>只安装 DX Auth 库</strong></p>
<ol>
<li>将压缩包解压。</li>
<li>复制 captcha 文件夹到你的 CI 文件夹。让 Web 服务器对此文件夹可写。</li>
<li>复制 application/plugins/ 文件夹到你的 CI application/plugins/ 文件夹。</li>
<li>复制 application/config/ 文件夹到你的 CI application/config/ 文件夹。</li>
<li>复制 application/libraries/ 文件夹到你的 CI application/libraries/ 文件夹。</li>
<li>复制 application/helpers/ 文件夹到你的 CI application/helpers/ 文件夹。</li>
<li>复制 application/models/ 文件夹到你的 CI application/models/ 文件夹。</li>
<li>复制 application/language/ 文件夹到你的 CI application/language/ 文件夹。</li>
<li>将 DX Auth 的数据库结构安装到你的数据库。</li>
<li> 打开 application/config/config.php。修改 $config['sess_use_database'] 为 TRUE。</li>
</ol>
<p>搞定！</p>
<p>如果你初学 DX Auth，请阅读<span style="font-family: 黑体;">用户手册</span>的<span style="font-family: 黑体;">开始</span>章节以开始使用 DX Auth。 </p>
<p><strong>数据库结构</strong></p>
<p>下面是 DX Auth 库所需的数据库结构，或者你也可以在下载 zip 文件并解压后从 'schema.sql' 中找到它。</p>
<p>这将安装：</p>
<ul>
<li>名为 'ci_sessions' 的 CI Session 表。如果在你的数据库中已经有这个表你可以删掉 'ci_session' 的安装脚本。</li>
<li>DX Auth 库表。</li>
<li>具有管理员角色的用户，用户名：admin，密码：hello。</li>
<li>具有用户角色的用户，用户名：user，密码：hello。</li>
<li>role_table 中的默认角色（用户和管理员）。</li>
</ul>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">SET</span><span style="color: Gray;"> </span><span style="color: Blue;">SQL_MODE</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">NO_AUTO_VALUE_ON_ZERO</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/*!40101 SET NAMES utf8 */</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">-- --------------------------------------------------------</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">--<br />-- Table structure for table `ci_sessions`</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">--<br />&nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Green;">CREATE</span><span style="color: Gray;"> </span><span style="color: Green;">TABLE</span><span style="color: Gray;"> </span><span style="color: Blue;">IF</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: #00008b;">EXISTS</span><span style="color: Gray;"> </span><span style="color: #8b0000;">`</span><span style="color: Blue;">ci_sessions</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"><br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">session_id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">40</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">ip_address</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">16</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">user_agent</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">150</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">last_activity</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">int</span><span style="color: Olive;">(</span><span style="color: Maroon;">10</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">unsigned</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">user_data</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Blue;">text</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: Green;">PRIMARY</span><span style="color: Gray;"> </span><span style="color: Green;">KEY</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #8b0000;">`</span><span style="color: Blue;">session_id</span><span style="color: #8b0000;">`</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">ENGINE</span><span style="color: Gray;">=</span><span style="color: Blue;">InnoDB</span><span style="color: Gray;"> </span><span style="color: Green;">DEFAULT</span><span style="color: Gray;"> </span><span style="color: Blue;">CHARSET</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8</span><span style="color: Gray;"> </span><span style="color: Green;">COLLATE</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">-- --------------------------------------------------------</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">--<br />-- Table structure for table `login_attempts`</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">--<br />&nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Green;">CREATE</span><span style="color: Gray;"> </span><span style="color: Green;">TABLE</span><span style="color: Gray;"> </span><span style="color: Blue;">IF</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: #00008b;">EXISTS</span><span style="color: Gray;"> </span><span style="color: #8b0000;">`</span><span style="color: Blue;">login_attempts</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"><br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">int</span><span style="color: Olive;">(</span><span style="color: Maroon;">11</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Blue;">auto_increment</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">ip_address</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">40</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">time</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">timestamp</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: Green;">CURRENT_TIMESTAMP</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"> </span><span style="color: Green;">update</span><span style="color: Gray;"> </span><span style="color: Green;">CURRENT_TIMESTAMP</span><span style="color: Gray;">,<br /></span><span style="color: Green;">PRIMARY</span><span style="color: Gray;"> </span><span style="color: Green;">KEY</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">ENGINE</span><span style="color: Gray;">=</span><span style="color: Blue;">InnoDB</span><span style="color: Gray;"> </span><span style="color: Green;">DEFAULT</span><span style="color: Gray;"> </span><span style="color: Blue;">CHARSET</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8</span><span style="color: Gray;"> </span><span style="color: Green;">COLLATE</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Blue;">AUTO_INCREMENT</span><span style="color: Gray;">=</span><span style="color: Maroon;">1</span><span style="color: Gray;"> ;<br />&nbsp;<br /></span><span style="color: #ffa500;">-- --------------------------------------------------------</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">--<br />-- Table structure for table `roles`</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">--<br />&nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Green;">CREATE</span><span style="color: Gray;"> </span><span style="color: Green;">TABLE</span><span style="color: Gray;"> </span><span style="color: Blue;">IF</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: #00008b;">EXISTS</span><span style="color: Gray;"> </span><span style="color: #8b0000;">`</span><span style="color: Blue;">roles</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"><br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">int</span><span style="color: Olive;">(</span><span style="color: Maroon;">11</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Blue;">auto_increment</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">parent_id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">int</span><span style="color: Olive;">(</span><span style="color: Maroon;">11</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">name</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">30</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: Green;">PRIMARY</span><span style="color: Gray;"> </span><span style="color: Green;">KEY</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">ENGINE</span><span style="color: Gray;">=</span><span style="color: Blue;">InnoDB</span><span style="color: Gray;"> </span><span style="color: Green;">DEFAULT</span><span style="color: Gray;"> </span><span style="color: Blue;">CHARSET</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8</span><span style="color: Gray;"> </span><span style="color: Green;">COLLATE</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Blue;">AUTO_INCREMENT</span><span style="color: Gray;">=</span><span style="color: Maroon;">3</span><span style="color: Gray;"> ;<br />&nbsp;<br /></span><span style="color: #ffa500;">--<br />-- Dumping data for table `roles`</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">--<br />&nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Green;">INSERT</span><span style="color: Gray;"> </span><span style="color: Green;">INTO</span><span style="color: Gray;"> </span><span style="color: #8b0000;">`</span><span style="color: Blue;">roles</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">parent_id</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">name</span><span style="color: #8b0000;">`</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">VALUES</span><span style="color: Gray;"><br /></span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">User</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">,<br /></span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">Admin</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">-- --------------------------------------------------------</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">--<br />-- Table structure for table `permissions`</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">--<br />&nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Green;">CREATE</span><span style="color: Gray;"> </span><span style="color: Green;">TABLE</span><span style="color: Gray;"> </span><span style="color: Blue;">IF</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: #00008b;">EXISTS</span><span style="color: Gray;"> </span><span style="color: #8b0000;">`</span><span style="color: Blue;">permissions</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"><br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">int</span><span style="color: Olive;">(</span><span style="color: Maroon;">11</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Blue;">auto_increment</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">role_id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">int</span><span style="color: Olive;">(</span><span style="color: Maroon;">11</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">data</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Blue;">text</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;">,<br /></span><span style="color: Green;">PRIMARY</span><span style="color: Gray;"> </span><span style="color: Green;">KEY</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">ENGINE</span><span style="color: Gray;">=</span><span style="color: Blue;">InnoDB</span><span style="color: Gray;"> </span><span style="color: Green;">DEFAULT</span><span style="color: Gray;"> </span><span style="color: Blue;">CHARSET</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8</span><span style="color: Gray;"> </span><span style="color: Green;">COLLATE</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Blue;">AUTO_INCREMENT</span><span style="color: Gray;">=</span><span style="color: Maroon;">1</span><span style="color: Gray;"> ;<br />&nbsp;<br /></span><span style="color: #ffa500;">-- --------------------------------------------------------</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">--<br />-- Table structure for table `users`</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">--<br />&nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Green;">CREATE</span><span style="color: Gray;"> </span><span style="color: Green;">TABLE</span><span style="color: Gray;"> </span><span style="color: Blue;">IF</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: #00008b;">EXISTS</span><span style="color: Gray;"> </span><span style="color: #8b0000;">`</span><span style="color: Blue;">users</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"><br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">int</span><span style="color: Olive;">(</span><span style="color: Maroon;">11</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Blue;">auto_increment</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">role_id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">int</span><span style="color: Olive;">(</span><span style="color: Maroon;">11</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">1</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">username</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">25</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">password</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">34</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">email</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">100</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">banned</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Blue;">tinyint</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">ban_reason</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">255</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">newpass</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">34</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">newpass_key</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">32</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">newpass_time</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Blue;">datetime</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">last_ip</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">40</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">last_login</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Blue;">datetime</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">0000-00-00 00:00:00</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">created</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Blue;">datetime</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">0000-00-00 00:00:00</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">modified</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">timestamp</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: Green;">CURRENT_TIMESTAMP</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"> </span><span style="color: Green;">update</span><span style="color: Gray;"> </span><span style="color: Green;">CURRENT_TIMESTAMP</span><span style="color: Gray;">,<br /></span><span style="color: Green;">PRIMARY</span><span style="color: Gray;"> </span><span style="color: Green;">KEY</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">ENGINE</span><span style="color: Gray;">=</span><span style="color: Blue;">InnoDB</span><span style="color: Gray;"> </span><span style="color: Green;">DEFAULT</span><span style="color: Gray;"> </span><span style="color: Blue;">CHARSET</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8</span><span style="color: Gray;"> </span><span style="color: Green;">COLLATE</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Blue;">AUTO_INCREMENT</span><span style="color: Gray;">=</span><span style="color: Maroon;">3</span><span style="color: Gray;"> ;<br />&nbsp;<br /></span><span style="color: #ffa500;">--<br />-- Dumping data for table `users`</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">--<br />&nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Green;">INSERT</span><span style="color: Gray;"> </span><span style="color: Green;">INTO</span><span style="color: Gray;"> </span><span style="color: #8b0000;">`</span><span style="color: Blue;">users</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">role_id</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">username</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">password</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">email</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">banned</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">ban_reason</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">newpass</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">newpass_key</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">newpass_time</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">last_ip</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">last_login</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">created</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">modified</span><span style="color: #8b0000;">`</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">VALUES</span><span style="color: Gray;"><br /></span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: Maroon;">2</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">admin</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">$1$i75.Do4.$ROPRZjZzDx/JjqeVtaJLW.</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">admin@localhost.com</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Green;">NULL</span><span style="color: Gray;">, </span><span style="color: Green;">NULL</span><span style="color: Gray;">, </span><span style="color: Green;">NULL</span><span style="color: Gray;">, </span><span style="color: Green;">NULL</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">127.0.0.1</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">2008-11-30 04:56:38</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">2008-11-30 04:56:32</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">2008-11-30 04:56:38</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">,<br /></span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Gray;">, </span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">user</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">$1$bO..IR4.$CxjJBjKJ5QW2/BaYKDS7f.</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">user@localhost.com</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Green;">NULL</span><span style="color: Gray;">, </span><span style="color: Green;">NULL</span><span style="color: Gray;">, </span><span style="color: Green;">NULL</span><span style="color: Gray;">, </span><span style="color: Green;">NULL</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">127.0.0.1</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">2008-12-01 14:04:14</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">2008-12-01 14:01:53</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">2008-12-01 14:04:14</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">-- --------------------------------------------------------</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">--<br />-- Table structure for table `user_autologin`</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">--<br />&nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Green;">CREATE</span><span style="color: Gray;"> </span><span style="color: Green;">TABLE</span><span style="color: Gray;"> </span><span style="color: Blue;">IF</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: #00008b;">EXISTS</span><span style="color: Gray;"> </span><span style="color: #8b0000;">`</span><span style="color: Blue;">user_autologin</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"><br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">key_id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">char</span><span style="color: Olive;">(</span><span style="color: Maroon;">32</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">user_id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Blue;">mediumint</span><span style="color: Olive;">(</span><span style="color: Maroon;">8</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">user_agent</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">150</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">last_ip</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">40</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">last_login</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">timestamp</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: Green;">CURRENT_TIMESTAMP</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"> </span><span style="color: Green;">update</span><span style="color: Gray;"> </span><span style="color: Green;">CURRENT_TIMESTAMP</span><span style="color: Gray;">,<br /></span><span style="color: Green;">PRIMARY</span><span style="color: Gray;"> </span><span style="color: Green;">KEY</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #8b0000;">`</span><span style="color: Blue;">key_id</span><span style="color: #8b0000;">`</span><span style="color: Gray;">,</span><span style="color: #8b0000;">`</span><span style="color: Blue;">user_id</span><span style="color: #8b0000;">`</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">ENGINE</span><span style="color: Gray;">=</span><span style="color: Blue;">InnoDB</span><span style="color: Gray;"> </span><span style="color: Green;">DEFAULT</span><span style="color: Gray;"> </span><span style="color: Blue;">CHARSET</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8</span><span style="color: Gray;"> </span><span style="color: Green;">COLLATE</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">-- --------------------------------------------------------</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">--<br />-- Table structure for table `user_profile`</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">--<br />&nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Green;">CREATE</span><span style="color: Gray;"> </span><span style="color: Green;">TABLE</span><span style="color: Gray;"> </span><span style="color: Blue;">IF</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: #00008b;">EXISTS</span><span style="color: Gray;"> </span><span style="color: #8b0000;">`</span><span style="color: Blue;">user_profile</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"><br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">int</span><span style="color: Olive;">(</span><span style="color: Maroon;">11</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Blue;">auto_increment</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">user_id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">int</span><span style="color: Olive;">(</span><span style="color: Maroon;">11</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">country</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">20</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">website</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">255</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: Green;">PRIMARY</span><span style="color: Gray;"> </span><span style="color: Green;">KEY</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">ENGINE</span><span style="color: Gray;">=</span><span style="color: Blue;">InnoDB</span><span style="color: Gray;"> </span><span style="color: Green;">DEFAULT</span><span style="color: Gray;"> </span><span style="color: Blue;">CHARSET</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8</span><span style="color: Gray;"> </span><span style="color: Green;">COLLATE</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Blue;">AUTO_INCREMENT</span><span style="color: Gray;">=</span><span style="color: Maroon;">2</span><span style="color: Gray;"> ;<br />&nbsp;<br /></span><span style="color: #ffa500;">--<br />-- Dumping data for table `user_profile`</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">--<br />&nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Green;">INSERT</span><span style="color: Gray;"> </span><span style="color: Green;">INTO</span><span style="color: Gray;"> </span><span style="color: #8b0000;">`</span><span style="color: Blue;">user_profile</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">user_id</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">country</span><span style="color: #8b0000;">`</span><span style="color: Gray;">, </span><span style="color: #8b0000;">`</span><span style="color: Blue;">website</span><span style="color: #8b0000;">`</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">VALUES</span><span style="color: Gray;"><br /></span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: Green;">NULL</span><span style="color: Gray;">, </span><span style="color: Green;">NULL</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">-- --------------------------------------------------------</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">--<br />-- Table structure for table `user_temp`</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">--<br />&nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Green;">CREATE</span><span style="color: Gray;"> </span><span style="color: Green;">TABLE</span><span style="color: Gray;"> </span><span style="color: Blue;">IF</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: #00008b;">EXISTS</span><span style="color: Gray;"> </span><span style="color: #8b0000;">`</span><span style="color: Blue;">user_temp</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"><br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">int</span><span style="color: Olive;">(</span><span style="color: Maroon;">11</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Blue;">auto_increment</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">username</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">255</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">password</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">34</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">email</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">100</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">activation_key</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">50</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">last_ip</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">varchar</span><span style="color: Olive;">(</span><span style="color: Maroon;">40</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">collate</span><span style="color: Gray;"> </span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;">,<br /></span><span style="color: #8b0000;">`</span><span style="color: Blue;">created</span><span style="color: #8b0000;">`</span><span style="color: Gray;"> </span><span style="color: Green;">timestamp</span><span style="color: Gray;"> </span><span style="color: Green;">NOT</span><span style="color: Gray;"> </span><span style="color: Green;">NULL</span><span style="color: Gray;"> </span><span style="color: Green;">default</span><span style="color: Gray;"> </span><span style="color: Green;">CURRENT_TIMESTAMP</span><span style="color: Gray;"> </span><span style="color: Green;">on</span><span style="color: Gray;"> </span><span style="color: Green;">update</span><span style="color: Gray;"> </span><span style="color: Green;">CURRENT_TIMESTAMP</span><span style="color: Gray;">,<br /></span><span style="color: Green;">PRIMARY</span><span style="color: Gray;"> </span><span style="color: Green;">KEY</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #8b0000;">`</span><span style="color: Blue;">id</span><span style="color: #8b0000;">`</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">ENGINE</span><span style="color: Gray;">=</span><span style="color: Blue;">InnoDB</span><span style="color: Gray;"> </span><span style="color: Green;">DEFAULT</span><span style="color: Gray;"> </span><span style="color: Blue;">CHARSET</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8</span><span style="color: Gray;"> </span><span style="color: Green;">COLLATE</span><span style="color: Gray;">=</span><span style="color: Blue;">utf8_bin</span><span style="color: Gray;"> </span><span style="color: Blue;">AUTO_INCREMENT</span><span style="color: Gray;">=</span><span style="color: Maroon;">1</span><span style="color: Gray;"> ;</span></div></div>
<h2>CodeIgniter DX Auth 插件用户手册 - 开始</h2>
<p><strong>开始了</strong><br />
在你跟随示例安装并设置好 DX Auth 配置文件之后，你或许只想看看 DX Auth 捆绑的示例运行情况，而不是先阅读这个简单的示例。<br />
要玩玩这个你可以打开：</p>
<ul>
<li>{你的 CI URL}/auth/login/ 登录。</li>
<li>{你的 CI URL}/auth/logout/ 退出。</li>
<li>{你的 CI URL}/auth/register/ 注册。</li>
<li>{你的 CI URL}/auth/register_recaptcha/ 使用 reCAPTCHA 注册。</li>
<li>{你的 CI URL}/auth/forgot_password/ 使用忘记密码功能。</li>
<li>{你的 CI URL}/auth/change_password/ 在你登录后修改密码。</li>
<li>{你的 CI URL}/auth/cancel_account/ 在你登录后把帐号自杀。</li>
</ul>
<p>要访问管理员控制面板（你需要以管理员身份登录或者你的用户角色已经授权给了权限表）：</p>
<ul>
<li>{你的 CI URL}/backend/users/ 管理用户。</li>
<li>{你的 CI URL}/backend/unactivated_users/ 管理未激活用户</li>
<li>{你的 CI URL}/backend/roles/ 管理角色。</li>
<li>{你的 CI URL}/backend/uri_permissions/ 管理URI权限。</li>
<li>{你的 CI URL}/backend/custom_permissions/ 管理自定义权限。</li>
</ul>
<p>通常，{你的 CI URL} 就是在你 CI 配置文件中 'base_url' 和 'index_page' 项的组合。</p>
<h2>CodeIgniter DX Auth 插件用户手册 - 函数参考</h2>
<p>原文：<a href="http://dexcell.shinsengumiteam.com/dx_auth/general/functions.html">http://dexcell.shinsengumiteam.com/dx_auth/general/functions.html</a></p>
<p><strong>主要函数</strong></p>
<p>下面是你可以在 DX Auth 库中可以使用的函数列表。</p>
<p class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><strong><span style="color: #800000; font-family: Arial;">login($login, $password, $remember = TRUE)</span></strong></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>登录用户。如果登录成功，返回 TRUE ，否则 FALSE。</p>
<p><strong>$login</strong> 是用户名或E-mail地址或者两者均可，取决于 dx_auth 配置文件中的设置。<br />
<strong>$password</strong> 是用户密码。<br />
<strong>$remember</strong> 是使用户下次打开网站时仍记住用户（“记住登录”）。</p>
<p><span style="color: #800080;">如果函数返回 FALSE 你可以使用 get_auth_error() 函数返回一错误字符串。</span></p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>logout()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>注销用户。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>register($username, $password,$email)</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>注册新用户。如果注册成功，返回新用户记录，否则返回 FALSE。</p>
<p>如果 dx_auth 配置文件中 <strong><span style="color: #008000;">DX_email_activation</span></strong> 的值为 TRUE ，那么它将发送E-mail验证，并要求用户验证帐号。<br />
如果 dx_auth 配置文件中 <strong><span style="color: #008000;">DX_email_activation</span></strong> 值为 FALSE 且 <strong><span style="color: #008000;">DX_email_account_details</span></strong> 值为 TRUE ，那么它将通过E-mail发送用户帐号信息。</p>
<p>此函数将自动设置新用户角色ID ( role_id )为 1，所以你需要确保有 id = 1 的记录在角色表中，它的name字段值是类似“普通用户（normal user）”这样的。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>forgot_password($login)</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>发送一封带有密钥的邮件以重置他们的密码。如果成功则返回 TRUE， 否则返回 FALSE。</p>
<p><strong>$login</strong> 是用户名或E-mail。</p>
<p><span style="color: #800080;">由于密码是单向加密的，不可能得到原值。这就是我们需要重置它的原因。</span></p>
<p><span style="color: #800080;">如果函数返回 FALSE ，你可以使用 get_auth_error() 函数返回一错误字符串。</span></p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>reset_password($username, $key = '')</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>基于用户名和密钥重设密码。通常和 forgot_password() 函数搭配使用。如果成功返回 TRUE 否则返回 FALSE。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>activate($username, $key = '')</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>基于用户名和密钥激活用户。在 dx_auth 配置文件中 <strong><span style="color: #008000;">DX_email_verification</span></strong> 设置为 TRUE 的前提下，它常用于在注册后激活用户帐号。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>change_password($old_pass, $new_pass)</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>修改当前已登录用户的密码。调用此函数前请确保你已经检查用户成功登录了。成功返回 TRUE，失败返回 FALSE。</p>
<p><span style="color: #800080;">如果函数返回 FALSE ，你可以使用 get_auth_error() 函数返回一错误字符串。</span></p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>cancel_account($password)</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>从数据库删除当前已登录用户的帐号。调用此函数前请确保你已经检查用户成功登录了。 成功返回 TRUE，失败返回 FALSE。</p>
<p><span style="color: #800080;">如果函数返回 FALSE ，你可以使用 get_auth_error() 函数返回一错误字符串。</span></p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>get_user_id()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>返回用户 ID，只在用户已登录后可用。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>get_username()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>返回用户名，只在用户已登录后可用。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>get_role_id()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>返回用户角色 ID，只在用户已登录后可用。 </p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>get_role_name()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>返回用户角色名，只在用户已登录后可用。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>is_admin()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>检查用户是否为管理员，只在用户已登录后可用。</p>
<p><span style="color: #800080;">当用户的角色 ID 和 角色（roles）表中 name 字段值为'admin'（不分大小写）的那行记录的 role_id 字段的值相同，函数将返回 TRUE。</span></p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>is_role($roles = array(), $use_role_name = TRUE, $check_parent = TRUE)</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>检查用户是否有 <strong>$roles</strong> 权限。<br />
如果 <strong>$use_role_name</strong> = TRUE 则 <strong>$roles</strong> 是类似于 '管理员'，'编辑'，'等' 的权限名，否则 <strong>$roles</strong> 是类似于 0， 1， 2 的 role_id 。</p>
<p>如果 <strong>$check_parent</strong> 为 TRUE 意味着如果此角色在用户角色中没有找到，它将检查父角色中是否有那个用户角色。</p>
<p>你可以在 <strong>$roles</strong> 参数中传递一个数组或者一个字符串。</p>
<p>示例：</p>
<p><span style="font-family: Courier;">if ($this-&gt;dx_auth-&gt;is_role('admin')) <br />
{ <br />
    // Do something <br />
} <br />
 <br />
if ($this-&gt;dx_auth-&gt;is_role(array('admin', 'moderator')) <br />
{ <br />
    // Do something <br />
} <br />
 <br />
// Using an Role ID as $roles parameter <br />
if ($this-&gt;dx_auth-&gt;is_role('1', FALSE)) <br />
{ <br />
    // Do something <br />
} <br />
 <br />
if ($this-&gt;dx_auth-&gt;is_role(array('1', '2'), FALSE)) <br />
{ <br />
    // Do something <br />
}  </span></p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>is_logged_in()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>检查用户是否已登录。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>is_banned()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr">
<p style="MARGIN-RIGHT: 0px" dir="ltr">检查用户是否为一个被踢用户。</p>
<p><span style="color: #800080;">你应该在调用 <strong>login()</strong> 函数后才调用这个函数。这样如果 login() 函数返回 FALSE，你可以检查用户是被踢了还是未使用这个函数。</span></p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>get_ban_reason()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>取得被踢用户的被踢原因。</p>
<p><span style="color: #800080;">你应该在调用 <strong>login()</strong> 函数后才调用这个函数。这样如果 login() 函数返回 FALSE，且用户已被踢，你可以使用这个函数取得原因。</span></p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>is_username_available($username)</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>通过在数据库中查询确认没有相同的用户名，检查用户名是否可用。此函数常用于表单验证的回调函数中。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>is_email_available($email)</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>通过在数据库中查询确认没有相同的E-mail，检查E-mail是否可用。此函数常用于E-mail表单验证的回调函数中。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>get_auth_error()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>当 login(), forgot_password(), change_password(), cancel_account() 函数返回失败时，取得一个错误信息。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>is_max_login_attempts_exceeded()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>检查登录尝试次数是否超过了在 dx_auth 配置文件中指定的值。</p>
<p><span style="color: #800080;">登录次数的增长通过登录 IP 识别。</span></p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>check_uri_permissions($allow = TRUE)</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>这个将检查当前登录的用户是否允许访问当前 URI，基于他所属的角色，或者他的父角色。</p>
<p>下面是当你调用这个函数时将会发生的细节：</p>
<p>首先，函数将检查用户是否已登录，如果用户还没登录，它将重定向到登录 URI。</p>
<p>但如果用户已登录，它将检查用户是否为管理员（admin）。</p>
<p>如果用户是管理员，它将允许访问这个URI。</p>
<p>但如果用户不是管理员，它将检查用户所属角色或父角色是在数据库权限表中否有访问当前URI的权限。</p>
<p>如果用户被禁止，它既爱那个重定向到禁止访问的URI。</p>
<p>你可以在控制器构造器中调用 check_uri_permissions() 以保护整个控制器：</p>
<p><span style="font-family: Courier;">class Home extends Controller  <br />
{ <br />
    function Home() <br />
    { <br />
        parent::Controller(); <br />
 <br />
        $this-&gt;dx_auth-&gt;check_uri_permissions(); <br />
    } <br />
}  </span></p>
<p>或者在一个函数中使用它：</p>
<p><span style="font-family: Courier;">function hello_world() <br />
{ <br />
    $this-&gt;dx_auth-&gt;check_uri_permissions(); <br />
     <br />
    // Do something <br />
} <br />
</span></p>
<p><strong>实例：</strong></p>
<p>有一个用户 role_id = 1 (普通用户 normal user).<br />
在<strong><span style="color: #008000;">权限</span></strong>表中，有一个指定了 role_id = 1 的记录，它有 '/test/'  URI 的 URI 访问权限。<br />
现在这个用户想要访问 '/test/hi/'。</p>
<p>如果你在 Test 控制器中有这样的代码：</p>
<p><span style="font-family: Courier;">class Test extends Controller  <br />
{ <br />
    function Test() <br />
    { <br />
        parent::Controller(); <br />
         <br />
        // Secure controller <br />
        $this-&gt;dx_auth-&gt;check_uri_permissions(); <br />
    } <br />
     <br />
    function hi() <br />
    { <br />
        echo 'Hi'; <br />
    } <br />
     <br />
    function hello() <br />
    { <br />
        echo 'Hello'; <br />
    } <br />
}  </span></p>
<p>这个用户将会通过检查并访问'/test/hi/' URI，会显示 'Hi' 。<br />
因为如果权限 URI 设置为 '/test/'，意味着对Test类和它下面所有方法函数授权。</p>
<p>如果你想只对函数限制访问，你可以在设置权限 URI 时指定 <span style="color: #800000;"><strong>'/class/function/'</strong></span>。</p>
<p>例如，在上面的实例中，如果你把 role_id = 1 的URI权限设置为'/test/hi/'，用户将可以访问'/test/hi/' URI，但不能访问'/test/hello/' URI。</p>
<p>你也可以设置 URI 权限为 '/' ，以打开对所有 URI 的访问权限。</p>
<p>也可以通过在调用 check_uri_permissions() 时指定 <strong>$allow</strong> = FALSE （译注：此处原文为 TRUE，应该是有误）以反转前面所有的解释。<br />
这样它将会在 URI 权限找到时禁止用户访问URI ，而不是在 URI 权限找到时允许用户访问 URI。</p>
<p><span style="color: #800080;">要设置 URI 权限，你必须使用在权限模型中给出的函数，或者使用你自己的。请查看关于设置权限的示例。</span></p>
<p><span style="color: #800080;">CL Auth 用户请注意，URI 权限现在的格式重命名为 <strong>'/class/function/'</strong> ，取代了 <strong>'/class/function'</strong>。</span></p>
<p><strong>继承</strong></p>
<p>如果用户角色有一个父角色，那用户也有到父角色的权限，等等。要阐述这个，让我们先来看一下这个 URI 权限图解：</p>
<p><span style="color: #808080; font-family: Courier;">User<br />
{<br />
 '/home/'<br />
 '/help/'<br />
}</span></p>
<p><span style="color: #808080; font-family: Courier;">Moderator: User<br />
{<br />
 '/moderator/'<br />
}</span></p>
<p><span style="color: #808080; font-family: Courier;">Super_Moderator: Moderator<br />
{<br />
 '/super/'<br />
}</span></p>
<p><span style="color: #808080; font-family: Courier;">Big_Moderator: Moderator<br />
{<br />
 '/big/'<br />
}<br />
</span></p>
<p>这意味着，Super_Moderator 角色可以访问 Moderator 和User 的 URI，但不能访问 Big_Moderator 的 URI。</p>
<p><span style="color: #800080;">要使用这个特性，你需要在角色表中为每个角色中的 parent_id 指定一个父角色。</span></p>
<p>这是前面的示例用到的角色表结构。</p>
<p><span style="font-family: Courier;">id  parent_id  name<br />
-------------------------<br />
1    0    User<br />
2    0    Admin<br />
3    1    Moderator<br />
4    3    Super Moderator<br />
5    3    Big Moderator </span></p>
<p><span style="font-family: Courier;"><br />
</span><span style="color: #800080;"><strong>注意</strong>，这个功能是可选的，或许你完全可以使用 is_admin(), is_role(), is_logged_in() 这些函数搞定用户验证，而不必使用它。</span></p></blockquote>
<p><em></em> </p>
<h2 class="resizeimg">CodeIgniter DX Auth 插件用户手册 - 事件</h2>
<p><strong><span style="color: #008080;">事件<br />
</span></strong><br />
事件是 DX Auth 库中的特定函数被调用时触发的函数。要使用这些事件你需要打开 'libraries/DX_Auth_Event.php'，放上你的代码。</p>
<p>下面就是你可以在 DX Auth 库中可以用到的事件。</p>
<p><span style="color: #800000; font-family: Arial;"><strong>user_activated($user_id)</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>如果配置中的 <strong><span style="color: #008000;">'DX_email_activation'</span></strong> 值为 TRUE，此事件就会在用户通过他们E-mail中收到的密钥成功激活后发生。</p>
<p>如果配置中的 <strong><span style="color: #008000;">'DX_email_activation'</span></strong> 值为 FALSE，此事件就会在用户成功注册后发生。</p>
<p><strong>$user_id</strong> 是被激活用户的ID。</p>
<p><span style="color: #800080;">默认情况下，这儿会有创建用户档案的代码。如果你不需要用户档案，你可以删除这些代码。</span></p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>user_logged_in($user_id)</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此事件在用户登录后发生。<strong>$user_id</strong> 是登录用户的ID。</p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>user_logging_out($user_id)</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此事件在用户退出前发生。<strong>$user_id</strong> 是退出用户的ID。</p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>user_changed_password($user_id, $new_password)</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此事件在用户修改密码后发生。<strong>$user_id</strong> 是修改密码用户的ID，<strong>$new_password</strong> 是新的密码。</p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>user_canceling_account($user_id)</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此事件在用户帐号被自杀前发生。<strong>$user_id</strong> 是要被自杀的帐号ID。</p>
<p><span style="color: #800080;">默认情况下，这儿会有删除用户档案的代码。如果你不需要用户档案，你可以删掉这些代码。</span></p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>checked_uri_permissions($user_id, &amp;$allowed)</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此事件在 DX_Auth 中的 check_uri_permissions() 函数被调用时发生。在检查过用户角色是否被授权访问 URI 后，此事件将被触发。</p>
<p><strong>$allowed</strong> 是在执行检查之前的结果，由于它是以引用传递的，它的值是可以修改的。</p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>got_permission_value($user_id, $key)</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此事件在 DX_Auth 中的 get_permission_value() 被调用时发生。</p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>got_permissions_value($user_id, $key)</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此事件在 DX_Auth 中的 get_permissions_value() 被调用时发生。</p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>sending_account_email($data, &amp;$content)</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此事件在 dx auth 发送带有帐号信息的邮件之前发生。</p>
<p><strong>$data</strong> 是一个数组，包含 username, password, email, 和 last_ip。<br />
<strong>$content</strong> 是E-mail内容，以引用传递。</p>
<p><span style="color: #800080;">默认情况下那儿有关于怎样创建内容的示例代码。你可以修改它以适合你的需求。</span></p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>sending_activation_email($data, &amp;$content)</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此事件在 dx auth 发送激活邮件之前发生。</p>
<p><strong>$data</strong> 是一个数组，包含 username, password, email, last_ip, activation_key, activate_url。<br />
<strong>$content</strong> 是E-mail内容，以引用传递。</p>
<p><span style="color: #800080;">默认情况下那儿有关于怎样创建内容的示例代码。你可以修改它以适合你的需求。</span></p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>sending_forgot_password_email($data, &amp;$content)</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此事件在 dx auth 发送重设密码邮件之前发生。</p>
<p><strong>$data</strong> 是一个数组，包含 password, key, 和 reset_password_uri。<br />
<strong>$content</strong> 是E-mail内容，以引用传递。</p>
<p><span style="color: #800080;">默认情况下那儿有关于怎样创建内容的示例代码。你可以修改它以适合你的需求。</span></p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>get_permission_value($key, $check_parent = TRUE)</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>通过指定的键获取权限值。只在用户已登录后才可调用此函数。</p>
<p><strong>$key</strong> 是权限数组键（注意：权限在表中是以数组存储的）。<br />
如果 <strong>$check_parent</strong> 为 TRUE 意味着如果权限值在用户角色中没有找到，它将尝试获取父角色的权限值</p>
<p>如果权限找到返回其值，否则返回 NULL 。</p>
<p><span style="color: #800080;">要设置权限，你必须使用在权限模型中指定的函数，或者自己编写。请查看关于设置权限的示例。</span></p>
<p><span style="color: #800080;"><strong>注意</strong>：使用此函数是可选的，或许你完全可以手动检查用户权限，并使用 is_admin(), is_role() 这样的函数手动搞定权限，而不必使用它。</span></p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>get_permissions_value($key, $array_key = 'default')</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>通过指定的键获取那些权限的值。只在用户已登录后才可调用此函数。</p>
<p>此函数将在用户权限和父权限中搜索键。</p>
<p><strong>$key</strong> 是权限数组键 （注意：权限在表中是以数组存储的）。</p>
<p><strong>$array_key = 'default'</strong>. 返回以 0，1，2 作为键值排列的数组。<br />
<strong>$array_key = 'role_id'</strong>. 返回以 role_id 作为键值排列的数组。<br />
<strong>$array_key = 'role_name'</strong>. 返回以 role_name 作为键值排列的数组。</p>
<p>如果权限找到，返回包含其值的数组，否则返回 NULL。</p>
<p><span style="color: #800080;">要设置权限，你必须使用在权限模型中指定的函数，或者自己编写。请查看关于设置权限的示例。</span></p>
<p><span style="color: #800080;"><strong>注意</strong>：使用此函数是可选的，或许你完全可以手动检查用户权限，并使用 is_admin(), is_role() 这样的函数手动搞定权限，而不必使用它。</span></p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>deny_access($uri = 'deny')</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>调用此函数将把用户重定向到 <strong>$uri</strong> 变量设定的值。默认 <strong>$uri </strong>为 'deny'。</p>
<p><strong>$uri</strong> = 'deny' 将重定向用户到 dx_auth 配置文件中指定的 'DX_deny_uri' 值。<br />
<strong>$uri</strong> = 'login' 将重定向用户到 dx_auth 配置文件中指定的 'DX_login_uri' 值。<br />
<strong>$uri</strong> = 'banned' 将重定向用户到 dx_auth 配置文件中指定的 'DX_banned_uri' 值。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>catpcha()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>创建一个用于表单验证的图片验证码。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>get_catpcha_image()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>获取创建的HTML图像。请在视图中使用这个函数。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>is_captcha_expired()</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>检查创建的验证码是否已过期。请在表单验证回调函数中使用这个函数。</p></blockquote>
<p class="resizeimg"><span style="color: #800000; font-family: Arial;"><strong>is_captcha_match($code)</strong></span></p>
<blockquote class="resizeimg" style="MARGIN-RIGHT: 0px" dir="ltr"><p>检查创建的验证码文本是否与 <strong>$code</strong> 匹配。请在表单验证回调函数中使用这个函数。</p></blockquote>
<p class="resizeimg"><strong><span style="color: #008080;">reCAPTCHA 函数</span></strong></p>
<p class="resizeimg"><span style="color: #008080;"><span style="color: #808080;">（译注：一系列用于英文验证码的函数，可以有声音验证，中文网站怕是很少用到，先不翻译了。感兴趣的朋友请查看原文）</span></span></p>
<h2 class="resizeimg">CodeIgniter DX Auth 插件用户手册 - 配置</h2>
<p>原文： http://dexcell.shinsengumiteam.com/dx_auth/general/config.html</p>
<p>配置</p>
<p>下面是 DX Auth 库中的配置，你可以看一下代码中的注释。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: #ffa500;">/*<br />| -------------------------------------------------------------------<br />| DX Auth Config<br />| -------------------------------------------------------------------<br />*/</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">/*<br />|--------------------------------------------------------------------------<br />| 网站细节<br />|--------------------------------------------------------------------------<br />|<br />| 这些细节用于 DX Auth 库发送的E-mail里。<br />|<br />*/</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_website_name</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">你的网站名</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_webmaster_email</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">webmaster@yourhost.com</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/*<br />|--------------------------------------------------------------------------<br />| 数据库表<br />|--------------------------------------------------------------------------<br />|<br />| 设定 DX Auth 使用的表<br />|<br />| 'DX_table_prefix' 允许你指定其余表用到的表前缀<br />|<br />| 例如 'DX_table_prefix' 设定为 'DX_'，'DX_users_table' 设置为 'user',<br />| 将会使 DX Auth 使用 'DX_users' 作为用户表.<br />|<br />*/</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_table_prefix</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">''</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_users_table</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">users</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_user_profile_table</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">user_profile</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_user_temp_table</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">user_temp</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_user_autologin</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">user_autologin</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_roles_table</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">roles</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_permissions_table</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">permissions</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_login_attempts_table</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">login_attempts</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/*<br />|--------------------------------------------------------------------------<br />| 密码混淆 （salt）<br />|--------------------------------------------------------------------------<br />|<br />| You can add major salt to be hashed with password.<br />| For example, you can get salt from here: </span><span style="color: Blue;">https://www.grc.com/passwords.htm</span><span style="color: #ffa500;"><br />|<br />| 注意:<br />|<br />| 记住如果你在有用户注册之后修改此值，之前注册的用户将无法再登录<br />|<br />*/</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_salt</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">''</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/*<br />|--------------------------------------------------------------------------<br />| 注册相关设置<br />|--------------------------------------------------------------------------<br />|<br />| 'DX_email_activation' = 要求用户注册后激活他们的帐号<br />| 'DX_email_activation_expire' = 激活限制时间，超过此时间扔未激活的用户将被从数据库中删除。默认是48小时 (60*60*24*2)。<br />| 'DX_email_account_details' = 注册后发送帐号详情的邮件。只在 'DX_email_activation' 为 FALSE 时有效。<br />|<br />*/</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_email_activation</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">TRUE</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_email_activation_expire</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Maroon;">60</span><span style="color: Gray;">*</span><span style="color: Maroon;">60</span><span style="color: Gray;">*</span><span style="color: Maroon;">24</span><span style="color: Gray;">*</span><span style="color: Maroon;">2</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_email_account_details</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">TRUE</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/*<br />|--------------------------------------------------------------------------<br />| 登录设置<br />|--------------------------------------------------------------------------<br />|<br />| 'DX_login_using_username' = 设定用户是否可以在用户名表单域使用用户名登录。<br />| 'DX_login_using_email' = 设定用户是否可以在用户名表单域使用E-mail登录。<br />|<br />| 以上两项你必须至少设置一项为True。<br />|<br />| 'DX_login_record_ip' = 设定当用户登录时是否将其IP保存到数据库。<br />| 'DX_login_record_time' = 设定当用户登录时是否记录其登录时间。<br />|<br />*/</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_login_using_username</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">TRUE</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_login_using_email</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">TRUE</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_login_record_ip</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">TRUE</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_login_record_time</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">TRUE</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/*<br />|--------------------------------------------------------------------------<br />| 自动登录设置<br />|--------------------------------------------------------------------------<br />|<br />| 'DX_autologin_cookie_name' = 设置自动登录所使用的Cookie名字。<br />| 'DX_autologin_cookie_life' = 设置自动登录所使用的cookie有效时间。默认为2个月(60*60*24*31*2)。<br />|<br />*/</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_autologin_cookie_name</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">autologin</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_autologin_cookie_life</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Maroon;">60</span><span style="color: Gray;">*</span><span style="color: Maroon;">60</span><span style="color: Gray;">*</span><span style="color: Maroon;">24</span><span style="color: Gray;">*</span><span style="color: Maroon;">31</span><span style="color: Gray;">*</span><span style="color: Maroon;">2</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/*<br />|--------------------------------------------------------------------------<br />| 登录尝试<br />|--------------------------------------------------------------------------<br />|<br />| 'DX_count_login_attempts' = 设定当用户登录失败是 DX Auth 是否统计登录失败次数。<br />| 'DX_max_login_attempts' = 设定函数 is_login_attempt_exceeded() 返回 TRUE 之前的最大尝试次数。<br />|<br />*/</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_count_login_attempts</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">TRUE</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_max_login_attempts</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/*<br />|--------------------------------------------------------------------------<br />| 忘记密码相关设置<br />|--------------------------------------------------------------------------<br />|<br />| 'DX_forgot_password_expire' = 忘记密码密钥超时时间，默认为 15 分钟(900 seconds)。<br />|<br />*/</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_forgot_password_expire</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Maroon;">900</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/*<br />|--------------------------------------------------------------------------<br />| 验证码<br />|--------------------------------------------------------------------------<br />|<br />| 你可以在此设定由 DX Auth 库生成的验证码。<br />| 'DX_captcha_directory' = 创建验证码的目录名称。<br />| 'DX_captcha_fonts_path' = 此目录中的字体将被用于验证码的创建。<br />| 'DX_captcha_font_size' = 文本写入验证码图片时的字体大小。使用随机大小请留空。<br />| 'DX_captcha_grid' = 在验证码图片中显示网格<br />| 'DX_captcha_expire' = 验证码超时时间，默认为3分钟(180 seconds)。<br />| 'DX_captcha_case_sensitive' = 设定验证码是否区分大小写。<br />|<br />*/</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_captcha_directory</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">captcha</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_captcha_fonts_path</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_captcha_path</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: #8b0000;">'</span><span style="color: Red;">fonts</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_captcha_width</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Maroon;">320</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_captcha_height</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Maroon;">95</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_captcha_font_size</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">''</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_captcha_grid</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">TRUE</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_captcha_expire</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Maroon;">180</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_captcha_case_sensitive</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">TRUE</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">/*<br />|--------------------------------------------------------------------------<br />| reCAPTCHA //此段略<br />|--------------------------------------------------------------------------<br />|<br />| If you are planning to use reCAPTCHA function, you have to set reCAPTCHA key here<br />| You can get the key by registering at </span><span style="color: Blue;">http://recaptcha.net</span><span style="color: #ffa500;"><br />|<br />*/</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_recaptcha_public_key</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">''</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_recaptcha_private_key</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">''</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">/*<br />|--------------------------------------------------------------------------<br />| URI<br />|--------------------------------------------------------------------------<br />|<br />| 设定在 DX Auth 库中用于重定向的 URI<br />| 'DX_deny_uri' = 禁止访问 URI.<br />| 'DX_login_uri' = 登录表单 URI.<br />| 'DX_activate_uri' = 激活用户 URI.<br />| 'DX_reset_password_uri' = 重置密码 URI.<br />|<br />| 去掉'DX_'前缀，这些值可以由 DX Auth 库读取。<br />| 例如你可以在控制器中通过使用 $this-&amp;gt;dx_auth-&amp;gt;deny_uri 访问 'DX_deny_uri'。<br />|<br />*/</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_deny_uri</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">/auth/deny/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_login_uri</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">/auth/login/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_banned_uri</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">/auth/banned/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_activate_uri</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">/auth/activate/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_reset_password_uri</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">/auth/reset_password/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">/*<br />|--------------------------------------------------------------------------<br />| 辅助函数配置<br />|--------------------------------------------------------------------------<br />|<br />| 下面的配置实际上在 DX_Auth 库中并没有用到。<br />| 它们只是帮助你在控制器里更容易地编写代码。<br />| 如果你不需要它你可以留空，或干脆删掉它。<br />|<br />| 然而它们可以通过去掉'DX_'前缀在 DX Auth 库中访问。<br />| 例如你可以在控制器中通过使用 $this-&amp;gt;dx_auth-&amp;gt;register_uri 访问 'DX_register_uri'。<br />|<br />*/</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">// 注册</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_allow_registration</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">TRUE</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_captcha_registration</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">TRUE</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 登录</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_captcha_login</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">FALSE</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// URI 路径</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_logout_uri</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">/auth/logout/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_register_uri</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">/auth/register/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_forgot_password_uri</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">/auth/forgot_password/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_change_password_uri</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">/auth/change_password/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_cancel_account_uri</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">/auth/cancel_account/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 表单视图</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_login_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/login_form</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_register_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/register_form</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_forgot_password_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/forgot_password_form</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_change_password_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/change_password_form</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_cancel_account_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/cancel_account_form</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">// 页面视图</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_deny_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/general_message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_banned_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/general_message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_logged_in_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/general_message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_logout_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/general_message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_register_success_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/general_message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_activate_success_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/general_message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_forgot_password_success_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/general_message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_reset_password_success_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/general_message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_change_password_success_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/general_message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_register_disabled_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/general_message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_activate_failed_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/general_message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">DX_reset_password_failed_view</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">auth/general_message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;</span></div></div>
<h2>CodeIgniter DX Auth 插件用户手册 - 模型</h2>
<p><span style="color: #008080;"><span style="color: #000000;">原文：</span><a href="http://dexcell.shinsengumiteam.com/dx_auth/general/models.html">http://dexcell.shinsengumiteam.com/dx_auth/general/models.html</a></span></p>
<p><strong><span style="color: #008080;">模型</span></strong></p>
<p>DX Auth 库只带有少量模型文件分发，它们位于 'models/dx_auth/' 文件夹中。</p>
<p>这些模型包含与特定表协同工作的函数。你可以在这些模型中使用这些函数，例如创建一个你自己的管理员面板。这些模型中的函数名也是自解释的，因此用起来是很容易的。</p>
<p>下面是在 'models/dx_auth/' 文件夹中包含的模型。</p>
<ol>
<li>users.php 包含与 'DX_users_table' 表协同工作的函数。</li>
<li>user_profile.php 包含与 'DX_user_profile_table' 表协同工作的函数。</li>
<li>user_temp.php 包含与 'DX_user_temp_table'  表协同工作的函数。</li>
<li>user_autologin.php 包含与 'DX_user_autologin'  表协同工作的函数。</li>
<li>roles.php 包含与 'DX_roles_table' 表协同工作的函数。</li>
<li>permissions.php 包含与 'DX_permissions_table'  表协同工作的函数。</li>
<li>login_attempts.php 包含与 'DX_login_attempts_table' 表协同工作的函数。</li>
</ol>
<h2>CodeIgniter DX Auth 插件用户手册 - 数据表解析</h2>
<div class="resizeimg">
<p>原文：<a href="http://dexcell.shinsengumiteam.com/dx_auth/general/tables.html">http://dexcell.shinsengumiteam.com/dx_auth/general/tables.html</a></p>
<p><strong><span style="color: #008080;">数据表解析</span></strong></p>
<p>这里是 DX Auth 库 安装的数据表，以及对每个表字段的解释。</p>
<p><strong><span style="color: #800000; font-family: Arial;">users 表</span></strong></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>这是主表，用户信息存在这儿。</p>
<ul>
<li>id = 主键。</li>
<li>role_id = 角色表的外键，默认为 1。</li>
<li>username = 用户名。</li>
<li>password = 用户密码（已加密）。</li>
<li>email = 用户E-mail。</li>
<li>banned = 设定用户是否已被踢(1 = 被踢 0 = 未被踢)。默认为 0。</li>
<li>ban_reason = 被踢原因。</li>
<li>newpass = 用户请求重设密码后产生的新密码。</li>
<li>newpass_key = 修改密码的密钥。如果此密钥通过了 reset_password() 函数的验证，它将以 'newpass' 的值替代 'password' 的值。</li>
<li>newpass_time = 发出重设密码请求时间</li>
<li>last_ip = 用户注册时的 IP 地址。以后如果 'DX_login_record_ip' 设置为 TRUE，每当用户登录时其 IP 将记录在此处。</li>
<li>last_login = if 'DX_login_record_time' is TRUE, login time will be recorded here.</li>
<li>created = Time when this record is created, normally you can use this to determine when user is registered.</li>
<li>modified = Time when this record is modified.</li>
</ul>
<p><span style="color: #800080;">Username field shoudn't contain space and other vulnerable character. Therefore when you validate username in registration, it's highly recommended you use alpha_dash in your form validation.</span></p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>user_temp 表</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此表用于存放未激活用户信息。</p>
<p>id = Primary key.<br />
username = Username.<br />
password = User password (encrypted).<br />
email = User email.<br />
activation_key = Key needed to activate user. User who activated will be moved to users table.<br />
last_ip = IP address of user when register.<br />
created = Date time when this record is created.<br />
If 'DX_email_activation' is TRUE, people who have registered is inserted into this table instead of users table. If they activate their account, the record will be moved into users table.</p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>user_profile 表</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此表用于存放用户档案信息。</p>
<p>id = Primary key.<br />
user_id = Foreign key to users table.<br />
Other field is up to you. You can add or delete to fit your needs.</p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>user_autologin 表</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此表用于当用户登录时保存自动登录变量，使用自动登录 cookie 验证它。</p>
<ul>
<li>key_id = 主键，key_id 是在用户使用“记住我”登录时生成的唯一字符串。</li>
<li>user_id = 主键，使用“记住我”登录的用户 ID。</li>
<li>user_agent = User agent of browser when user login using remember TRUE.</li>
<li>last_ip = User IP address when user login using remember TRUE.</li>
<li>last_login = Time when user login using remember TRUE.</li>
</ul>
<p>通常，你不需要改动这个表。</p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>roles 表</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr"><p>此表用于记录角色名称，例如 registered user, admin, moderator, 等.</p>
<ul>
<li>id = Primary key.</li>
<li>parent_id = Self reference to id. Which mean this role will inherit parent_id role. Default is 0 (No parent).</li>
<li>name = 角色名.</li>
</ul>
<p>你需要在此表中有至少 2 条记录。</p>
<p><span style="color: #800080;">第一，id = 1 的记录必须以类似 'registered user' 或者类似名字命名。因为用户表有新记录创建时将自动设置 role_id = 1。<br />
另一条记录的 name 字段值必须为 'admin' （不分大小写）。但它的ID并不重要。</span></p>
<p>如果你不准备使用权限特性，你不需要关心 parent_id ，设为 0 即可。否则，你应该在函数指南中查看 check_uri_permissions() 函数以了解有 parent_id 的作用。</p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>permissions 表</strong></span></p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<ul>
<li>id = Primary key.</li>
<li>role_id = Foreign key to roles table.</li>
<li>data(text) = 权限数据。权限数据以转换为字符串的数组保存。</li>
</ul>
<p><span style="color: #800080;">check_uri_permission(),  get_permission_value(),  get_permissions_value()  依赖于此表。要设置此数据，你必须使用权限模型中的函数，或者编写你自己的。请参考关于如何设置权限的例子。</span></p></blockquote>
<p><span style="color: #800000; font-family: Arial;"><strong>login_attempts table</strong></span></p>
<p>此表记录用户的登录尝试。</p>
<ul>
<li>id = Primary key.</li>
<li>ip_address = IP address of someone who try to login.</li>
<li>time = Time when someone who try to login.</li>
</ul>
<p><span style="color: #800080;">DX Auth will only use this table when 'DX_count_login_attempts' is set to TRUE in config file. And if login attempts for same IP is more than 'DX_max_login_attempts' in config file, it will not count that IP anymore.</span></p>
<p><span style="color: #800000; font-family: Arial;"><strong>role_uri table</strong></span></p>
<p>Obsolete in 1.0.2 above. Use permissions table.</p>
<h2>CodeIgniter DX Auth 插件用户手册 - 问题处理</h2>
<p>问题处理</p>
<p>如果你没有弄好 E-mail 设置，DX Auth 库发送邮件可能会失败。</p>
<p>如果发生了这个，你需要在 application/config/ 文件夹中创建 email.php ，并粘贴上下面的代码。可以修改它以符合你的需求。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;">&nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"> ! </span><span style="color: Blue;">defined</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">BASEPATH</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;"> </span><span style="color: Green;">exit</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">No direct script access allowed</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">protocol</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">smtp</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">smtp_host</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">mail.localhost.com</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">smtp_user</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">username</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">smtp_pass</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">password</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$config</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">smtp_port</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">25</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;</span></div></div>
<p>关于这个的更多信息，你可以参考 Codeigniter 的E-mail辅助函数。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.21andy.com/blog/20090607/1317.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 1.492 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2009-07-05 09:54:57 -->
<!-- Compression = gzip -->