一直只知道不能有輸出,具體理由還不知道。今天明白了。
由於 目前對 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 乙個是 程式)
這段**如果沒有flush (重新整理程式快取) 那麼會等待50秒後才顯示 0 - 49for($i = 0; $i < 3; $i++)
因為迴圈沒有結束時會把所有的 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...