溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php中setcookie報(bào)錯(cuò)的解決方法

發(fā)布時(shí)間:2021-07-09 10:17:28 來源:億速云 閱讀:173 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“php中setcookie報(bào)錯(cuò)的解決方法”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“php中setcookie報(bào)錯(cuò)的解決方法”這篇文章吧。

php setcookie報(bào)錯(cuò)是因?yàn)閟etcookie()之前有輸出,其解決辦法就是將輸出的echo的數(shù)據(jù)和header頭的cookie一起發(fā)出去即可。

本文操作環(huán)境:windows7系統(tǒng)、PHP7.1版,DELL G3電腦

php setcookie 報(bào)錯(cuò)怎么辦?

PHP setcookie()之前不能有任何輸出

PHP的setcookie函數(shù),手冊(cè)里是這么寫的:

setcookie() defines a cookie to be sent along with the rest of the HTTP headers. Like other headers, cookies must be sent before any output from your script (this is a protocol restriction). This requires that you place calls to this function prior to any output, including <html> and <head> tags as well as any whitespace.

大致意思是在setcookie之前不能有東西輸出到客戶端瀏覽器,否則會(huì)報(bào)錯(cuò)。但是經(jīng)測(cè)試發(fā)現(xiàn),并沒有報(bào)錯(cuò)。繼續(xù)翻看手冊(cè):

You can use output buffering to send output prior to the call of this function, with the overhead of all of your output to the browser being buffered in the server until you send it. You can do this by calling ob_start() and ob_end_flush() in your script, or setting the output_buffering configuration directive on in your php.ini or server configuration files.

于是我修改了php.ini(PHP版本5.4)的output_buffering為0,即關(guān)閉緩沖區(qū)。(PHP5.3版本以下是關(guān)閉的,5.3之后是默認(rèn)開啟,值為4096)

意思是如果在輸出cookie之前,設(shè)置了ob_start和ob_end_flush來輸出緩沖區(qū),則不會(huì)報(bào)錯(cuò)。那么,為什么cookie和緩沖區(qū)的數(shù)據(jù)一起返回就沒有報(bào)錯(cuò)呢?應(yīng)該是因?yàn)椋壕彌_區(qū)的數(shù)據(jù)將整理成一個(gè)完整的HTTP包發(fā)出去。

我們可以看一下報(bào)錯(cuò)信息:

echo "i am going to setcookie";
 
var_dump(setcookie('buhehe', 'asdasdasdasdad'));
 
print_r($_COOKIE);

php中setcookie報(bào)錯(cuò)的解決方法

“請(qǐng)不要修改header信息,因?yàn)閔eader已經(jīng)發(fā)送過了?!焙苊黠@,沒有使用緩沖區(qū)輸出,則header先一步返回到瀏覽器了,然后再進(jìn)行setcookie發(fā)送header頭信息的時(shí)候,就報(bào)錯(cuò)啦——不符合HTTP協(xié)議的規(guī)范。因?yàn)镠TTP協(xié)議規(guī)定header應(yīng)該在body之前輸出。

我把代碼修改了一下,把將輸出的echo的數(shù)據(jù)和header頭的cookie一起發(fā)出去。

ob_start();
echo "i am going to setcookie";
 
var_dump(setcookie('buhehe', 'asdasdasdasdad'));
 
ob_end_flush();
 
print_r($_COOKIE);

結(jié)果如下:

php中setcookie報(bào)錯(cuò)的解決方法

當(dāng)你設(shè)置output_buffering為0也就是在php.ini關(guān)閉緩沖區(qū)的時(shí)候,就需要手動(dòng)ob_start來開啟緩沖區(qū)了。

為什么有些開發(fā)者測(cè)試的時(shí)候,發(fā)現(xiàn)setcookie之前echo了信息也沒有報(bào)錯(cuò)呢?

因?yàn)楫?dāng)前大部分的PHP應(yīng)用都是5.3+ 的,有些甚至用上了7。PHP5.3+版本中,因?yàn)槟J(rèn)開啟了緩沖區(qū),并且默認(rèn)size為4096,所以在setcookie之前echo的數(shù)據(jù),以及cookie的header頭信息,都會(huì)在緩沖區(qū)被封裝成HTTP包,發(fā)給客戶端啦~所以也就不會(huì)產(chǎn)生上圖中的報(bào)錯(cuò)信息(請(qǐng)勿修改HTTP的header頭信息)啦~~

以上是“php中setcookie報(bào)錯(cuò)的解決方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI