程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> header與緩沖區之間的深層次分析

header與緩沖區之間的深層次分析

編輯:PHP綜合

測試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有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved