在php中,當執行echo,print的時候,輸出並沒有馬上通過tcp傳給client瀏覽器顯示, 而是將資料寫入php buffer。php output_buffering機制,意味在tcp buffer之前,建立了一新的佇列,資料必須經過該佇列。當乙個php buffer寫滿的時候,指令碼程序會將php buffer中的輸出資料交給系統核心交由tcp傳給瀏覽器顯示。所以,資料會依次寫到這幾個地方echo/pring -> php buffer -> tcp buffer -> browser
在php中與重新整理緩衝相關的函式有三個:
1). flush
重新整理php程式的緩衝,而不論php執行在何種情況下。該函式將當前為止程式的全部輸出傳送到使用者的瀏覽器。 可是該函式不會對server或client瀏覽器的快取模式產生不論什麼影響,也不會對php本身的快取產生不論什麼影響。
2).ob_flush
該函式對php本身的的快取進行輸出。php本身的快取受php.ini中的output_buffering的控制。ob_flush()的作用就是將本來存在輸出快取中的內容取出來,設定為等待輸出狀態,但不會直接傳送到client,這時你就須要先使用ob_flush()再使用flush(),client才幹馬上獲得指令碼的輸出。
與php本身輸出緩衝相關的兩個php配置是:
引數1:output_buffering:on/off 或 者整數 。設定為on時,將在全部指令碼中使用輸出快取控制,不限制快取的大小。而設定為整數時,如output_buffering=4096,當快取數 據達到4096位元組時會自己主動輸出重新整理快取。而這個引數的不同正是導致以上**在不同一時候候執行結果不同的原因。當output_buffering關閉時, 指令碼全部的輸出(echo)都會即時傳送到client,執行上面**時就是每秒輸出乙個數字。而開啟output_buffering後,輸出內容就會先快取 在服務端,直到指令碼結束時才一起傳送給client。
引數2:implicit_flush:on/off。設定on意味著,當指令碼有輸出時,自己主動馬上發送到client。相當於在echo後自己主動加flush()。
3).ob_implicit_flush
這個函式強制每當有輸出的時候,即刻把輸出傳送到瀏覽器。這樣就不須要每次輸出(echo)後,都用flush()來傳送到瀏覽器了。
樣例<?php
ob_end_clean();
echo str_pad(" ", 256);
for ($i=100; $i>0; $i--)
?>
以上**應該隔一秒鐘輸出一次$i.
以上echo str_pad(" ", 256)的目的是ie須要接受到256個位元組之後才開始顯示。 以上**還有下面兩種寫法。
<?php
echo str_pad(" ", 256);
for ($i=100; $i>0; $i--)
?>
view plain
<?php
ob_implicit_flush(true);
echo str_pad(" ", 256);
for ($i=100; $i>0; $i--)
?>
另外我們還須要注意重新整理緩衝不光受以上幾方面的影響,還受下面影響:
1). 個別webserver程式,特別是win32下的webserver程式,在傳送結果到瀏覽器之前,仍然會快取指令碼的輸出,直到程式結束為止。有些apache的模組,比方mod_gzip,可能自己進行輸出快取,這將導致flush()函 數產生的結果不會馬上被傳送到client瀏覽器。甚至瀏覽器也會在顯示之前,快取接收到的內容。比如 netscape 瀏覽器會在接受到換行或 html 標記的開頭之前快取內容,而且在接受到 標記之前,不會顯示出整個**。一些版本號的 microsoft internet explorer 僅僅有當接受到的256個位元組以後才開始顯示該頁面,所以必須傳送一些額外的空格來讓這些瀏覽器顯示頁面內容。
以下是非常easy的一段**
<?php
/*--------------------編寫自己的快取類---------------*/
class my_cache
//快取開始
function cache_start()
//開啟快取
ob_start();
}//推斷快取檔案是否存在而且可用
function cache_active()else
}
} //進行快取資料夾的生成
function cache_creat()
}}
//快取的輸出
function cache_end()
//快取的清除
function cache_clean()else
}//定義快取檔案的提醒函式
function alert($a)
}?>
測試頁面test.php
<?
include 'cache_my_class.php';
$my_cache=new my_cache("./chunge/ge/hao/index.html",5);
$my_cache->cache_start(); //在頁面的最開始
-------頁面輸出
$like="我愛吃橘子香蕉!";
echo $like."
";$my_cache->cache_end();//最後進行輸出
PHP中重新整理輸出緩衝
buffer是乙個記憶體位址空間,linux系統預設大小一般為4096 1kb 即乙個記憶體頁。主要用於儲存速度不同步的裝置或者優先順序不同的 裝置之間傳辦理資料的區域。通過buffer,可以使程序這間的相互等待變少。這裡說乙個通俗一點的例子,你開啟文字編輯器編輯乙個檔案的時候,你每輸入 乙個字元,...
PHP中重新整理輸出緩衝
php中重新整理輸出緩衝 buffer是乙個記憶體位址空間,linux系統預設大小一般為4096 1kb 即乙個記憶體頁。主要用於儲存速度不同步的裝置或者優先順序不同的 裝置之間傳辦理資料的區域。通過buffer,可以使程序這間的相互等待變少。這裡說乙個通俗一點的例子,你開啟文字編輯器編輯乙個檔案的...
PHP中重新整理輸出緩衝詳解
buffer是乙個記憶體位址空間,linux系統預設大小一般為4096 1kb 即乙個記憶體頁。主要用於儲存速度不同步的裝置或者優先順序不同的裝置之間傳辦理資料的區域。通過buffer,可以使程序這間的相互等待變少。這裡說乙個通俗一點的例子,你開啟文字編輯器編輯乙個檔案的時候,你每輸入 乙個字元,作...