在使用PHP時,大家都聽過緩沖區這個概念,指的是服務器在執行PHP腳本時為了提高運行效率而采用的一種緩存機制。緩沖區將腳本對頁面的輸出內容存儲在緩存中,當所有腳本也全部運行完之后,將所有的緩存一次性輸出到瀏覽器。雖然緩沖區的存在確實可以提高服務器執行PHP腳本的性能,但是在某些情況下關閉這個功能也是非常必要的。
有時候,我們會發現PHP腳本無法輸出內容到頁面,這不一定是代碼的問題,而有可能是緩沖區沒有被關閉導致的。例如:
<?php header("Content-type:text/html;charset=utf-8"); $a= 10; echo $a; sleep(3); //模仿耗時操作 $b= 20; echo $b; ?>
上面的腳本按理說應該先輸出 10 再過 3 秒鐘之后輸出 20,但是事實上它們都會在 3 秒鐘之后一起輸出到頁面上。這是因為開啟了緩存區,緩存了腳本運行過程中的輸出內容,并等到腳本全部運行完畢之后才將全部的結果一起輸出到頁面。這就是為什么兩個 echo 輸出語句之間加上了 sleep 也不起到阻塞的作用的原因。
其實我們只需要關閉此功能即可得到符合預期的效果,關閉方法如下:
<?php header("Content-type:text/html;charset=utf-8"); ob_start(); //開啟緩存 $a= 10; echo $a; ob_end_clean(); //關閉緩存 sleep(3); //模仿耗時操作 $b= 20; echo $b; ?>
開啟緩存的方法是 ob_start(),等到腳本運行完畢之后關閉緩存的方法則是 ob_end_clean()。這樣,就可以保證 PHP 腳本的所有結果都會實時輸出。
需要注意的是,如果要關閉緩沖區,必須在開啟輸出之前調用 ob_start() 函數。如果你在開啟了輸出之后再調用 ob_start() 函數,則會導致腳本拋出錯誤信息。
PHP 緩存機制是為了提高程序的運行速度而設計的,對于簡單的腳本而言,它確實可以提高性能,但是在某些特定情況下,緩存機制可能會帶來麻煩。比如在需要實時輸出內容的腳本中,關閉緩存器就是非常必要的。