1、簡介
當PHP指令碼有輸出時,輸出控制函數可以用這些來控制輸出。這在多種不同情況中非常有用,尤其是用來在指令碼開始輸出 資料後,發送http頭資訊到瀏覽器。輸出控制函數不影響由 header()或setcookie()發送的檔案頭資訊,僅影響像echo這樣的函數和PHP代碼塊間的資料。
2、作用
1)、如官方介紹說,為了避免在輸出檔案頭資訊如header()和setcookie()之前出現輸出而發生的錯誤。可以使用輸出緩衝函數。如下代碼
| 代碼如下 |
複製代碼 |
<?php ob_start(); //開啟緩衝控制函數 echo 'hello'; header('Location: http://www.111cn.net/'); ?>
|
2)、將輸出內容放入緩衝區,如需進行其他動作,如將輸出寫入快取檔案,可將緩衝區內容寫入快取檔案,然後輸出。
| 代碼如下 |
複製代碼 |
ob_start(); echo 'hello'; $file = ob_get_contents(); ob_end_clean(); write_cache($file); //將緩衝區內容寫入緩衝函數,實現細節省略
|
3)、擷取某些無傳回值內建函數的輸出內容,如phpinnfo();
| 代碼如下 |
複製代碼 |
<?php ob_start(); phpinfo(); $file = ob_get_contents(); //phpinfo()輸出內容 ob_end_clean(); ?>
|
4)、在使用架構的時候,我們會發現架構中會將輸出緩衝然後進行變數替換。最後輸出。
除了這些內容,我們還可以利用輸出緩衝進行錯誤處理,具體看代碼。我們可以將錯誤資訊擷取,以更加友好的方式輸出。
| 代碼如下 |
複製代碼 |
<?php function display_error() { if($errors = error_get_last()) { return var_export($errors , TRUE); } return FALSE; } $dis_error = 'display_error'; //$a = 3; ob_start( $dis_error ); echo $a;
|
附:ob_start()官方解釋:
bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
此函數將開啟輸出緩衝。當輸出緩衝啟用後,指令碼將不會輸出內容(除http標題外),相反需要輸出的內容被儲存在內部緩衝區中。
內部緩衝區的內容可以用 ob_get_contents() 函數複製到一個字串變數中。 想要輸出儲存在內部緩衝區中的內容,可以使用 ob_end_flush() 函數。另外, 使用 ob_end_clean() 函數會靜默丟棄掉緩衝區的內容。
output_callback
選擇性參數 output_callback 函數可以被指定。 此函數把一個字串當作參數並返回一個字串。 當輸出緩衝區被( ob_flush(), ob_clean() 或者相似的函數)沖刷(送出)或者被清洗的時候;或者在請求結束之際輸出緩衝區內容被沖刷到瀏覽器的時候該函數將會被調用。 當調用 output_callback 時,它將收到輸出緩衝區的內容作為參數 並預期返回一個新的輸出緩衝區作為結果,這個新返回的輸出緩衝區內容將被送到瀏覽器。 如果這個 output_callback 不是一個可以調用的函數,此函數 會返回 FALSE 。
如果回呼函數有兩個參數,第二個參數會由一個位域補充,該位域由 PHP_OUTPUT_HANDLER_START, PHP_OUTPUT_HANDLER_CONT 和 PHP_OUTPUT_HANDLER_END 組成。
如果 output_callback 返回 FALSE ,其原來的輸入 內容被直接送到瀏覽器。
這個參數 output_callback 可以通過直接給一個 NULL 值而避開。
ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() and ob_start() 不能從一個回呼函數中調用。 如果從回呼函數中調用了它們,產生的行為是不明確的。 如果想要刪除緩衝區的內容,從回呼函數中返回一個”" (Null 字元串)。 更不能從一個回呼函數中使用像print_r($expression, true) 或highlight_file($filename, true) 一樣的輸出緩衝函數。