﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-愚人博客-随笔分类-PHP</title><link>http://www.blogjava.net/imfisher/category/25220.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 06 Sep 2007 04:06:02 GMT</lastBuildDate><pubDate>Thu, 06 Sep 2007 04:06:02 GMT</pubDate><ttl>60</ttl><item><title>[转]剖析PHP中的输出缓冲</title><link>http://www.blogjava.net/imfisher/archive/2007/09/06/143079.html</link><dc:creator>愚人</dc:creator><author>愚人</author><pubDate>Thu, 06 Sep 2007 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/imfisher/archive/2007/09/06/143079.html</guid><wfw:comment>http://www.blogjava.net/imfisher/comments/143079.html</wfw:comment><comments>http://www.blogjava.net/imfisher/archive/2007/09/06/143079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/imfisher/comments/commentRss/143079.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/imfisher/services/trackbacks/143079.html</trackback:ping><description><![CDATA[<p>我们先来看一段代码。</p>
<div class="hl-surround">
<div class="hl-main">
<pre><span class="hl-inlinetags">&lt;?php
</span><span class="hl-reserved">for </span><span class="hl-brackets">(</span><span class="hl-var">$i</span><span class="hl-code">=</span><span class="hl-number">10</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code">&gt;</span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code">--</span><span class="hl-brackets">)
{
</span><span class="hl-reserved">echo </span><span class="hl-var">$i</span><span class="hl-code">;
</span><span class="hl-identifier">flush</span><span class="hl-brackets">()</span><span class="hl-code">;
</span><span class="hl-identifier">sleep</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}
</span><span class="hl-inlinetags">?&gt;</span></pre>
</div>
</div>
<p>按照<a href="http://www.php.net/flush">php手册里的说法</a></p>
<blockquote>
<p>该函数将当前为止程序的所有输出发送到用户的浏览器。</p>
</blockquote>
<p>上面的这段代码，应该隔一秒钟输出一次$i。但是实际中却不一定是这样。有可能是等了10秒钟后，所有的输出同时呈现出来。</p>
<p>好，我们来改一下这段代码，改成</p>
<div class="hl-surround">
<div class="hl-main">
<pre><span class="hl-inlinetags">&lt;?php
</span><span class="hl-identifier">ob_end_clean</span><span class="hl-brackets">()</span><span class="hl-code">;</span><span class="hl-comment">//修改部分
</span><span class="hl-reserved">for </span><span class="hl-brackets">(</span><span class="hl-var">$i</span><span class="hl-code">=</span><span class="hl-number">10</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code">&gt;</span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code">--</span><span class="hl-brackets">)
{
</span><span class="hl-reserved">echo </span><span class="hl-var">$i</span><span class="hl-code">;
</span><span class="hl-identifier">flush</span><span class="hl-brackets">()</span><span class="hl-code">;
</span><span class="hl-identifier">sleep</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}
</span><span class="hl-inlinetags">?&gt;</span></pre>
</div>
</div>
<p>嘿，加了这一句ob_end_clean();,居然就OK了。实际上，我们把ob_end_clean()换成ob_end_flush()也一样OK。</p>
<p>我再来改一改。</p>
<div class="hl-surround">
<div class="hl-main">
<pre><span class="hl-inlinetags">&lt;?php
</span><span class="hl-reserved">for </span><span class="hl-brackets">(</span><span class="hl-var">$i</span><span class="hl-code">=</span><span class="hl-number">10</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code">&gt;</span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code">--</span><span class="hl-brackets">)
{
</span><span class="hl-reserved">echo </span><span class="hl-var">$i</span><span class="hl-code">;
</span><span class="hl-identifier">ob_flush</span><span class="hl-brackets">()</span><span class="hl-code">;</span><span class="hl-comment">//修改部分
</span><span class="hl-identifier">flush</span><span class="hl-brackets">()</span><span class="hl-code">;
</span><span class="hl-identifier">sleep</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}
</span><span class="hl-inlinetags">?&gt;</span></pre>
</div>
</div>
<p>运行一下，是不是发现$i也隔一秒输出一次了？这是为什么呢？<br />
别急，我们来看看php.ini。</p>
<p>打开php.ini,搜索output_buffering，我们会看到类似这样的设置 output_buffering = 4096。正如它的名字output_buffering一样，这个设置的作用就是把输出缓冲一下，缓冲大小为4096bytes.</p>
<p>在我们的第一段代码里，之所以没有按预期的输出，正是因为这个output_buffering把那些输出都缓冲了。没达到4096bytes或者脚本结束，输出是不会被发送出去的。</p>
<p>而第二段代码中的ob_end_clean()和ob_end_flush()的作用，就是终止缓冲。这样就不用等到有4096bytes的缓冲之后才被发送出去了。</p>
<p>第三段代码中，用了一句ob_flush(),它的作用就是把缓冲的数据发送出去，但是并不会终止缓冲，所以它必须在每次flush()前使用。</p>
<p>如果不想使用ob_end_clean(),ob_end_flush()和ob_flush()，我们就必须把php.ini里的output_buffering设得足够小，例如设为0。需要注意的是，如果你打算在脚本中使用ini_set(&#8221;output_buffering&#8221;,&#8221;0&#8243;)来设置，那么请停下来吧，这种方法是不行的。因为在脚本一开始的时候，缓冲设置就已经被载入，然后缓冲就开始了。</p>
<p>可能你会问了，既然ob_flush()是把缓冲的数据发送出去，那么为什么还需要用flush()???直接用下面这段代码不行吗？？</p>
<div class="hl-surround">
<div class="hl-main">
<pre><span class="hl-inlinetags">&lt;?php
</span><span class="hl-reserved">for </span><span class="hl-brackets">(</span><span class="hl-var">$i</span><span class="hl-code">=</span><span class="hl-number">10</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code">&gt;</span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code">--</span><span class="hl-brackets">)
{
</span><span class="hl-reserved">echo </span><span class="hl-var">$i</span><span class="hl-code">;
</span><span class="hl-identifier">ob_flush</span><span class="hl-brackets">()</span><span class="hl-code">;
</span><span class="hl-identifier">sleep</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}
</span><span class="hl-inlinetags">?&gt;</span></pre>
</div>
</div>
<p>请注意ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来，后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。所以当缓冲存在的时候，我们必须ob_flush()和flush()同时使用。</p>
<p>那是不是flush()在这里就是不可缺少的呢？不是的，我们还有另外一种方法，使得当有数据输出的时候，马上被发送到浏览器。下面这两段代码就是不需要使用flush()了。（当你把output_buffering设为0的时候，连ob_flush()和ob_end_clean()都不需要了）</p>
<div class="hl-surround">
<div class="hl-main">
<pre><span class="hl-inlinetags">&lt;?php
</span><span class="hl-identifier">ob_implicit_flush</span><span class="hl-brackets">(</span><span class="hl-reserved">true</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-reserved">for </span><span class="hl-brackets">(</span><span class="hl-var">$i</span><span class="hl-code">=</span><span class="hl-number">10</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code">&gt;</span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code">--</span><span class="hl-brackets">)
{
</span><span class="hl-reserved">echo </span><span class="hl-var">$i</span><span class="hl-code">;
</span><span class="hl-identifier">ob_flush</span><span class="hl-brackets">()</span><span class="hl-code">;
</span><span class="hl-identifier">sleep</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}
</span><span class="hl-inlinetags">?&gt;</span></pre>
</div>
</div>
<div class="hl-surround">
<div class="hl-main">
<pre><span class="hl-inlinetags">&lt;?php
</span><span class="hl-identifier">ob_end_clean</span><span class="hl-brackets">()</span><span class="hl-code">;
</span><span class="hl-identifier">ob_implicit_flush</span><span class="hl-brackets">(</span><span class="hl-reserved">true</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-reserved">for </span><span class="hl-brackets">(</span><span class="hl-var">$i</span><span class="hl-code">=</span><span class="hl-number">10</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code">&gt;</span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code">--</span><span class="hl-brackets">)
{
</span><span class="hl-reserved">echo </span><span class="hl-var">$i</span><span class="hl-code">;
</span><span class="hl-identifier">sleep</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}
</span><span class="hl-inlinetags">?&gt;</span></pre>
</div>
</div>
<p>请注意看上面的ob_implicit_flush(true)，这个函数强制每当有输出的时候，即刻把输出发送到浏览器。这样就不需要每次输出（echo）后，都用flush()来发送到浏览器了。</p>
<p>以上所诉可能在某些浏览器中不成立。因为浏览器也有自己的规则。我是用Firefox1.5,IE6,opera8.5来测试的。其中opera就不能正常输出，因为它有一个规则，就是不遇到一个HTML标签，就绝对不输出，除非到脚本结束。而FireFox和IE还算比较正常的。</p>
<p>最后附上一段非常有趣的代码,作者为PuTTYshell。在一个脚本周期里，每次输出，都会把前一次的输出覆盖掉。<br />
以下代码只在firefox下可用，其他浏览器并不支持multipart/x-mixed-replace的Content-Type.</p>
<div class="hl-surround">
<div class="hl-main">
<pre><span class="hl-inlinetags">&lt;?php
</span><span class="hl-identifier">header</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">Content-type: multipart/x-mixed-replace;boundary=endofsection</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-identifier">print </span><span class="hl-quotes">"</span><span class="hl-special">\n</span><span class="hl-string">--endofsection</span><span class="hl-special">\n</span><span class="hl-quotes">"</span><span class="hl-code">;
</span><span class="hl-var">$pmt</span><span class="hl-code"> = </span><span class="hl-reserved">array</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">-</span><span class="hl-quotes">"</span><span class="hl-code">, </span><span class="hl-quotes">"</span><span class="hl-special">\\</span><span class="hl-quotes">"</span><span class="hl-code">, </span><span class="hl-quotes">"</span><span class="hl-string">|</span><span class="hl-quotes">"</span><span class="hl-code">, </span><span class="hl-quotes">"</span><span class="hl-string">/</span><span class="hl-quotes">" </span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-reserved">for</span><span class="hl-brackets">( </span><span class="hl-var">$i</span><span class="hl-code"> = </span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code"> &lt;</span><span class="hl-number">10</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code"> ++ </span><span class="hl-brackets">){
</span><span class="hl-identifier">sleep</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-identifier">print </span><span class="hl-quotes">"</span><span class="hl-string">Content-type: text/plain</span><span class="hl-special">\n\n</span><span class="hl-quotes">"</span><span class="hl-code">;
</span><span class="hl-identifier">print </span><span class="hl-quotes">"</span><span class="hl-string">Part </span><span class="hl-var">$i</span><span class="hl-special">\t</span><span class="hl-quotes">"</span><span class="hl-code">.</span><span class="hl-var">$pmt</span><span class="hl-brackets">[</span><span class="hl-var">$i</span><span class="hl-code"> % </span><span class="hl-number">4</span><span class="hl-brackets">]</span><span class="hl-code">;
</span><span class="hl-identifier">print </span><span class="hl-quotes">"</span><span class="hl-string">--endofsection</span><span class="hl-special">\n</span><span class="hl-quotes">"</span><span class="hl-code">;
</span><span class="hl-identifier">ob_flush</span><span class="hl-brackets">()</span><span class="hl-code">;
</span><span class="hl-identifier">flush</span><span class="hl-brackets">()</span><span class="hl-code">;
</span><span class="hl-brackets">}
</span><span class="hl-identifier">print </span><span class="hl-quotes">"</span><span class="hl-string">Content-type: text/plain</span><span class="hl-special">\n\n</span><span class="hl-quotes">"</span><span class="hl-code">;
</span><span class="hl-identifier">print </span><span class="hl-quotes">"</span><span class="hl-string">The end</span><span class="hl-special">\n</span><span class="hl-quotes">"</span><span class="hl-code">;
</span><span class="hl-identifier">print </span><span class="hl-quotes">"</span><span class="hl-string">--endofsection--</span><span class="hl-special">\n</span><span class="hl-quotes">"</span><span class="hl-code">;
</span><span class="hl-inlinetags">?&gt;</span></pre>
</div>
</div>
<img src ="http://www.blogjava.net/imfisher/aggbug/143079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/imfisher/" target="_blank">愚人</a> 2007-09-06 09:57 <a href="http://www.blogjava.net/imfisher/archive/2007/09/06/143079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]IP转换整形(ip2long) </title><link>http://www.blogjava.net/imfisher/archive/2007/08/24/139152.html</link><dc:creator>愚人</dc:creator><author>愚人</author><pubDate>Fri, 24 Aug 2007 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/imfisher/archive/2007/08/24/139152.html</guid><wfw:comment>http://www.blogjava.net/imfisher/comments/139152.html</wfw:comment><comments>http://www.blogjava.net/imfisher/archive/2007/08/24/139152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/imfisher/comments/commentRss/139152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/imfisher/services/trackbacks/139152.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在处理IP时候我们经常会转换成整数进行处理……&nbsp;&nbsp;<a href='http://www.blogjava.net/imfisher/archive/2007/08/24/139152.html'>阅读全文</a><img src ="http://www.blogjava.net/imfisher/aggbug/139152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/imfisher/" target="_blank">愚人</a> 2007-08-24 17:42 <a href="http://www.blogjava.net/imfisher/archive/2007/08/24/139152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]开启PHP的SSL支持</title><link>http://www.blogjava.net/imfisher/archive/2007/08/24/139065.html</link><dc:creator>愚人</dc:creator><author>愚人</author><pubDate>Fri, 24 Aug 2007 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/imfisher/archive/2007/08/24/139065.html</guid><wfw:comment>http://www.blogjava.net/imfisher/comments/139065.html</wfw:comment><comments>http://www.blogjava.net/imfisher/archive/2007/08/24/139065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/imfisher/comments/commentRss/139065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/imfisher/services/trackbacks/139065.html</trackback:ping><description><![CDATA[当访问启用SSL资源的时候，会出现"did you forget to enable it when you configured PHP"错误提示，从提示我们可以看出肯定是php.ini中没有配置好SSL模块。打开php.ini找到extension=php_openssl.dll，取消注释。注意：如果使用PHP4来访问的话得从<a href="http://ftp.emini.dk/pub/php/win32/openssl/" target=_blank><u><font color=#0000ff>http://ftp.emini.dk/pub/php/win32/openssl/</font></u></a> 下载一个php4ts.dll覆盖本地的即可<br><br>另外在使用soapClient时候报错，加载extension=php_soap.dll即可。 
<img src ="http://www.blogjava.net/imfisher/aggbug/139065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/imfisher/" target="_blank">愚人</a> 2007-08-24 11:30 <a href="http://www.blogjava.net/imfisher/archive/2007/08/24/139065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>