測試header之前有輸出
<?php echo 'hello world!'; header('content-type: text/html;charset=utf-8;');
我經過測試時可以成功的,不會出現任何錯誤和警告。不知道你們是怎麼樣的?可是我想大多說都是沒有問題,如果出現了Cannot modify header information - headers already sent
這樣的警告,這是是說不能修改頭部信息,頭部信息已經發送。下來就了解一下為什麼會出現兩種不同結果?
緩沖區
做個比喻,就好比我們看電影時的緩存一樣。它不會之間立即給我們播放出來,而是先將一部分下載好的電影放到緩存裡面,再有緩存播放出來。我們編寫php代碼也是這個道理
php的緩存機制-output_buffering
php中的常用ob
函數
ob_start: 打開輸出緩沖區
ob_clean: 清空緩沖區
ob_get_contents: 返回緩沖區內容
ob_get_clean: 返回緩沖區內容,並清空
<?php ob_start(); echo 'hello world!'; echo ob_get_contents();//輸出hello world!hello world!
在php.ini配置文件中,修改緩沖區大小
一般在233行左右,默認是4096表示4096字節也就是4kB
下來將4096修改為5,重新運行這段代碼
<?php echo 'hello world!'; header('content-type: text/html;charset=utf-8;');
對於剛才測試不會出現警告或錯誤的現在卻出現了,錯誤就是:Cannot modify header information - headers already sent
header與緩沖區之間的分析
為什麼我們之前說header之前不能有輸出
對於header函數,它是像客戶端發送原始的http報頭,是聲明我們所寫網頁到底是什麼內容,所以一但這個聲明之前有內容就是錯誤的,是不符合http規則的
下來說說php中的header
在php中header是不經過緩沖區的,它會經過服務器直接輸出到客戶端
解釋之前的警告Cannot modify header information
當我們在header之前寫了一些輸出的話,它會先經過緩沖區。因此即便你寫的了前面,最終的輸出順序還是先header在echo
。
可是一但我們輸出的內容緩存區放不下,即之前的輸出'hello world!'
> 5個字節。就會直接輸出出來,也就是這樣先輸出'hello world'
再header(...),
這樣就違背了真實的header之前不能有輸出
總結
在實際當中,我們最好還是把header寫在頁面最前面。因為我們就不確定我們header之前的輸出內容是否緩沖區能放下。希望本文對大家學習php有所幫助。