<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>PHPec</title>
		<link>http://www.phpec.com/</link>
		<description>易懂,易用,易扩展的PHP5开发框架</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20070618</generator>
		<lastBuildDate>Thu, 20 Nov 2008 06:04:16 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=40</guid>
			<title>用linux命令提高php的处理能力</title>
			<author>tim</author>
			<description><![CDATA[<p>最近,需要对用户访问日志作一些统计分析处理,该日志每天生成,大小平均是1.5G,经其它程序进行预处理后,去掉一些无关信息,减小为300M左右,格式是userId`url`clicks,1000万行左右.<br />
<br />
要做的工作是按userId,urlId分组保存到数据库,类似这样:<br />
<br />
uid&nbsp;&nbsp;&nbsp; urlId&nbsp;&nbsp;&nbsp; clicks<br />
------------------------<br />
12&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 3<br />
12&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; 4<br />
13&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 3<br />
13&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; 5<br />
13&nbsp;&nbsp;&nbsp; 11&nbsp;&nbsp;&nbsp; 3<br />
<br />
当然,还有其它关联的表,如url表,需要先通过url在url表查找出urlId,如果没有则插入...满足各种需求后,每条记录操作数据库的平均次数是查询4-6次(包括oracle的获得自增id查询),插入/更新3次<br />
<br />
假设数据库的操作已经完全优化,要完成这项目任务,使用php的常规办法是打开日志文件句柄,然后遍历处理,这样,1000万条记录一下来,不少于6个小时(硬件配置为8G内存+Xeon1.60GHz 4核 x 2 ,下同)<br />
<br />
这样的处理速度明显是不能满足要求的,必须要进行优化,但php本身的优化手段有效,于是,php的好朋友linux上场了:<br />
<br />
1)先对日志文件进行排序处理,排序后,可方便按uid进行合并,大大减少了数据库的操作次数</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="comment">//对$cTempFile进行排序,生成排序后的$cSwapFile</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$command</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;sort&nbsp;{$cTempFile}&nbsp;&gt;&nbsp;{$cSwapFile}&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>system(<span class="vars">$command</span><span>,&amp;</span><span class="vars">$returnVar</span><span>);&nbsp; <br />
    </span></span></li>
</ol>
</div>
<p><br />
2)对排序后的文件进行切分,启用php模拟进程方式并行处理</p>
<div class="codeText">
<div class="codeHead">PHP代码<span><span>&nbsp;</span></span></div>
<ol start="1" class="dp-c">
    <li class=""><span><span class="vars">$threads</span><span>&nbsp;=&nbsp;15;&nbsp;</span><span class="comment">//启动的进程数</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//查询待处理文件的总行数</span></span></li>
    <li class="alt"><span><span class="vars">$command</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;cat&nbsp;{$cSwapFile}&nbsp;|wc&nbsp;-l&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$nums</span><span>&nbsp;=&nbsp;system(</span><span class="vars">$command</span><span>,&amp;</span><span class="vars">$returnVar</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$lines</span><span>&nbsp;=&nbsp;</span><span class="func">ceil</span><span>(</span><span class="vars">$nums</span><span>&nbsp;/&nbsp;</span><span class="vars">$threads</span><span>);&nbsp;</span><span class="comment">//每个文件的行数,用总行数除文件数后取整</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="func">chdir</span><span>(LOG_PATH);</span><span class="comment">//进入存放切分后文件的路径</span><span>&nbsp; <br />
    </span></span></li>
    <li class=""><span><span class="comment">//切分文件,具体参数可查split帮助</span></span></li>
    <li class="alt"><span><span class="vars">$command</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;split&nbsp;-d&nbsp;-l&nbsp;{$lines}&nbsp;&nbsp;{$cSwapFile}&nbsp;temp_custom&quot;</span><span>;&nbsp;</span><span class="comment">//切成&nbsp;$lines个文件,文件前缀是tem_custom,以数字后缀结束,如temp_custom00,temp_custom12</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>system(<span class="vars">$command</span><span>,&amp;</span><span class="vars">$returnVar</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//切分后,启动进程处理</span><span>&nbsp; <br />
    </span></span></li>
    <li class="alt"><span><span>$eventLog = LOG_PATH.'eventLog'; //事件日志<br />
    </span></span></li>
    <li class=""><span><span class="keyword">for</span><span>(</span><span class="vars">$i</span><span>&nbsp;=&nbsp;0;</span><span class="vars">$i</span><span>&lt;&nbsp;</span><span class="vars">$threads</span><span>;</span><span class="vars">$i</span><span>++){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$command</span><span>&nbsp;=&nbsp;sprintf(</span><span class="string">&quot;php&nbsp;%s&nbsp;-f&nbsp;%d&nbsp;&gt;&gt;&nbsp;%s&nbsp;&amp;&quot;</span><span>,</span><span class="keyword">__FILE__</span><span>,</span><span class="vars">$i</span><span>,</span><span class="vars">$eventLog</span><span>);&nbsp;</span><span class="comment">//必须将输出重定到日志文件,并加入&amp;在后台执行</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system(<span class="vars">$command</span><span>,&amp;</span><span class="vars">$returnVar</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
<br />
3)进程处理<br />
<br />
主进程通过<strong> php __FILE__ -f id </strong>的方式调用子进程<br />
因为是同一个文件,需要判断一下$argv参数,并根椐id生成当前进程要处理的日志文件,开始正常处理入库<br />
<br />
<br />
经过这样处理后,进程数开到15,同样的日志,全部完成只需1个小时以内,这时cpu的负载还是在极低的水平<br />
<br />
要注意的可能是数据库的处理能力了,如果进程数过大,数据库的吞吐可能会造成瓶颈<br />
<br />
总结:<br />
1)当需要遍历一个大文件进行时,可以使用切分的方法切成n个较少的文件,再同时并行调用的方式处理,可以有效的减少处理时间.<br />
2)在遍历入库的操作中,有效的合并可以减少数据库的操作次数</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=40</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2008-05-18 15:59</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=39</guid>
			<title>memcache的几点注意</title>
			<author>tim</author>
			<description><![CDATA[<p>1)已经有for win的memcached了,可以在此下载(<a href="http://jehiah.cz/projects/memcached-win32/">http://jehiah.cz/projects/memcached-win32/</a>)<br />
下载回来,直接解压后,进入解压后的目录,使用memcached -d install安装成一个windows的服务,要查看其它参数,可用memcached -h<br />
<br />
2)每个被放到memcached的数据,key不能超过250个字节<span>,</span>value不能超过1M,否则会存不进去<br />
<br />
3)当分配的内容全部用完后,再往里面放数据时,已过生命期的先被清除(已过生命期的数据,会在get的时候被清除),如果还不够用,就会自动把最先加入的条目删除(可使用-M参数启动,指明超出限制时,发出警告而不是清除数据)</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=39</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2008-03-20 13:31</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=38</guid>
			<title>将数组定义为常量</title>
			<author>tim</author>
			<description><![CDATA[<p>近日,在phpclass中看到一个将数组定义为常量的类,本人也比较喜欢使用定义常量作为配置项的开发方式,把相关的一组配置项定义为常量,也会经常用到.于是下来看看,原理很简单,在此记录一下:<br />
1)使用两个静态的方法set和get来设定和获取内容<br />
2)set的时候,将数组使用var_export函数转化,作为define的值<br />
3)get的时候,将常量值使用eval('return '.$constName.&quot;;&quot;)方式反解<br />
<br />
从上面可以看出,实现方法只是将数组转成可反解的字串存到常量中,用的时候再进行反解,由此可见,使用serialize和unserialize可以更方便地实现此要求,另外serialize还可以对object和resource类型的进行处理,也就是说,理论上讲,对象和资源(文件句柄)等都可以定义为常量的.</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=38</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2008-01-21 13:19</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=37</guid>
			<title>使用file_get_contents提交http post</title>
			<author>tim</author>
			<description><![CDATA[<p>我曾经发过一篇讲使用curl获取需要登陆内容的文章,但其实,自5.0开始,使用file_get_contents就可以完成.(前提是开启了<var class="parameter">allow_url_fopen</var>),下面以一个简单的例子说明一下:<br />
1.先看一下目标网页(假设是http://localhost/response.php)<br />
response.php</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="func">echo</span><span>&nbsp;</span><span class="string">&quot;&lt;pre&gt;&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>print_r(<span class="vars">$_POST</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>print_r(<span class="vars">$_COOKIE</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>本文讲述的只是http post请求的发送,所以,目标页只是回显所收到的post和cookie<br />
2.请求页<br />
request.php</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$data</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">&quot;name&quot;</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'tim'</span><span>,</span><span class="string">&quot;content&quot;</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'test'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$data</span><span>&nbsp;=&nbsp;http_build_query(</span><span class="vars">$data</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$opts</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="string">'http'</span><span>=&gt;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'method'</span><span>=&gt;</span><span class="string">&quot;POST&quot;</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'header'</span><span>=&gt;</span><span class="string">&quot;Content-type:&nbsp;application/x-www-form-urlencoded\r\n&quot;</span><span>.&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;Content-length:&quot;</span><span>.</span><span class="func">strlen</span><span>(</span><span class="vars">$data</span><span>).</span><span class="string">&quot;\r\n&quot;</span><span>&nbsp;.&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;Cookie:&nbsp;foo=bar\r\n&quot;</span><span>&nbsp;.&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;\r\n&quot;</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'content'</span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$data</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>);&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="vars">$cxContext</span><span>&nbsp;=&nbsp;stream_context_create(</span><span class="vars">$opts</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$sFile</span><span>&nbsp;=&nbsp;</span><span class="func">file_get_contents</span><span>(</span><span class="string">&quot;http://localhost/response.php&quot;</span><span>,&nbsp;false,&nbsp;</span><span class="vars">$cxContext</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="func">echo</span><span>&nbsp;</span><span class="vars">$sFile</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>这个文件首先使用stream_context_create()构造了一个http请求,然后使用file_get_contents发送出去,返回的结果是:</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>Array&nbsp;&nbsp;</span></span></li>
    <li class=""><span>(&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;[name]&nbsp;=<span class="tag">&gt;</span><span>&nbsp;tim&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;[content]&nbsp;=<span class="tag">&gt;</span><span>&nbsp;test&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>)&nbsp;&nbsp;</span></li>
    <li class=""><span>Array&nbsp;&nbsp;</span></li>
    <li class="alt"><span>(&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;[foo]&nbsp;=<span class="tag">&gt;</span><span>&nbsp;bar&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>)&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
所以上可以看出,只要你了解http协议,完全可以使用这两个函数构造出所有正常的http请求,比如代理,断点续传等...<br />
对照之前的关于curl的文章,就可以用来取得需要用户验证的内容了.</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=37</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2007-12-01 21:18</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=36</guid>
			<title>关于全局变量不能全局的问题</title>
			<author>tim</author>
			<description><![CDATA[<p>一直以为,全局变量(使用global声明)是在程序的所有地方都可以用的(不然怎么能叫全局?呵),但在最近的工作中,接连碰到几次全局变量无效的郁闷的事,记录一下出现的原因.<br />
1.错误重现<br />
问题出现在用我的简易框架时,在view中使用原来第三方定义好的函数时(此函数比较独立),下面模拟一下:<br />
<br />
t1.php</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span>run();&nbsp;<span class="comment">//执行</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;run(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">include</span><span>&nbsp;</span><span class="string">'func.php'</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;showGlobal();&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
func.php</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$vars</span><span>&nbsp;=&nbsp;</span><span class="string">'I&nbsp;am&nbsp;global!'</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;showGlobal(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">global</span><span>&nbsp;</span><span class="vars">$vars</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;print(<span class="string">'我使用全局变量:'</span><span>.</span><span class="vars">$vars</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
很简单的两个文件(第一次发现问题时,远比这复杂,在一层层排错后,得出最少化的问题重现环境),func.php是定义好的第三方函数,该函数使用了一些全局变量,如果这时把这两个文件放在一起,执行一下t1.php,会发现showGlobal里的$vars是显示不出来的,global失效了?<br />
2.错误原因<br />
搜索后发现,php.net上很早就有人提出过,也有人给出了解释(http://bugs.php.net/bug.php?id=2193):<br />
原来,在t1.php的run函数中include func.php时,func.php中的变量$vars的作用域只是在run之内,而在showGlobal中使用global声明的$vars是要求属于t1.php的不是run函数的,所以为空)<br />
3.解决方法<br />
知道原因后,解决就很简单,可以把include 从run中移出来,这样,func.php中的$vars就属于t1.php了;也可以在run里用global声明一下$vars,这样也可以把原来属于run的$vars声明为全局(属于t1.php);<br />
<br />
虽然问题可以简决,但用起来还是很不爽, 因为在我的phpec框架中,include的情况比较普遍,不可能把view中按需include的移到外层去,使用global的话,我在使用第三方函数时,又不会也不想去了解它用了什么全局变量,而且,层次结构一多,就....<br />
<br />
总结:1)尽量减少多级和函数中include文件.2)尽量不用全局变量</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=36</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2007-11-15 11:43</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=35</guid>
			<title>lighttpd+fastcgi(PHP)下使用memcache作session handler的几</title>
			<author>tim</author>
			<description><![CDATA[<p>在apache下用memcache作session handler已经有一段时间了,感觉还不错,最近移植到使用lighttpd的机器上来,问题就来了,还困扰了<br />
<br />
我不短的时间,现记录一下:<br />
<br />
1.用法<br />
<br />
动态编译memcache的php扩展,在程序中用dl('memcache.so')引入<br />
直接用ini_set('session.save_handler','memcache')来启用memcache handler<br />
<br />
2.问题现象<br />
<br />
第一次访问正常,刷新时连不上memcached,停止,再刷,又正常...如此反复,一次正常一次不正常<br />
<br />
3.查找原因<br />
<br />
1.怀疑memcached使用的内存不够,加大n倍后,问题依旧,因如果不用作session save_handle,而是在程序中用作缓存处理,一切正常,所<br />
<br />
以确定memcached正常.<br />
2.因在apache下正常,因为apache跟memcache不同机器,而lighttpd与memcache相同,怀疑本机访问有问题(我曾试过mysql有这个问题<br />
<br />
,是dns的设置有问题),换用n种地址写法,未果.重编n次lighttpd,加入--enable-memcache,仍然不行.在google上翻了n个十页,未有找到想<br />
<br />
要的.(只找到memcache官方文档中,有不推荐直接用memcache作session handler的说明)<br />
3.开始怀疑动态编译的memcache.so有问题,尝试静态方式,但不成功(将pecl下载的memcache源码解到php/ext下,执行./buildconf,<br />
<br />
但./configure --help|grep memcache时没有看到被加入)<br />
4.实在没有办法了,采用在php.ini中加入extension=memcache.so的方式替代dl的方式,奇迹出现了,开始正常了,来一个ab -n 1000 -c 50,<br />
<br />
效率还不错&nbsp; ^&amp;^<br />
<br />
4.结论<br />
lighttpd+fastcgi下,session.save_handler = memcache并使用dl('memcache.so')会有问题,原因未明(可能是lighttpd的BUG)</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=35</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2007-08-30 16:06</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=34</guid>
			<title>SQLB : SQL Load Balancer安装试用</title>
			<author>tim</author>
			<description><![CDATA[<p>SQLB是一个开源的数据库连接池,可以有效地提高数据库的性能,支持oracle,mysql,postgreSQ,虽然最后更新已是四年前,但仍是一个不错的选择...<br />
<br />
1.下载<br />
<br />
SQLB是c/s结构,其中的C部分提供PHP及perl等接口,源代码及相关需求可在以下地址下载:<br />
http://sqlb.sourceforge.net/frameset.html<br />
<br />
2.安装(本文以支持mysql为例,安装SQLB前,请先安装好MYSQL)<br />
<br />
<strong>a.安装sqlb的server端</strong><br />
<br />
<font color="#800000">tar -zxvf sqlb-2.4.8.taz<br />
cd sqlb-2.4.8<br />
<br />
./configure --with-mysql-libs=/path-to-mysql/lib/ --with-mysql-includes=/path-to-mysql/include/<br />
make<br />
make install</font><br />
<br />
#注,configure时,要指定mysql的lib和include目录<br />
<br />
<strong>安装完成后,要建立sqlb用户,并将源码中的conf/sqlb.conf拷至用户目录:</strong><br />
<br />
<font color="#800000">adduser -g nobody sqlb<br />
chmod 770 ~sqlb/<br />
<br />
cp ./conf/sqlb.conf ~sqlb/sqlb.conf<br />
chown sqlb. ~sqlb/sqlb.conf</font><br />
<br />
<strong>#sqlb.conf为sqlb的运行配置文件,编辑此文件加入数据库连接参数</strong><br />
<br />
至此,可以执行<strong>sqlb start</strong>启动sqlb了<br />
<br />
#如果你编译时指定了prefix将sqlb安装到其它目录,请使用完整路径,要在开机自动运行,将源码中的init/sqlb.init复制到 /etc/init.d/sqlb.init(不能改名成sqlb),修改其中$sqlb_prefix指向你sqlb安装路径,再运行以下命令加入:<br />
<br />
chkconfig --add sqlb.init<br />
service sqlb.init start //启动<br />
service sqlb.init stop //停止<br />
<br />
<br />
<strong>#如果启动时提示找不到libmysqlclient.so.15,你需要将此文件(一般在mysql的lib目录)复制至PATH路径中(如:/usr/lib)</strong><br />
<br />
<br />
<strong>3.安装sqlb php 模块<br />
<br />
</strong>sqlb的客户端可以编译进php内置模块,也可以编译成动态模块加载(so),方法如下:<br />
<br />
先解压:<br />
<br />
<font color="#800000">tar -zxvf sqlb-php-module-1.6.tgz<br />
cd sqlb-php-module-1.6</font><br />
<br />
<strong>a.静态编译</strong><br />
<br />
将源码目录的sqlb目录复制至php源码的ext目录,执行<font color="#800000">./buildconf</font><br />
完成后,执行<font color="#800000">./configure --help|grep sqlb</font>,你可以看到相关信息,此时你可以重新编译PHP,并使用<font color="#800000">--with-sqlb=/path-to-sqlb</font>来加入sqlb支持,<br />
<br />
<strong>b.动态模块</strong><br />
<br />
在sqlb目录下,执行:<br />
<br />
<font color="#800000">phpize #如果提示无此命令,你可以加上完整路径(在php安装目录的bin下)<br />
./configure --with-sqlb=/path-to-sqlb --with-php-config=/path-to-php/bin/php-config<br />
make<br />
make install</font></p>
<p><strong>注意:sqlb本身不支持php5,所以在make时会出错,提示类似</strong></p>
<p>sqlb.c:42: error: `BYREF_NONE' undeclared here (not in a function)</p>
<p>需要简单修改一下sqlb的源码,打开sqlb.c,定位到42行</p>
<p>注释掉42行,并将ZEND_FE的第二参数改为NULL</p>
<p>原代码:<br />
<br />
static unsigned char argument_type[] = { 5, BYREF_NONE, BYREF_NONE, BYREF_NONE, BYREF_FORCE, BYREF_NONE };<br />
zend_function_entry sqlb_functions[] = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZEND_FE(accelsqlb, argument_type)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {NULL, NULL, NULL}</p>
<p>修改成:</p>
<p><font color="#800000"><strong>
<div class="codeText">
<div class="codeHead"><font><strong>C++代码</strong></font></div>
<ol start="1" class="dp-cpp"><font>
    <li class="alt"><span><span class="comment"><strong>//static&nbsp;unsigned&nbsp;char&nbsp;argument_type[]&nbsp;=&nbsp;{&nbsp;5,&nbsp;BYREF_NONE,&nbsp;BYREF_NONE,&nbsp;BYREF_NONE,&nbsp;BYREF_FORCE,&nbsp;BYREF_NONE&nbsp;};</strong></span><span><strong>&nbsp;&nbsp;</strong></span></span></li>
    <li class=""><span><strong>zend_function_entry&nbsp;sqlb_functions[]&nbsp;=&nbsp;{&nbsp;&nbsp;</strong></span></li>
    <li class="alt"><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZEND_FE(accelsqlb,&nbsp;NULL)&nbsp;&nbsp;</strong></span></li>
    <li class=""><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{NULL,&nbsp;NULL,&nbsp;NULL}&nbsp; <br />
    </strong></span></li>
    </font></ol>
    </div>
    </strong></font>经此修改,就可顺利make &amp;&amp; make install了</p>
    <p>完成后,会生成一个sqlb.so文件,将它加入php.ini的extension中<br />
    <br />
    安装好后,查看phpinfo(),可以看到sqlb的支持已被加入了....<br />
    <br />
    <strong>4.php连接测试<br />
    <br />
    </strong>sqlb只提供一个方法<br />
    <br />
    &nbsp;</p>
    <div class="codeText">
    <div class="codeHead">PHP代码</div>
    <ol start="1" class="dp-c">
        <li class="alt"><span><span class="vars">$result</span><span>&nbsp;=accelsqlb(</span><span class="vars">$query</span><span>,&nbsp;</span><span class="vars">$db_name</span><span>,&nbsp;</span><span class="vars">$db_type</span><span>,&nbsp;</span><span class="vars">$state</span><span>,[</span><span class="vars">$timeout</span><span>])&nbsp; <br />
        </span></span></li>
    </ol>
    </div>
    <p><br />
    其中:<br />
    $query为要执行的sql语句<br />
    $db_name为要连接的数据库名<br />
    $db_type为数据库类型,此处为mysql<br />
    $state为执行完成状态码<br />
    $timeout为超时设置<br />
    <br />
    <font color="#800000">state&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : return value of the function :<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -2 : timeout occured<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1 : sqlb error<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 : SQL error<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 : SQL query OK with resultset<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 : SQL query OK with empty resultset<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;No row selected&quot;)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 : SQL query OK without resultset (DELETE, UPDATE,...)</font><br />
    <br />
    所有返回结果可以通过查看<strong>$result</strong>获得,如果$state的值为1,则$result结果为:<br />
    <br />
    array(<br />
    字段数n<br />
    n个字段名<br />
    第一条记录n个值<br />
    第二条记录n个值<br />
    ..<br />
    )<br />
    <br />
    其它返回方式请自行测试</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=34</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2007-08-12 16:13</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=33</guid>
			<title>关于session和memcache的若干问题</title>
			<author>tim</author>
			<description><![CDATA[<p>一直以来,由于php本身的session机制不能跨机,令很多phper感到不爽,现在流行的解决方案主要有:<br />
1)使用数据库来实现<br />
2)自己写server端,通过改写session处理函数来请求<br />
3)使用nfs等跨机存储来保存session<br />
4)使用memcache来保存<br />
5)使用zend platform提供的解决方案<br />
<br />
其中的1-4都是通过改用可以跨机的储存机制,再使用session_set_save_handler()来实现,5是zend公司的商业产品(不过据之前在使用的同事反映,效果不太满意),以上的方案,各有利弊,不在本文讨论范围<br />
<br />
无论是用memcache,还是db,nfs,其原理是一样的,都是通过session_set_save_handler函数来改变默认的处理方式,通过指定回调函数来自定义处理,可以参考手册的session_set_save_handler()函数部分,有例子,比较容易明白<br />
<br />
以下是一些我在使用memcache来实现时的一些记录:<br />
1)使用类来实现时,各回调函数都定义为静态方法,在类的构造中使用session_set_save_handler注册回调函数, 如:<br />
session_set_save_handler(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('memSession', 'open'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('memSession', 'close'), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('memSession', 'read'), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('memSession', 'write'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('memSession', 'destroy'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('memSession', 'gc')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
memSession为类名,要使用session,则先new memSession,再session_start();<br />
<br />
<br />
2)生存期和垃圾回收<br />
memCache的set命令有生存期,即使用set命令添加值时,可加上lifetime,此时间可以作为session的生存期,用户在此时间内没有动作,则会失效,但有动作则不会失效(因为每一个脚本结束时,都会执行write和close,此时lifetime就会被更新了),当然,如果使用cookie传递SID,则控制SESSION生存期可以用:ini_set('session.cookie_lifetime',time)来设定,这其实是控制cookie的有效时间,如果session赖以生存的cookie消失了,当然session也就活不了,使用cookie_lifetime来控制的话,无论有无动作,都将在指定的时间后过时<br />
<br />
gc是指垃圾回收,在session中是指清理过期的session数据,影响的参数有:<br />
session.gc_maxlifetime 被视为垃圾前的生存期,超过此时间没有动作,数据会被清走<br />
注意的是,gc不是每次启动会话都会被执行,而是由session.gc_probability 和 session.gc_divisor的比率决定的<br />
<br />
结论:控制SESSION的生存期有几种方法<br />
一是cookie_lifttime,这种方式无论有无动作,都会在指定时间内销毁<br />
二是在read中根椐保存时间控制,此方法在有动作时时间会一直有效<br />
三设定session.gc_probability 和 session.gc_divisor的比率为1(即每次会话都会启用gc),再设定gc.maxlifetime来指定生存期,此方法也是在用户有动作时时间一直有效<br />
<br />
3)回调函数的执行时机<br />
open 在运行session_start()时执行<br />
read 在运行session_start()时执行,因为在session_start时,会去read当前session数据并写入$_SESSION变量<br />
destroy 在运行session_destroy()时执行<br />
close 在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完成后被执行<br />
gc 执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,即session_start会相继执行open,read和gc<br />
write 此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行<br />
<br />
结论:<br />
session_start //执行open(启动会话),read(读取session数据至$_SESSION),gc(清理垃圾)<br />
脚本中间所有对$_SESSION的操作均不会调用这些回调函数<br />
session_destroy //执行destroy,销毁当前session(一般是删除相应的记录或文件),相应地,此回调函数销毁的只是session的数据,但此时<br />
<br />
var_dump一下$_SESSION变量,仍然有值的,但此值不会在close后被write回去<br />
session_write_close() //执行write和close,保存$_SESSION至存储,如不手工使用此方法,则会在脚本结束时被自动执行<br />
<br />
清晰了以上信息,将对你清楚了解SESSION的工作原理有很大的帮助...<br />
<br />
4)直接使用memcache作session处理<br />
在我写了一系列的memcache来保存session的代码后,无意中发现,可以直接在php.ini中设定使用memcache作为session处理,而无须另外编码,方法是:<br />
修改php.ini中的以下值<br />
session.save_handler = memcache<br />
session.save_path = 'tcp://host1:11211'&nbsp; #有多个时直接用&quot;,&quot;分隔即可 <br />
如果只想在特定的应用里使用memcache储存session,可以使用ini_set的方法对以上两个参数进行设定<br />
<br />
要测试一下是否真正用上了memcache,可以先捕足到使用的PHPSESSID,再作为KEY用memcach去读一下,就清楚了</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=33</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2007-08-02 16:51</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=32</guid>
			<title>LIGHTTPD安装</title>
			<author>tim</author>
			<description><![CDATA[<p>Lighttpd是最近流行起来的轻量级web server,其最大优点是占用内存极低,因此,性能上是非常优秀的,常用作静态文件的web server,支持rewrite,cgi,fastcgi,proxy等众多特性...目前很多大型的站点都在用,下面记录一下安装的方法:<br />
1.要先安装pcre,不然基于正则的处理都会无效,如rewrite,安装方法就是confirgure &amp;&amp; make &amp;&amp; make install<br />
2.到http://www.lighttpd.org下载最新版的lighttpd源码(目前为1.4.15)<br />
3.解压,tar -zxvf ighttpd-1.4.15.tar.gz<br />
4.编译 confirgure --prefix=/web/app/lighttpd 除了指定安装目录,可以指定不安装哪些模块,具体请参阅文档<br />
5.在安装目录中建立一个日志目录和配置目录,复制配置文件至配置目录<br />
mkdir /web/app/lighttpd/logs <br />
mkdir /web/app/lighttpd/conf<br />
cp lighttpd_src/doc/lighttpd.conf /web/app/lighttpd/conf/<br />
6.修改该配置文件(lighttpd的配置都可以在此文件中修改,文档中都有说明)<br />
7.启动 web/app/lighttpd/sbin/lighttpd -f 配置文件<br />
如果要加入服务,将源代码中的rc.lighttpd.redhat复制至/etc/init.d/lighttpd<br />
修改一下其中的<font><font size="2">LIGHTTPD_CONF_PATH和</font></font><font><font size="2">lighttpd的路径,然后使用chkconfig -add lighttpd加入,再进入ntsysv中选中lighttpd即可<br />
<br />
注:lighttpd支持以fastcgi方式编译的PHP,还可以使用proxy的设置实现load balance</font></font></p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=32</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2007-07-22 11:23</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=31</guid>
			<title>PHPec代码说明--Ajax</title>
			<author>tim</author>
			<description><![CDATA[<p>PHPec的Libs中,还提供了一个简单方便的Ajax类(事实上,因为以JSON格式返回数据,应该算是ajaj),下面说一下该类的使用方法:<br />
<br />
<font color="#800000"><strong>1.方法描述</strong></font><br />
<br />
<strong>a.构造方法</strong><br />
<br />
该方法接受一个ajax服务器端的地址,一般地,类似以下这种形式:</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>index.php?c=controller&amp;act=&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
<br />
其中的controller以当前控制器名称代替,比如:Ajax<br />
<br />
<strong>b.注册处理方法(register)</strong><br />
<br />
该方法按受两个参数,第一个为方法名称,可以一次注册多个,用&quot;,&quot;分隔,第二参数为提交的方式(get/post),默认为get<br />
<br />
一般地,该方法注册的方法,需要在控制器中以同名方法实现(处理请求)<br />
<br />
<strong>c.返回客户端脚本(getJS)<br />
</strong><br />
该方法用来生成客户端脚本,包括XMLHTTP对象的创建,json数据解析处理等<br />
<br />
<strong>d.实际操作方法<br />
</strong><br />
可提供的操作包括:<br />
<strong>setData </strong>改变对象指定属性的值,如控件的innerHTML,style.display等<br />
<strong>remove($obj)</strong> 移除对象<br />
<strong>addElement</strong> 动态创建一个对象(目前支持少数类型的对象)<br />
<strong>addEvent</strong> 为指定对象添加事件<br />
<strong>removeEvent</strong> 移除事件<br />
<strong>addAlert</strong> 添加javascript的alert事件<br />
<strong>addConfirm</strong> 添加confirm<br />
<strong>redirect</strong> 重定向<br />
<strong>wait() </strong>//开始侦听<br />
<br />
具体的实现请参阅源码,我会在适当时候编写出参考使用手册的<br />
<br />
<font color="#800000"><strong>2.例子说明</strong></font><br />
<br />
要使用PHPec内置的ajax很简单,方法步骤是:<br />
<br />
<strong>a.编写控制器,如TestAjax,生成ajax对象</strong></p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;testAjax&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Controller{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;__construct(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent::__construct();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;loadLib(</span><span class="string">'Ajax'</span><span>,</span><span class="string">'?c=TestAjax&amp;act='</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
<strong>b.注册ajax的响应方法<br />
<br />
</strong></p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;index(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;-&gt;&nbsp;register(</span><span class="string">'a1,a2,a3'</span><span>,</span><span class="string">'post'</span><span>);&nbsp;</span><span class="comment">//注册处理方法,a1为验证用户名,a2为验证密码,a3为提交</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;response&nbsp;-&gt;&nbsp;set(</span><span class="string">'ajaxJs'</span><span>,</span><span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;-&gt;&nbsp;getJs());&nbsp;</span><span class="comment">//客启端代码传递</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;loadView(</span><span class="string">'ajaxtest.html'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>//ajaxtest.html内容(使用php作为view解析引擎)&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;?</span><span class="tag-name">php</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>echo&nbsp;$response-<span class="tag">&gt;</span><span>get('ajaxJs');&nbsp;//输出客户端脚本&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">h1</span><span class="tag">&gt;</span><span>AJAX模拟测试</span><span class="tag">&lt;/</span><span class="tag-name">h1</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>账号(tim),密码(timpass)</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>账号:</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">'name'</span><span>&nbsp;</span><span class="attribute">onblur</span><span>=</span><span class="attribute-value">&quot;a1('name='+this.value)&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;nameError&quot;</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">&quot;color:red&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>密码:</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;pass&quot;</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;password&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">'pass'</span><span>&nbsp;</span><span class="attribute">onblur</span><span>=</span><span class="attribute-value">&quot;a2('password='+this.value)&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;passError&quot;</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">&quot;color:red&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;submit&quot;</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">&quot;display:none&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;submit&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;btnOk&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;loadding&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
<br />
<strong>c.编写响应的处理方法</strong></p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="comment">//验证用户名</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;a1(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$name</span><span>&nbsp;=&nbsp;Request::getPost(</span><span class="string">'name'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="func">strlen</span><span>(</span><span class="vars">$name</span><span>)&nbsp;&lt;&nbsp;3&nbsp;||&nbsp;</span><span class="func">strlen</span><span>(</span><span class="vars">$name</span><span>)&nbsp;&gt;&nbsp;12)&nbsp;</span><span class="vars">$msg</span><span>[]&nbsp;=&nbsp;</span><span class="string">&quot;用户名必须在3-12位之间&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(!preg_match(</span><span class="string">&quot;/^[a-z][a-z0-9]+/i&quot;</span><span>,</span><span class="vars">$name</span><span>))&nbsp;</span><span class="vars">$msg</span><span>[]&nbsp;=&nbsp;</span><span class="string">&quot;用户名要以字母开头,只能由字母或数字组成&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//实际应用时会查数据库检测已否存在</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(!isset(</span><span class="vars">$msg</span><span>))&nbsp;</span><span class="vars">$msg</span><span>&nbsp;=&nbsp;</span><span class="string">'OK'</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="vars">$msg</span><span>&nbsp;=&nbsp;join(</span><span class="string">&quot;,&quot;</span><span>,</span><span class="vars">$msg</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;-&gt;&nbsp;setData(</span><span class="string">'nameError'</span><span>,</span><span class="string">'innerHTML'</span><span>,</span><span class="vars">$msg</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;-&gt;&nbsp;wait();&nbsp;</span><span class="comment">//开始监听</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//验证用户密码,成功后显示提交按钮</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;a2(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$msg</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;ok&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="func">strlen</span><span>(Request::getPost(</span><span class="string">'password'</span><span>))&nbsp;&lt;&nbsp;6)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$msg</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;密码6位以上&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;</span><span class="comment">//OK,显示submit</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;-&gt;&nbsp;setData(</span><span class="string">'submit'</span><span>,</span><span class="string">'style.display'</span><span>,</span><span class="string">'block'</span><span>);&nbsp;</span><span class="comment">//显示submit</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;-&gt;&nbsp;setData(</span><span class="string">'btnOk'</span><span>,</span><span class="string">'value'</span><span>,</span><span class="string">'请按我提交'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;-&gt;&nbsp;addEvent(</span><span class="string">'btnOk'</span><span>,</span><span class="string">'onclick'</span><span>,</span><span class="string">&quot;a3('name='+\$('name').value+'&amp;password='+$('pass').value)&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;-&gt;&nbsp;setData(</span><span class="string">'passError'</span><span>,</span><span class="string">'innerHTML'</span><span>,</span><span class="vars">$msg</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;-&gt;&nbsp;wait();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//处理提交</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;a3(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$name</span><span>&nbsp;=&nbsp;Request::getPost(</span><span class="string">'name'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$pass</span><span>&nbsp;=&nbsp;Request::getPost(</span><span class="string">'password'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="vars">$name</span><span>&nbsp;==&nbsp;</span><span class="string">'tim'</span><span>&nbsp;&amp;&amp;&nbsp;</span><span class="vars">$pass</span><span>&nbsp;==&nbsp;</span><span class="string">'timpass'</span><span>){&nbsp;</span><span class="comment">//hardcode&nbsp;a&nbsp;user&nbsp;and&nbsp;password</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;-&gt;&nbsp;setData(</span><span class="string">'loadding'</span><span>,</span><span class="string">'innerHTML'</span><span>,</span><span class="string">'恭喜你,你已进入了PHPec的大门'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;-&gt;&nbsp;addAlert(</span><span class="string">&quot;登陆失败,请使用(账号:tim,密码:timpass)登陆&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;ajax&nbsp;-&gt;&nbsp;wait();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
说明一下处理步骤:<br />
<br />
首先进行数据验证,并将结果以setData方法来更新指定的元素值...<br />
结束前,需使用ajax的wait方法开始监听请求<br />
<br />
<br />
后记:<br />
<br />
理论上,你也可以在PHPec中使用你所熟识的ajax处理方式,比如xajax,具体方法请自行去实践..</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=31</link>
			<category domain="http://www.phpec.com/?cid=1">PHPec文档</category>
			<pubDate>2007-07-15 13:59</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=30</guid>
			<title>基本排序算法的PHP实现</title>
			<author>tim</author>
			<description><![CDATA[<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span>set_time_limit(0);&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//冒泡</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">function</span><span>&nbsp;bubble(</span><span class="vars">$arr</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">for</span><span>(</span><span class="vars">$i</span><span>&nbsp;=&nbsp;0;&nbsp;</span><span class="vars">$i</span><span>&nbsp;&lt;&nbsp;</span><span class="func">count</span><span>(</span><span class="vars">$arr</span><span>);&nbsp;</span><span class="vars">$i</span><span>++){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="vars">$j</span><span>&nbsp;=&nbsp;</span><span class="func">count</span><span>(</span><span class="vars">$arr</span><span>)-1;&nbsp;</span><span class="vars">$j</span><span>&nbsp;&gt;&nbsp;</span><span class="vars">$i</span><span>;&nbsp;</span><span class="vars">$j</span><span>--){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>]&nbsp;&lt;&nbsp;</span><span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>-1]){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$temp</span><span>&nbsp;=&nbsp;</span><span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>]&nbsp;=&nbsp;</span><span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>-1];&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>-1]&nbsp;=&nbsp;</span><span class="vars">$temp</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$arr</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">//选择</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;select(</span><span class="vars">$arr</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="vars">$i</span><span>&nbsp;=&nbsp;0;&nbsp;</span><span class="vars">$i</span><span>&nbsp;&lt;&nbsp;</span><span class="func">count</span><span>(</span><span class="vars">$arr</span><span>);&nbsp;</span><span class="vars">$i</span><span>++)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="vars">$lowIndex</span><span>&nbsp;=&nbsp;</span><span class="vars">$i</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="vars">$j</span><span>&nbsp;=&nbsp;</span><span class="func">count</span><span>(</span><span class="vars">$arr</span><span>)&nbsp;-&nbsp;1;&nbsp;</span><span class="vars">$j</span><span>&nbsp;&gt;&nbsp;</span><span class="vars">$i</span><span>;&nbsp;</span><span class="vars">$j</span><span>--)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>]&nbsp;&lt;&nbsp;</span><span class="vars">$arr</span><span>[</span><span class="vars">$lowIndex</span><span>])&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$lowIndex</span><span>&nbsp;=&nbsp;</span><span class="vars">$j</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="vars">$temp</span><span>&nbsp;=&nbsp;</span><span class="vars">$arr</span><span>[</span><span class="vars">$lowIndex</span><span>];&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="vars">$arr</span><span>[</span><span class="vars">$lowIndex</span><span>]&nbsp;=&nbsp;</span><span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>]&nbsp;=&nbsp;</span><span class="vars">$temp</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$arr</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">//插入</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;insert(</span><span class="vars">$arr</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;<span class="keyword">for</span><span>(</span><span class="vars">$i</span><span>&nbsp;=&nbsp;1;</span><span class="vars">$i</span><span>&nbsp;&lt;&nbsp;</span><span class="func">count</span><span>(</span><span class="vars">$arr</span><span>);&nbsp;</span><span class="vars">$i</span><span>++){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="vars">$j</span><span>&nbsp;=&nbsp;</span><span class="vars">$i</span><span>;&nbsp;(</span><span class="vars">$j</span><span>&gt;0)&nbsp;&amp;&amp;&nbsp;(</span><span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>]&nbsp;&lt;&nbsp;</span><span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>-1]);&nbsp;</span><span class="vars">$j</span><span>--){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="vars">$temp</span><span>&nbsp;=&nbsp;</span><span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>-1];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>-1]&nbsp;=&nbsp;</span><span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>];&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="vars">$arr</span><span>[</span><span class="vars">$j</span><span>]&nbsp;=&nbsp;</span><span class="vars">$temp</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$arr</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="vars">$arr</span><span>&nbsp;=&nbsp;range(1,1000);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>shuffle(<span class="vars">$arr</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//benchmark</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">require_once</span><span>(</span><span class="string">&quot;Benchmark/Timer.php&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$timer</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Benchmark_Timer();&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$timer</span><span>&nbsp;-&gt;&nbsp;start();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>bubble(<span class="vars">$arr</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$timer</span><span>&nbsp;-&gt;&nbsp;setMarker(</span><span class="string">'bubble'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>select(<span class="vars">$arr</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$timer</span><span>&nbsp;-&gt;&nbsp;setMarker(</span><span class="string">'select'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>insert(<span class="vars">$arr</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$timer</span><span>&nbsp;-&gt;&nbsp;setMarker(</span><span class="string">'insert'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>sort(<span class="vars">$arr</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$timer</span><span>&nbsp;-&gt;&nbsp;setMarker(</span><span class="string">'php'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$timer</span><span>&nbsp;-&gt;&nbsp;display();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>?&gt;&nbsp; <br />
    </span></li>
</ol>
</div>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=30</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2007-07-15 13:55</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=29</guid>
			<title>在oracle中使用自增字段</title>
			<author>tim</author>
			<description><![CDATA[<p>大家都知道,oracle是不支持auto_increment字段的,但可以通过创建Sequence对象来使用自增序列,语法是:</p>
<div class="codeText">
<div class="codeHead">SQL代码</div>
<ol class="dp-sql" start="1">
    <li class="alt"><span><span class="keyword">create</span><span>&nbsp;</span><span class="keyword">sequence</span><span>&nbsp;SEQ_SUBS_ID <br />
    </span></span></li>
    <li class="alt"><span><span>increment&nbsp;</span><span class="keyword">by</span><span>&nbsp;1 <br />
    </span></span></li>
    <li class="alt"><span><span>start&nbsp;</span><span class="keyword">with</span><span>&nbsp;1 <br />
    </span></span></li>
    <li class="alt"><span><span>maxvalue&nbsp;10000000000 <br />
    </span></span></li>
    <li class="alt"><span><span>nocycle&nbsp;;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
<br />
其中SEQ_SUBS_ID为序列名,increment by 1表示步长为1,start with 1表示初始值为1,maxvalue表示最大值 nocycle表示不可循环取值<br />
<br />
要查看已创建的Sequence,执行的语句是:</p>
<div class="codeText">
<div class="codeHead">SQL代码</div>
<ol class="dp-sql" start="1">
    <li class="alt"><span><span class="keyword">select</span><span>&nbsp;*&nbsp;</span><span class="keyword">from</span><span>&nbsp;user_sequences;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
<br />
其中返回的SEQUENCE_NAME为序列名,LAST_NUMBER为当前值<br />
<br />
要取得下一ID,可以使用:</p>
<div class="codeText">
<div class="codeHead">SQL代码</div>
<ol class="dp-sql" start="1">
    <li class="alt"><span><span class="keyword">select</span><span>&nbsp;&nbsp;序列名.nextval&nbsp;</span><span class="keyword">from</span><span>&nbsp;表名&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
<br />
这个语句会返回多个序列号(会被缓存起来),要取得一个序号,表名使用<font color="#800000"><strong>dual(虚表)</strong></font>即可<br />
<br />
<font color="#800000"><strong>使用PEAR::DB操作</strong></font><br />
<br />
PEAR::DB使用<font color="#800000"><strong>nextId($seqName)</strong></font>来封装了自增序列的操作,如果是mysql,pear同样放弃字段自增的功能,而使用创建一个表的方法去管理自增ID,而在ORACLE中,则直接使用SEQUENCE对象操作<br />
<br />
即在pear::DB中,要获得下一ID,不管是使用MYSQL还是ORACLE,都使用$db -&gt; nextId($seqName)即可,一般地$seqName为表名,当指定的序列未存在时,可使用第二参数指定自动创建<br />
<br />
在pear内部,nextId会将$seqName按指定的格式处理,默认是加上&quot;_seq&quot;的后缀,所以,如果你操作的是已存在的使用其它方式创建的序列,很可能会发生冲突,要改变这一格式,使用</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="vars">$db</span><span>&nbsp;-&gt;&nbsp;setOption(</span><span class="string">'seqname_format'</span><span>,</span><span class="string">&quot;SEQ_%s&quot;</span><span>);</span><span class="comment">//经这样修改,nextId('TABLE1')所操作的SEQUENCE变成了SEQ_TABLE1了(如果是默认,则是TABLE1_seq)</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>&nbsp;</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=29</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2007-07-13 13:06</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=28</guid>
			<title>般若波罗蜜多心经释要</title>
			<author>tim</author>
			<description><![CDATA[<p>我不是教徒,但也很喜欢教会那种教人向善的宗旨,读书时也偶尔会去教堂听一下唱圣诗和做礼拜的,也会偶尔找一些佛教的经典曲目来听一下,那种感觉真的很棒...<br />
般若蜜多心经是一篇流传甚广的经文,也是我最喜欢的一篇...当你心情烦躁时读一下,会有意想不到的收获的.<br />
&nbsp;<br />
<br />
明 智旭法师述<br />
<br />
<br />
此直指吾人现前一念介尔之心即是三般若也。夫心佛众生三无差别。但以生法太广。佛法太高。初心之人惟观心为易。是故大部六百余卷。既约佛法及众生法。广明般若。今但直约心法显示般若。然大部虽广明佛法及众生法。未尝不即心法。今文虽直明心法。未尝不具佛法及众生法。故得名为三无差也。以吾人现前一念介尔之心。虚明洞彻。了了常知。不在内外中间诸处。亦无过现未来形迹。即是观照般若。以吾人现前一念介尔之心。炳现根身器界。乃至十界。假实国土。平等印持。不前不后。同时顿具。即是文字般若。盖山河大地明暗色空等一切诸境界。性无非文字。不但纸墨语言为文字也。以吾人现前一念介尔之心。所有知觉之性。及与境界之性。无分无剂。无能无所。无是非是。统惟一法界体。即是实相般若。实相般若。非彼岸非此岸。达此现前一念之实相。故生死即涅槃。名波罗蜜。观照般若。亦非彼岸非此岸。照此现前一念即实相。故即惑成智。名波罗蜜。文字般若。亦非彼岸非此岸。显此现前一念即实相。故即结业是解脱名波罗蜜。是故此心。即三般若。三般若只是一心。此理常然不可改变。故名为经。依此成行。三世诸佛菩萨之所共遵。故名为经。说此法门。天魔外道不能乱坏。故名为经。<br />
<br />
&nbsp;<br />
<br />
<font color="#800000"><strong>观自在菩萨。行深般若波罗蜜多时。照见五蕴皆空。度一切苦厄。</strong></font><br />
<br />
&nbsp;<br />
<br />
要知山下路。须问过来人。故举观心行成者为榜样也。观者能观之智。即一心三观。通名观照般若也。自在者。繇证实相理谛。于诸境界得大解脱也。菩萨翻觉有情。乃自利利他之号。智契实相。则自利满足。智宣文字。则利他普遍。故名菩萨。此明能行之人也。深般若波罗蜜多者。三智一心中得。权教三乘所不能共。故名为深。此总明所行之法也。时者。追指旷劫以前而言。从此一得相应。则直至尽未来际。终始不离深般若矣。照见者。别明能观之智。即观照般若。五蕴者。别明所观之境。即文字般若。皆空者。别明所显之谛。即实相般若。五阴无不即空假中。四句咸离。百非性绝。强名为空耳。度一切苦厄者。自出二死苦因苦果。亦令法界众生同出二死因果。即是行法之效。亦即波罗蜜多也。<br />
<br />
&nbsp;<br />
<br />
<font color="#800000"><strong>舍利子。色不异空。空不异色。色即是空。空即是色。受想行识。亦复如是。舍利子。是诸法空相。不生不灭。不垢不净。不增不减。是故空中无色。无受想行识。无眼耳鼻舌身意。无色声香味触法。无眼界。乃至无意识界。无无明。亦无无明尽。乃至无老死。亦无老死尽。无苦集灭道。无智亦无得。以无所得故。</strong></font><br />
<br />
&nbsp;<br />
<br />
此广释五蕴皆空之境谛。而观照自在其中。以非观照不能了达此境谛。故夫心者。不起则已。介尔有心。则必顿现根身器界。名为色蕴。则必领纳诸苦乐境。名为受蕴。则必取相施设名言。名为想蕴。则必生灭迁流不停。名为行蕴。则必了了分别诸法。名为识蕴。是知随其所起介尔之心。法尔具足五叠浑浊。今以甚深般若照之。了知色惟是心。别无实色。一切根身器界。皆如空华梦物。故色不异空。空亦惟心。别无异空。设有一法过涅槃者。我亦说为如幻如梦。故空不异色。既云不异。已是相即。犹恐封迷情者。尚作翻手覆手之解。故重示云色即是空空即是色。谓随拈一微尘色体。即法界横遍竖穷。故即是空。所谓全事即理。无有少许理性而不在此事中。即此微尘所具真空全理。还即顿具法界全事。故即是色。所称全理即事。无有少许事相而不在此理中。斯则当体绝待。更无二物。既于色蕴了达此实相已。受想行识例皆可知。又恐执迷之人。谓此五蕴实相。从照见生。故更申示之曰。是五蕴诸法。当体即是真空实相。本自如斯。非实相生而五蕴灭。以五蕴本自不生不灭。故名为空相耳。又恐迷者。谓此五蕴空相虽非生灭。而有垢净。谓凡夫随于染缘则垢。圣人随于净缘则净。故更申示之曰。凡夫五蕴亦即空相。圣人五蕴亦即空相。何垢净之有哉。又恐迷者。谓此五蕴空相。虽无垢净而有增减。谓凡夫迷。故生死浩然为增。德相隐覆为减。圣人悟。故照用无尽为增。惑业消亡为减。故更申示之曰。迷时亦只此诸法空相。悟时亦只此诸法空相。何增减之有哉。既向五蕴发明此妙谛已。遂即广□一切差别法相。融绝圣凡情见。而曰是故空中无色乃至亦无得也。然所谓无色乃至亦无得者。岂俟融绝而后无哉。良以本无所得故也。本无所得名之为谛。了此无得名之为观。而总不离五蕴为所观境。若境若谛若观。又总不离现前一念介尔之心。一心宛具三义谛即实相。观即观照。境即文字。不纵横并别。亦非一异故名为深般若也。<br />
<br />
&nbsp;<br />
<br />
<font color="#800000"><strong>菩提萨埵。依般若波罗蜜多故。心无挂碍。无挂碍故。无有恐怖。远离颠倒梦想。究竟涅槃。三世诸佛。依般若波罗蜜多故。得阿耨多罗三藐三菩提。故知般若波罗蜜多。是大神咒。是大明咒。是无上咒。是无等等咒。能除一切苦。真实不虚。</strong></font><br />
<br />
&nbsp;<br />
<br />
此遍举菩萨诸佛为证。而明此深般若。真能度一切苦厄。所谓过去诸如来。斯门已成就。现在诸菩萨。今各入圆明。未来修学人。当依如是法。非惟观世音也。无挂碍。则结业即解脱。究竟方便净涅槃。无恐怖。则苦果即法身。究竟性净涅槃。远离颠倒梦想。则烦惑即智明。究竟圆净涅槃。依实相般若。得真性菩提。依观照般若。得实智菩提。依文字般若。得方便菩提。菩提是如如智。智必冥理。涅槃是如如理。理必契智。故影略而互言之。此深般若。即大神咒。具妙用故。即大明咒。智照相故。即无上咒。实相体故。即无等等咒。无有一法能等此心。此心能等一切诸法。令其同归实相印故。此之心咒。的的能除自他分段变易诸苦因果。真实不虚。应谛信也。<br />
<br />
&nbsp;<br />
<br />
<font color="#800000"><strong>故说般若波罗蜜多咒。即说咒曰。揭谛揭谛。波罗揭谛。波罗僧揭谛。菩提萨婆诃。</strong></font><br />
<br />
&nbsp;<br />
<br />
前之显说既指般若即咒。此之密说。须知咒即般若。然显说而又密说者。显密各具四悉檀益故。正以不翻为妙。不宜穿凿。</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=28</link>
			<category domain="http://www.phpec.com/?cid=8">太阳*雨*心情</category>
			<pubDate>2007-07-11 13:00</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=27</guid>
			<title>xajax写的blackjack游戏</title>
			<author>tim</author>
			<description><![CDATA[<p>这个小作品是当初第一次看xajax时写的,后来发在PHPX的原创区和我在CU的博客,转载请保留作者信息(一次无意中的搜索,居然发现我的这个作品被某人改了作者信息就原封不动地发在自己的博客,还声称是自己的作品,再次BS一下)<br />
<br />
下面先来简要说一下实现的方法,代码附后:<br />
<br />
1)游戏规则及玩法请在网上搜^&amp;^<br />
<br />
执行bj.php,[BET]表示下注,[HIT]要牌,[STAND]玩家停止要牌,电脑要牌并计算胜负<br />
<br />
2)bj.php<br />
<br />
此文件为执行流程控制,基本流程是:<br />
<br />
a.载入xajax类库<br />
b.载入定义了处理的服务器端文件bj_response.php<br />
c.初始xajax类,并注册bet,hit,stand的处理方法<br />
d.开始侦听<br />
<br />
此外,该文件还使用xajax的printJavascript方法,生成了相关的js代码,定义了一些DIV,用来显示内容,初始时的[BET]按钮加上了xajax_bet处理方法<br />
<br />
<strong>3)bj_response.php</strong><br />
<br />
此文件定义了所有响应处理动作</p>
<ul>
    <li>class cards</li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 这是一个负责洗牌和发牌的类</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;cards{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;</span><span class="vars">$cards</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>();&nbsp;</span><span class="comment">//剩余的牌</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;cards(</span><span class="vars">$nums</span><span>&nbsp;=&nbsp;52){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;cards&nbsp;=&nbsp;range(1,</span><span class="vars">$nums</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shuffle(<span class="vars">$this</span><span>-&gt;cards);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;deal(</span><span class="vars">$nums</span><span>&nbsp;=&nbsp;1){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="vars">$nums</span><span>&nbsp;&lt;&nbsp;1&nbsp;||&nbsp;</span><span class="func">count</span><span>(</span><span class="vars">$this</span><span>-&gt;cards)&nbsp;&lt;&nbsp;</span><span class="vars">$nums</span><span>&nbsp;)&nbsp;</span><span class="keyword">return</span><span>&nbsp;false;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="vars">$i</span><span>=0;</span><span class="vars">$i</span><span>&lt;</span><span class="vars">$nums</span><span>;</span><span class="vars">$i</span><span>++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars">$card</span><span>[]=</span><span class="func">array_pop</span><span>(</span><span class="vars">$this</span><span>-&gt;cards);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$nums</span><span>&nbsp;==&nbsp;1&nbsp;?&nbsp;current(</span><span class="vars">$card</span><span>)&nbsp;:&nbsp;</span><span class="vars">$card</span><span>;&nbsp;</span><span class="comment">//只有一张,直接返回,多张以数组返回</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<ul>
    <li>score和tran方法</li>
</ul>
<p>&nbsp;&nbsp;&nbsp; score负责计点数(J,Q,K)计十点,数字牌按数字计,A可以计一点或者11点</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;score(</span><span class="vars">$cards</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$ace</span><span>&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$value</span><span>&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>(</span><span class="vars">$cards</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$v</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$mod</span><span>&nbsp;=&nbsp;</span><span class="vars">$v</span><span>&nbsp;%&nbsp;13;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="vars">$mod</span><span>&nbsp;==&nbsp;1)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$value</span><span>&nbsp;+=&nbsp;11;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$ace</span><span>&nbsp;++;&nbsp;</span><span class="comment">//Ace可算1点或11点,先计数</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">elseif</span><span>(</span><span class="vars">$mod</span><span>&nbsp;&gt;&nbsp;10&nbsp;||&nbsp;</span><span class="vars">$mod</span><span>&nbsp;==&nbsp;0)&nbsp;</span><span class="vars">$value</span><span>&nbsp;+=&nbsp;10;&nbsp;</span><span class="comment">//J&nbsp;Q&nbsp;K&nbsp;算10点,$mod&nbsp;==&nbsp;0表示&nbsp;KING</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="vars">$value</span><span>&nbsp;+=&nbsp;</span><span class="vars">$mod</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="vars">$i</span><span>=0;</span><span class="vars">$i</span><span>&lt;</span><span class="vars">$ace</span><span>;</span><span class="vars">$i</span><span>++){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="vars">$value</span><span>&nbsp;&gt;21)&nbsp;</span><span class="vars">$value</span><span>&nbsp;-=&nbsp;10;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$value</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$value</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
&nbsp;&nbsp;&nbsp; tran方法只是将所得的牌转换为图象显示,注意的是,牌局进行时,电脑有一张牌不显示</p>
<ul>
    <li>showResult</li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 判断胜负的方法,主要进行判断,并根据结果,更新显示页面</p>
<ul>
    <li>showCards</li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 未结束时的每一轮显示</p>
<ul>
    <li>&nbsp;bet,stand,hit</li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 分别响应客户端注册的方法,会调用相应的showCards或showResult<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 本程序主要用到了<font color="#800000"><strong>addAssign,addAlert,addEvent,addCreateInput</strong></font>等xajax的方法</p><br /><br /><b>附件: </b><a href="http://www.phpec.com/attachment.php?id=3" target="_blank">blackjack.rar</a> (109.84 K, 下载次数:61)]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=27</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2007-07-10 23:31</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=26</guid>
			<title>可逆的加密方法(Mcrypt Encryption Functions)</title>
			<author>tim</author>
			<description><![CDATA[<p>有些应用需要双向的加密处理,以前一直自己写算法去实现,效果都不是很理想,原来PHP本身就内置一组功能强大的可逆的加密方法(Mcrypt Encryption Functions),下面记录一下,以备后用<br />
<br />
1)安装<br />
<br />
在windows下安装,只需要在php.ini加入<font color="#800000"><strong>php_mcrypt.dll</strong></font>扩展(可能需要将php安装目录下的<font color="#800000"><strong>libmcrypt.dl</strong></font>l拷至system32目录)<br />
<br />
linux下,需先安装mcrypt(在http://mcrypt.sourceforge.net/ 下载),编译时要--disable-posix-threads,<br />
然后在编译php时加入--with-mcrypt<br />
<br />
2)例子</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$td</span><span>&nbsp;=&nbsp;mcrypt_module_open(MCRYPT_DES,</span><span class="string">''</span><span>,</span><span class="string">'ecb'</span><span>,'</span><span class="string">'</span><span>);&nbsp;</span><span class="comment">//使用MCRYPT_DES算法,ecb模式</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$iv</span><span>&nbsp;=&nbsp;mcrypt_create_iv(mcrypt_enc_get_iv_size(</span><span class="vars">$td</span><span>),&nbsp;MCRYPT_RAND);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$ks</span><span>&nbsp;=&nbsp;mcrypt_enc_get_key_size(</span><span class="vars">$td</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp; <span class="vars">$key</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;ery&nbsp;secret&nbsp;key&quot;</span><span>;</span><span class="comment">//密钥</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$key</span><span>&nbsp;=&nbsp;</span><span class="func">substr</span><span>(md5(</span><span class="vars">$key</span><span>),&nbsp;0,&nbsp;</span><span class="vars">$ks</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;mcrypt_generic_init(<span class="vars">$td</span><span>,&nbsp;</span><span class="vars">$key</span><span>,&nbsp;</span><span class="vars">$iv</span><span>);&nbsp;</span><span class="comment">//初始处理</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp; <span class="comment">//加密</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$encrypted</span><span>&nbsp;=&nbsp;mcrypt_generic(</span><span class="vars">$td</span><span>,&nbsp;</span><span class="string">'This&nbsp;is&nbsp;very&nbsp;important&nbsp;data'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//结束处理</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;mcrypt_generic_deinit(<span class="vars">$td</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//初始解密处理</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;mcrypt_generic_init(<span class="vars">$td</span><span>,&nbsp;</span><span class="vars">$key</span><span>,&nbsp;</span><span class="vars">$iv</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//解密</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$decrypted</span><span>&nbsp;=&nbsp;mdecrypt_generic(</span><span class="vars">$td</span><span>,&nbsp;</span><span class="vars">$encrypted</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//结束</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;mcrypt_generic_deinit(<span class="vars">$td</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;mcrypt_module_close(<span class="vars">$td</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//解密后,可能会有后续的\0,需去掉</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;trim(</span><span class="vars">$decrypted</span><span>)&nbsp;.&nbsp;</span><span class="string">&quot;\n&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=26</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2007-07-09 12:56</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=25</guid>
			<title>PHPec代码说明-Libs</title>
			<author>tim</author>
			<description><![CDATA[<p>PHPec的Libs目录主要放一些与框架核心流程无直接关联的类库,目前版本只有Ajax和Lang两个类,分别提供Ajax(实际上是AJAJ)和多语言支持功能,本来,在预览版中,有一个Valid的类,提供了自动生成客户端及服务器端数据验证的功能,但由于与框架藕合性太强,所以暂时被取消,后续版本发布时,去藕后会重新被加入,此外,还会加入图像处理(缩略图,验证码等),分页处理,购物车,等等类库,各位朋友有兴趣也可以共同来完善这一部分,增加更多更易用的类库..<br />
<br />
注:框架自带类库的载入方式是:在action中使用<font color="#800000"><strong>$this -&gt; loadLib('类名','构造参数')</strong></font>,开发者自己在框架外定义的类库可存放在CLASS_DIR定义的目录,再用<font color="#800000"><strong>$this -&gt; loadClass('类名','构造参数')</strong></font>来载入,注意类名须与文件名一致,目前只支持单一构造参数(可为字串或数组,后续版本会改为支持多参数) <br />
<br />
下面先说明一下Lang类,Ajax类留待下一篇文章介绍:<br />
<br />
Lang类的主要功能是使用指定的字典,翻译出显示的内容,目的是提供简单的多语言支持,该类的实现很简单</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Lang{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="vars">$dist</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;__construct(</span><span class="vars">$distFile</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(!</span><span class="func">file_exists</span><span>(</span><span class="vars">$distFile</span><span>))&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Exception(</span><span class="string">&quot;字典文件\&quot;{$distFile}\&quot;&nbsp;不存在...&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">include_once</span><span>(</span><span class="vars">$distFile</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;dist&nbsp;=&nbsp;</span><span class="vars">$dist</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;get(</span><span class="vars">$word</span><span>=</span><span class="string">''</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(!</span><span class="vars">$word</span><span>)&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;dist;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(isset(</span><span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;dist[</span><span class="vars">$word</span><span>]))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;dist[</span><span class="vars">$word</span><span>];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Exception(</span><span class="string">&quot;字典中不存在词条\&quot;{$word}\&quot;...&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
<br />
<font color="#800000"><strong>构造方法<br />
<br />
</strong></font>接受一个参数,指定使用的字典文件<br />
<br />
<font color="#800000"><strong>get方法<br />
<br />
</strong></font>该方法返回翻译结果,如果有参数,表示返回指定的词条,如果无参数,表示返回全部词条<br />
<br />
字典的格式为一数组(建议存为单一文件,放在应用程序的config目录),内容是</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="vars">$dist</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp; key1=Value1,&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp; key2=Value2,&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp; ..&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp; keyn=valuen&nbsp;&nbsp;</span></li>
    <li class=""><span>)&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
一个词一行,key表示词,value表示结果,一般地,key采用英文,相应地,value表示该词的其它语言表示,例如:<br />
<br />
'NAME' =&gt; '姓名',<br />
'AGE' =&gt; '年龄'<br />
<br />
用法(在controller的action中使用):</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="vars">$lang</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;loadLib(</span><span class="string">'Lang'</span><span>,</span><span class="string">'字典文件'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;Response&nbsp;-&gt;&nbsp;set(</span><span class="string">'words'</span><span>,</span><span class="vars">$lang</span><span>-&gt;get());</span><span class="comment">//传递给view解释</span><span>&nbsp; <br />
    </span></span></li>
</ol>
</div>
<p><br />
这样,就可以通过使用不能的字典,实现不同语言的版本了(模板应该也要载入不同的版本)<br />
<br />
注:已发布的1.0.1版中,get方法在字典中不存在指定词条时抛出的是EC_Exception,这是预览版中定义的异常处理,正式版发布时取消了(目的是更加简单易懂),而直接使用PHP5的异常处理...所以,应该将<font color="#800000"><strong>throw new EC_Exception()</strong><font color="#000000">改为</font><strong>throw new Exception</strong></font> ...</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=25</link>
			<category domain="http://www.phpec.com/?cid=1">PHPec文档</category>
			<pubDate>2007-07-08 13:40</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=24</guid>
			<title>APACHE不能启动的原因</title>
			<author>tim</author>
			<description><![CDATA[<p>我笔记本上的apache不是随机器启动的,只在需要本机调试时开一下,但今天居然启动不了,错误日志显示端口被占用,奇怪,我除了APACHE,又没装过其它web server,那到底谁占了80端站呢?<br />
<br />
在命令行执行:<br />
<br />
netstat -ano<br />
<br />
查到 80端口被一个pid为1932的进程占了:<br />
<br />
TCP&nbsp;&nbsp;&nbsp; 0.0.0.0:80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTENING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1932<br />
<br />
打开任务管理器的进程项:<br />
默认是不显示pid的,选择&quot;查看&quot;-&gt;&quot;选择列&quot;,选中pid,就可以看到pid了,原来pid为1932的进程是qqdownload.exe,超级旋风?这个东东为什么要开80端口呢?<br />
<br />
想不到第一次用这个东东就出问题(我是前几天想下CentOs时,试了常用的几个下载工具都下不了,只有超级旋风能下,就用上它的),现在的程序,真的出现信任危机了...</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=24</link>
			<category domain="http://www.phpec.com/?cid=6">LAMP</category>
			<pubDate>2007-07-07 12:07</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=23</guid>
			<title>PHPec代码说明--Model.php</title>
			<author>tim</author>
			<description><![CDATA[<p>Model.php是数据模型的基类,扩展自Pear::DB,提供了常规则的数据库RADC操作,具体的数据模型只需从Model扩展,就可以方便使用,你可能只需要指定表名和主键,因为其它的操作,Model都封装好了<br />
<br />
Model.php只提供简单的单表操作,复杂的操作可以自定义SQL语句,或者使用数据库视图来进行连表,Model是整个框架中藕合性最低的,你甚至可以使用ADODB,DB_QueryTool,PDO等自己重新定义一个新的Model基类(建议自己实现的Model的方法跟框架内置Model的方法一致)<br />
<br />
下面说明一下Model.php:<br />
<br />
<font color="#800000"><strong>构造函数<br />
<br />
</strong></font>生成PEAR::DB对象,并设置一下FetchMode和字符集<br />
<br />
<font color="#800000"><strong>nextId方法</strong></font><br />
<br />
获得一个唯一主键ID<br />
<br />
<font color="#800000"><strong>query($sql)<br />
<br />
</strong></font>执行$sql语句<br />
<br />
<font color="#800000"><strong>add($row)<br />
<br />
</strong></font>加入一条记录,$row为记录的数据,以数组表现<br />
<br />
<font color="#800000"><strong>del($arr)<br />
<br />
</strong></font>删除记录,参数可以为:如果是整形数据,则作为主键,如果是字串,则作为where 条件,如果是数组,则以key=value作为条件<br />
<br />
<font color="#800000"><strong>update($data,$wh='')<br />
<br />
</strong></font>更新记录,$data为要更新的字段和值,$wh为条件,如果$data中有主键,则主键也作为条件<br />
<br />
<font color="#800000"><strong>get($wh='',$field='*')<br />
<br />
</strong></font>获得一条记录<br />
$wh为条件,可以为字符串或数组<br />
$field为查询的字段,如果字段数为1,则直接返回字段值,如果大于1,则返回结果数组<br />
<br />
<font color="#800000"><strong>getCount($wh='')<br />
<br />
</strong></font>查询指定条件记录总数<br />
<br />
<font color="#800000"><strong>getAll($wh='',$field=&quot;*&quot;,$limit=&quot;&quot;,$order=&quot;&quot;)<br />
<br />
</strong></font>查询记录集<br />
$wh : 查询条件,可以是字符串或数组<br />
$field :　要select的字段<br />
$limit : limit限制<br />
$order : 排序依据<br />
<br />
<br />
创建数据模型<br />
<br />
定义一个类,类名与文件名一致,放在MODLE_DIR定义的目录下（建议采用表名）</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">include</span><span>(</span><span class="string">&quot;Model.php&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;User&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Model{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$tableName</span><span>&nbsp;=&nbsp;</span><span class="string">'user'</span><span>;&nbsp;</span><span class="comment">//定义表名</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$primaryKey</span><span>&nbsp;=&nbsp;</span><span class="string">'id'</span><span>;&nbsp;&nbsp;</span><span class="comment">//定义主键</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//定义其它数据方法</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
<br />
只需简单的几行代码，这个User的数据模型就具有Model所提供的方法了</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=23</link>
			<category domain="http://www.phpec.com/?cid=1">PHPec文档</category>
			<pubDate>2007-07-06 22:53</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=22</guid>
			<title>在PHPchina的不爽</title>
			<author>tim</author>
			<description><![CDATA[<p>PHPchina作为zend公司在中国的官方网站，我以前也偶尔会去看看，但大多数潜水，最近浮水来透透气，却感到非常不爽:<br />
<br />
1)在框架讨论区，某位朋友发了一篇关于FLEA的帖子，帖子中有比较多的针对FLEA的言论，但个人认为，都是些纯技术讨论的言论，并没有人身攻击或其它,然后，我在中午前回了两帖，内容也只是本人对FLEA的一些观点的不认同，然而，下午再上去时，该项帖已被删除，原因不明..一篇有观点碰撞的帖子，莫明被删除，实在不爽...<br />
<br />
2)今天，我在在基础版(问答求助)中提了一个建议,叫某位版主（管理员）不要在此版发一大堆的技术文章,而专门去开一个版发(此君最近不停地在该版发一些收集回来的文章，而且，一发就几屏，每篇文章基本上都是简单几行，然后一个链接，看起来也不爽),想不到的是，此君立即将我的帖子作了<font size="4" color="#800000"><strong>&quot;下沉&quot;</strong><font size="2" color="#000000">处理...这更加不爽,完全没有该有的风度，如果你觉得我提得不对，你可以回复一下，说明你的道理，你如果觉得我发的地方不对，你可以移到其它版,但这种做法，我的反应除了不爽之外，还有一个字:KAO....</font></font></p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=22</link>
			<category domain="http://www.phpec.com/?cid=8">太阳*雨*心情</category>
			<pubDate>2007-07-06 13:59</pubDate>
		</item>
		<item>
			<guid>http://www.phpec.com/?action=show&amp;id=21</guid>
			<title>PHPec代码说明-View</title>
			<author>tim</author>
			<description><![CDATA[<p>PHPec目前支持两种方式的模板引擎,分别是Php和Smarty,定义在PHPec的View目录,由Controller根椐设定来调用<br />
<br />
<strong>1)iView.php</strong></p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">interface</span><span>&nbsp;iView&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;fetch();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;display();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;setCache(</span><span class="vars">$cache_state</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;getCache();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
这是View的接口定义,各种View的引擎必须实现这几个方法<br />
<font color="#800000"><strong>fetch()</strong></font> //获得view的输出内容<br />
<font color="#800000"><strong>display() </strong></font>//直接向浏览器输出view的内容<br />
<font color="#800000"><strong>setCache($cache_state)</strong></font>//将当前view的缓存设置为$cache_state<br />
<font color="#800000"><strong>getCache() </strong></font>//获得当前view的缓存设置<br />
<br />
<strong>2)Smarty.php</strong><br />
<br />
该文件使用smarty来实现view的解释<br />
<br />
首先,定义类名,实现iView接口</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;View_Smarty&nbsp;</span><span class="keyword">implements</span><span>&nbsp;iView{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
<font color="#800000"><strong>构造方法(传递模板文件名)</strong></font><br />
在构造中,载入了smarty的类包,设置了些变量,最后,生成smarty对象<br />
<br />
<font color="#800000"><strong>display和fetch</strong></font><br />
fetch方法中,将response对象传递给smarty,然后调用smarty的fetch返回内容,display直接输出...<br />
<br />
<font color="#800000"><strong>setCache和getCache</strong></font><br />
设置和获得缓存的状态<br />
<br />
<br />
<strong>3)Php.php</strong><br />
<br />
该文件使用php来实现view的解释<br />
<br />
与Smarty.php类似,先定义了一个View_Php的类,再实现必须的display,fetch,getCache,setCache方法<br />
<br />
View_Php的构造很简单,只是传递了模板文件名,主要看一下fetch的实现</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;fetch(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ob_start();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//模板中直接使用的对象</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$response</span><span>&nbsp;=&nbsp;Response::getInstance();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">include_once</span><span>(</span><span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;tplFile);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$content</span><span>&nbsp;=&nbsp;ob_get_clean();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$content</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp; <br />
    </span></li>
</ol>
</div>
<p><br />
先使用ob_start来缓冲输出,再生成Response对象,然后include模板文件,由于是同一层次,在模板文件中可以直接使用Response对象来输出数据<br />
最后使用ob_get_clean来获得输出,并返回<br />
<br />
除了实现了接口的方法,View_Php还根椐本身的需要定义了一些辅助的方法,用来对HTML进行处理(这将是下一步开发重点)<br />
<br />
<strong>4)使用自定义模板解释引擎<br />
<br />
</strong>如果另外有自己用习惯的模板,想加到框架中,方法也很简单,步骤是:<br />
<br />
1)定义一个文件,存放在框架的View目录下,文件名就是VIEW_ENGINE所指定的,如内置的Php,Smarty,你可以定义为Myview,则建立Myview.php存放在框架的View下<br />
<br />
2)在Myview.php中定义一个类,实现iView接口</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>defined(</span><span class="string">'VIEW_INTERFACE'</span><span>)&nbsp;||&nbsp;</span><span class="keyword">include</span><span>(</span><span class="string">&quot;iView.php&quot;</span><span>);&nbsp;</span><span class="comment">//载入iView接口定义</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">class</span><span>&nbsp;View_Myview&nbsp;mplements&nbsp;iView{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;__construct(</span><span class="vars">$tplFile</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//必须参数为模板文件名</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//生成模板引擎对象</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;display(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="vars">$this</span><span>&nbsp;-&gt;&nbsp;fetch();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;fucntion&nbsp;fetch(){&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//使用模板引擎对象处理模板文件,最后返回输出内容</span></span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //可使用Response::getInstance来获得Response对象并传值</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//set/get来设置或获得缓存设置,实现方法与内置引擎一样</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;setCache(</span><span class="vars">$cache</span><span>){}&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;getCache(){}&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
然后在里面实现iView中定义的方法,实现可以参照内置的引擎<br />
<br />
3)定义好后,就可以使用<strong>VIEW_ENGINE</strong>来指定使用你的模板,也可以及loadView是使用第三参数临时指定使用其它引擎</p>]]></description>
			<link>http://www.phpec.com/?action=show&amp;id=21</link>
			<category domain="http://www.phpec.com/?cid=1">PHPec文档</category>
			<pubDate>2007-07-05 22:35</pubDate>
		</item>
	</channel>
</rss>
