程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP中的輸出控制方法

PHP中的輸出控制方法

編輯:PHP綜合
緩沖輸出
<?php
for ($i=10; $i>0; $i--)
{
 echo $i;
 flush();
 sleep(1);
}
?>按照php手冊裡的說法
該函數將當前為止程序的所有輸出發送到用戶的浏覽器。
上面的這段代碼,應該隔一秒鐘輸出一次$i。但是實際中卻不一定是這樣。有可能是等了10秒鐘後,所有的輸出同時呈現出來。
好,我們來改一下這段代碼,改成
<?php
ob_end_clean();//修改部分
for ($i=10; $i>0; $i--)
{
 echo $i;
 flush();
 sleep(1);
}
?>嘿,加了這一句ob_end_clean();,居然就OK了。實際上,我們把ob_end_clean()換成ob_end_flush()也一樣OK。
我再來改一改。
<?php
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();//修改部分
 flush();
 sleep(1);
}
?>運行一下,是不是發現$i也隔一秒輸出一次了?這是為什麼呢?
別急,我們來看看php.ini。
打開php.ini,搜索output_buffering,我們會看到類似這樣的設置 output_buffering = 4096。正如它的名字output_buffering一樣,這個設置的作用就是把輸出緩沖一下,緩沖大小為4096bytes.
在我們的第一段代碼裡,之所以沒有按預期的輸出,正是因為這個output_buffering把那些輸出都緩沖了。沒達到4096bytes或者腳本結束,輸出是不會被發送出去的。
而第二段代碼中的ob_end_clean()和ob_end_flush()的作用,就是終止緩沖。這樣就不用等到有4096bytes的緩沖之後才被發送出去了。
第三段代碼中,用了一句ob_flush(),它的作用就是把緩沖的數據發送出去,但是並不會終止緩沖,所以它必須在每次flush()前使用。
如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我們就必須把php.ini裡的output_buffering設得足夠小,例如設為0。需要注意的是,如果你打算在腳本中使用ini_set(”output_buffering”,”0″)來設置,那麼請停下來吧,這種方法是不行的。因為在腳本一開始的時候,緩沖設置就已經被載入,然後緩沖就開始了。
可能你會問了,既然ob_flush()是把緩沖的數據發送出去,那麼為什麼還需要用flush()???直接用下面這段代碼不行嗎??
<?php
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();
 sleep(1);
}
?>請注意ob_flush()和flush()的區別。前者是把數據從PHP的緩沖中釋放出來,後者是把不在緩沖中的或者說是被釋放出來的數據發送到浏覽器。所以當緩沖存在的時候,我們必須ob_flush()和flush()同時使用。
那是不是flush()在這裡就是不可缺少的呢?不是的,我們還有另外一種方法,使得當有數據輸出的時候,馬上被發送到浏覽器。下面這兩段代碼就是不需要使用flush()了。(當你把output_buffering設為0的時候,連ob_flush()和ob_end_clean()都不需要了)
<?php
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();
 sleep(1);
}
?><?php
ob_end_clean();
ob_implicit_flush(true);
for ($i=10; $i>0; $i--) [Page]
{
 echo $i;
 sleep(1);
}
?>請注意看上面的ob_implicit_flush(true),這個函數強制每當有輸出的時候,即刻把輸出發送到浏覽器。這樣就不需要每次輸出(echo)後,都用flush()來發送到浏覽器了。 *
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved