PHP當即刷新緩存(輸出)的方法php
轉自 http://www.piaoyi.org/php/php-ob_flush-flush.htmlhtml
正 文:
近日,飄易在寫一段php程序,須要用到當即刷新緩存,輸出到瀏覽器的效果。原本,利用 ob_flush() 和 flush() 兩個函數就能夠當即輸出了。但我在實際應用中,發現不一樣的服務器之間是不兼容的。 好比,我在本地的環境(WIN XP+apache2+PHP5.2版本)下,利用下面的代碼就能夠直接達到我要的當即輸出的效果apache
<?php
ob_start(); //打開輸出緩衝區
for($i=0;$i<1000;$i++){
echo $i."<br>";
ob_flush();
flush();
}
?>
: 但當我把這樣的代碼上傳到個人服務器(WIN 2003 SERVER + APACHE + PHP5.2.5)後,上面的代碼並不能當即輸出。飄易看了下手冊,關於 ob_flush() 和 flush() 兩個函數,個人理解是這樣的:「ob_flush 是刷新PHP自身的緩衝區。
flush 只有在PHP作爲apache的Module(handler或者filter)安裝的時候,纔有實際做用,它是刷新WebServer(能夠認爲特指apache)的緩衝區,即刷新到瀏覽器輸出。有 些Apache的模塊,好比mod_gzip,可能本身進行輸出緩存,這將致使flush()函數產生的結果不會當即被髮送到客戶端瀏覽器。 而 IE瀏 覽器 只有當接受到的 4096個字節之後纔開始顯示該頁面,因此必須發送一些額外的空格來讓這些瀏覽器顯示頁面內容(緣由:Nginx有 fastcgi 緩衝區,數據超出緩衝區大小、或程序執行完,纔會將內容輸出到客戶端: fastcgi_buffer_size 4k; )。正確使用 倆者的順序是. 先ob_flush, 而後flush,固然, 在其餘sapi下, 不調用flush也能夠, 只不過爲了保證你代碼的可移植性, 建 議配套使用.」api
flush 只有在PHP作爲apache的Module(handler或者filter)安裝的時候,纔有實際做用,它是刷新WebServer(能夠認爲特指apache)的緩衝區,即刷新到瀏覽器輸出。有 些Apache的模塊,好比mod_gzip,可能本身進行輸出緩存,這將致使flush()函數產生的結果不會當即被髮送到客戶端瀏覽器。 而 IE瀏 覽器 只有當接受到的 4096個字節之後纔開始顯示該頁面,因此必須發送一些額外的空格來讓這些瀏覽器顯示頁面內容(緣由:Nginx有 fastcgi 緩衝區,數據超出緩衝區大小、或程序執行完,纔會將內容輸出到客戶端: fastcgi_buffer_size 4k; )。正確使用 倆者的順序是. 先ob_flush, 而後flush,固然, 在其餘sapi下, 不調用flush也能夠, 只不過爲了保證你代碼的可移植性, 建 議配套使用.」
flush 只有在PHP作爲apache的Module(handler或者filter)安裝的時候,纔有實際做用,它是刷新WebServer(能夠認爲特指apache)的緩衝區,即刷新到瀏覽器輸出。有 些Apache的模塊,好比mod_gzip,可能本身進行輸出緩存,這將致使flush()函數產生的結果不會當即被髮送到客戶端瀏覽器。 而 IE瀏 覽器 只有當接受到的 4096個字節之後纔開始顯示該頁面,因此必須發送一些額外的空格來讓這些瀏覽器顯示頁面內容(緣由:Nginx有 fastcgi 緩衝區,數據超出緩衝區大小、或程序執行完,纔會將內容輸出到客戶端: fastcgi_buffer_size 4k; )。正確使用 倆者的順序是. 先ob_flush, 而後flush,固然, 在其餘sapi下, 不調用flush也能夠, 只不過爲了保證你代碼的可移植性, 建 議配套使用.」
flush 只有在PHP作爲apache的Module(handler或者filter)安裝的時候,纔有實際做用,它是刷新WebServer(能夠認爲特指apache)的緩衝區,即刷新到瀏覽器輸出。有 些Apache的模塊,好比mod_gzip,可能本身進行輸出緩存,這將致使flush()函數產生的結果不會當即被髮送到客戶端瀏覽器。 而 IE瀏 覽器 只有當接受到的 4096個字節之後纔開始顯示該頁面,因此必須發送一些額外的空格來讓這些瀏覽器顯示頁面內容(緣由:Nginx有 fastcgi 緩衝區,數據超出緩衝區大小、或程序執行完,纔會將內容輸出到客戶端: fastcgi_buffer_size 4k; )。正確使用 倆者的順序是. 先ob_flush, 而後flush,固然, 在其餘sapi下, 不調用flush也能夠, 只不過爲了保證你代碼的可移植性, 建 議配套使用.」
所以,在遠程WIN 2003 SERVER服務器上,須要保證每次輸出前加入如下語句:
echo str_repeat(" ",4096); //確保足夠的字符,當即輸出
重複空格的語句在 Linux 服務器下,是不須要的。可是請注意,Linux服務器下,apache會自動開啓 gzip壓縮的,而gzip壓縮會使 flush() 失效。因此對於 Linux服務器,咱們須要關閉 gzip 壓縮模式,方法以下: 在當前目錄裏的 .htaccess 文件裏 加入 這個語句:
SetEnv no-gzip dont-vary 重啓APACHE便可。另外,爲了避免在每次 echo 後加 ob_flush(); 和 flush(); ,咱們能夠在文件的開頭部分加入 ob_implicit_flush(1); 便可。最終的寫法以下,兼容IE/firefox:瀏覽器
<?php ob_start(); //打開輸出緩衝區 ob_end_flush(); ob_implicit_flush(1); //當即輸出for($i=0;$i<1000;$i++){ echo str_repeat(" ",4096); //確保足夠的字符,當即輸出,Linux服務器能夠去掉這個語句 echo $i."<br>"; sleep(1); } ?> ob_start(); //打開輸出緩衝區 ob_end_flush(); ob_implicit_flush(1); //當即輸出for($i=0;$i<1000;$i++){ echo str_repeat(" ",4096); //確保足夠的字符,當即輸出,Linux服務器能夠去掉這個語句 echo $i."<br>"; sleep(1); } ?>