PHP輸出緩衝與header傳送問題詳解
如果你在header或cookie函式前傳送大量字元到瀏覽器,就會報headers already sent&nbwww.cppcns.comsp; 錯誤,以下為說明:
headers_sent()
此函式告訴我們傳送header的狀態。如果將輸出傳送到瀏覽器,則不應使用重定向等header函式。為避免此類錯誤,我們可以使用headers_sent()函式檢查header傳送狀態。它根據標頭的狀態返回TRUE或FALSE。當我們執行一個php指令碼時,將輸出儲存到緩衝區中,然後再將其傳送到瀏覽器。但是,這還取決於您的伺服器php.ini設定,其中必Vtoea須開啟或關閉輸出緩衝區。
output_buffering = Off
現在,由於關閉了輸出緩衝,因此所有輸出都將傳送到瀏覽器。讓我們通過一個例子來學習。
<?Php echo 'Hello p2hp.com'; echo "<br><br>"; if (!headers_sent()) { echo " 沒有header傳送,你可以進行傳送header或cookie "; }else{ echo " Header已經發送,你不能再發送header或cookie了 "; } ?>
以上程式碼的輸出將取決於你的php.ini設定。對於我們來說,我們的php.ini預設是:
output_buffering 4096 4096
在上面的第一行程式碼中,我們將輸出傳送到瀏覽器,但是仍然得到header_sent()沒有傳送header,因為緩衝區尚未將輸出傳送到瀏覽器。所以我們將得到這樣的輸出
沒有header傳送,你可以進行傳送header或cookie
因此,要將輸出傳送到瀏覽器,我們必須耗盡輸http://www.cppcns.com出緩衝區的容量。這裡是4096。因此,我們將嘗試向瀏覽器傳送更多輸出以超出限制,然後檢查if條件以瞭解header傳送狀態。
<?php for ($i=1; $i<=372; $i++) { echo "p2hp.com - "; } echo "<br><http://www.cppcns.com;br>"; if (!headers_sent()) { // 沒有header傳送,你可Vtoea以進行傳送header或cookie // echo '沒有header傳送,你可以進行傳送header或cookie'; // header("HTTP/1.1 301 Moved Permanently"); // header ("Location: mynewpage1.html"); exit; } else { // Header已經發送,你不能再發送header或cookie了 // echo 'Header已經發送,你不能再發送header或cookie了'; header("Location: mynewpage1.html");// Warning: Cannot modify header information - headers already sent by xxxxx }
在上面的程式碼中,您可以通過增加或減少$ i值來調整for迴圈。迴圈數越高,意味著將有更多的資料釋出到緩衝區。嘗試通過增加$i的最大值來檢視headers_sent()在哪裡變為TRUE。
我們可以使用flush()強制將緩衝區輸出傳送到瀏覽器。但是,這取決於伺服器,並且可能會以不同的方式工作。
參考 https://www.plus2net.com/php_tutorial/headers_sent.php
總結
到此這篇關於PHP輸出緩衝與header傳送問題的文章就介紹到這了,更多相關PHP輸出緩衝header傳送內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!