header 之前有輸入會導致錯誤的原因

2021-06-09 13:02:37 字數 2142 閱讀 5525

一直只知道不能有輸出,具體理由還不知道。今天明白了。

由於 目前對 http 協議不是很清楚,所以不能具體說明。

例子:test.php

echo 'test';

header('content-type:text/html;charset=utf-8');

上面的** 在 php.ini 中

output_buffering=off 的時候會導致乙個錯誤(關閉php預設快取)

test.php 在執行的時候由於php快取被關閉,所以他直接先把 test 輸出 然後在去修改 頭資訊。

http協議有2個部分,乙個是頭資訊部分和主題(body)部分,應該要先將頭資訊輸出後在輸出主題

由於在**中 header不再第一行,因此 在訪問 test.php 的時候 已經把頭資訊給輸出掉了。

然後輸出 test 之後在試圖修改 頭資訊 此時已經無法修改頭資訊了 因此我們能看到這樣一段錯誤

warning: cannot modify header information - headers already sent by (output started at d:\phpnow-1.5.6\htdocs\test.php:2) in d:\phpnow-1.5.6\htdocs\test.php on line 4
大概意思是在說 頭資訊無法修改。

下面抓包的圖

頭資訊 content-type 為 text/html; 因為**的第一行不是 header 解釋時可能是認為沒有對頭資訊進行修改 所以直接先輸出了預設的頭資訊

在看下面的圖

正文部分 輸出了 11 之後 才發現 有一段 header ** 試圖修改了頭資訊,因為 頭資訊已經輸出掉了 所以無法進行修改。

這只是乙個警告非錯誤。

如果在php關閉了預設快取的情況下 讓上面的**不發生錯誤 可以使用 php 快取函式

ob_start();

echo 'test';

header('content-type:text/html;charset=utf-8');

echo 'tests';

ob_start 開啟環迅,將頁面的所有輸出都丟到緩衝區。

此時 因為頁面的輸出會儲存到緩衝區中 所以在執行 header 之前是沒有任何輸出。

那麼在什麼時候才會把緩衝區的內容釋放出來呢? 應該是 4096 位元組滿了就會釋放(這個好像可以修改)

要麼手動釋放。 如何判斷他們是在緩衝區而沒有輸出?

$str = ob_get_contents();
他能返回緩衝區的內容,可以把這個內容寫入到乙個檔案中進行檢視。

順便將常見的 快取函式列出來

ob_clean -- > 清空緩衝區

ob_end_clen()  --> 關閉緩衝同時清空緩衝區

ob_end_flush()  --> 關閉快取並輸出緩衝區的內容

ob_flush()   --> 輸出緩衝區的內容 並清空緩衝區

flush();  --> 重新整理程式快取( 他是程式快取,不是 ob快取,php有2個快取,乙個是ob 乙個是 程式)

for($i = 0; $i < 3; $i++)
這段**如果沒有flush (重新整理程式快取) 那麼會等待50秒後才顯示 0 - 49 

因為迴圈沒有結束時會把所有的 echo 都丟到 程式快取中,當迴圈結束後 才會重新整理程式快取 把 0 - 49 一口氣顯示

但是現在每等待1秒中就重新整理了程式快取 所以 按道理 應該每過一秒就得看到乙個數字被列印才對,但是使用看不到 還是和原來一樣。

其實這不是 flush的問題,他確實重新整理了程式快取,只不過(如果你用的是ie) 瀏覽器也有自己的快取,當頁面輸出的內容少於  256個位元組時

是不會顯示到文件中,這段**稍微修改

for($i = 0; $i < 3; $i++)
在輸出 $i 之前 先列印 256個空字元 之後在輸出 $i 則能看到效果。

郵件常用Header

使用php的mail函式做郵件傳送的例子 mail nobody example.com the subject message,from webmaster r n reply to webmaster r n x mailer php phpversion 更詳細的郵件頭資訊說明 reading...

header函式詳解

php 3,php 4,php 5 header 傳送乙個原始 http 標頭 可選引數 replace 指明是替換掉前一條類似的標頭還是增加一條相同型別的標頭。預設為替換,但如果將其設為false則可以強制傳送多個同類標頭。例如 header www authenticate negotiate ...

測試介面 header

header 是傳送請求時攜帶的頭部資訊,header 分為response header 和 request header request headers accept 接受響應的內部 accept encoding 可接受響應的編碼方式 accept language 可接受響應的語言列表 co...