免排查代碼 完美解決 Cannot send session cookie – headers already sent by .. SESSION新手問題

不需要排查代碼解決session_start前面不允許輸出的問題

引入

近日閒來無事,用原生寫了一個小項目,沒想到平時用管框架,到了php原生連一個session的調用發起都存在編寫細節問題。
調用session_start()時拋出了Cannot send session cookie – headers already sent 的錯誤

尋找解決方案

在網上搜搜搜了一大堆,都是老生常談的在session_start()前不能有任何輸出。
無奈我在session_start()前寫了很多東西,也懶得查有沒有輸出啥的了。
有沒有一種不用排查代碼的並且不觸發錯誤的永久解決方案呢?

修改php配置,終極解決方案

無意想起了在php中的ob(output buffer 輸出緩衝區)。
這玩意兒可以把php輸出流在達到輸出要求前把內容先緩存起來,湊足了再發送。一時半會也說不清楚,詳情請看深入理解php ob
反正他是負責將header等部分緩存到一定量再發送的一個機制,那我們可以不可以將session_start前要發送的內容,等到session_start調用後再發送呢?
答案是肯定的,只需要我們將php輸出緩衝區的容量在php.ini裏調大點就行了

1️⃣在php.ini中
找到output_buffering一行,改成下列內容
output_buffering = 1
2️⃣reload php即可

這樣,我們就只需要改一個配置,就解決了session_start前面不能放東西的問題啦。你可以看到,這個解決方案完全不需要你自己覈查代碼,或者將結構重新改一次,同時也符合執行規範。

筆者注

修改緩衝區大小爲無限(1),在筆者的小型項目中並沒有遇到不妥。筆者不承擔使用此方案在生產環境下的後果!如果你打定心思要嚴謹地擼代碼,還是把session_start()放在任何的輸出前吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章