免排查代码 完美解决 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()放在任何的输出前吧!

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