php中setcookie報錯的解決方法

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

創(chuàng)新互聯(lián)主要為客戶提供服務項目涵蓋了網(wǎng)頁視覺設計、VI標志設計、營銷網(wǎng)站、網(wǎng)站程序開發(fā)、HTML5響應式網(wǎng)站建設、成都做手機網(wǎng)站、微商城、網(wǎng)站托管及網(wǎng)站維護、WEB系統(tǒng)開發(fā)、域名注冊、國內(nèi)外服務器租用、視頻、平面設計、SEO優(yōu)化排名。設計、前端、后端三個建站步驟的完善服務體系。一人跟蹤測試的建站服務標準。已經(jīng)為成都人造霧行業(yè)客戶提供了網(wǎng)站營銷推廣服務。

php setcookie報錯是因為setcookie()之前有輸出,其解決辦法就是將輸出的echo的數(shù)據(jù)和header頭的cookie一起發(fā)出去即可。

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

php setcookie 報錯怎么辦?

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

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

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之前不能有東西輸出到客戶端瀏覽器,否則會報錯。但是經(jīng)測試發(fā)現(xiàn),并沒有報錯。繼續(xù)翻看手冊:

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,即關閉緩沖區(qū)。(PHP5.3版本以下是關閉的,5.3之后是默認開啟,值為4096)

意思是如果在輸出cookie之前,設置了ob_start和ob_end_flush來輸出緩沖區(qū),則不會報錯。那么,為什么cookie和緩沖區(qū)的數(shù)據(jù)一起返回就沒有報錯呢?應該是因為:緩沖區(qū)的數(shù)據(jù)將整理成一個完整的HTTP包發(fā)出去。

我們可以看一下報錯信息:

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

php中setcookie報錯的解決方法

“請不要修改header信息,因為header已經(jīng)發(fā)送過了。”很明顯,沒有使用緩沖區(qū)輸出,則header先一步返回到瀏覽器了,然后再進行setcookie發(fā)送header頭信息的時候,就報錯啦——不符合HTTP協(xié)議的規(guī)范。因為HTTP協(xié)議規(guī)定header應該在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);

結果如下:

php中setcookie報錯的解決方法

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

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

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

以上是“php中setcookie報錯的解決方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站題目:php中setcookie報錯的解決方法
網(wǎng)站鏈接:http://muchs.cn/article36/isjssg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)站收錄、網(wǎng)站策劃、App設計、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名