2015-10-10

php session和cookie无法保存问题详解

某年某月的某一天,心血来潮将代码从公司转移到家用电脑上,从而引发的狂想。

不解如下:

  1. 同样的代码为什么登陆不进去

  2. 测试有session为什么第二页就丢失了

  3. 加盐运算太高,不同电脑响应时间差几秒

概括一句话就是:明明很简单的session为什么罢工了,明明很简单的运算怎么会这么卡。

于是乎,我想到了,难道上天不希望我今天加班,我偷懒之后就不会有这样的问题吧。

然并卵。。。

我需要处理它。

原因分析:

  1. 分析程序逻辑

  2. 更换电脑【-=-】

  3. 更改cookie设置

  4. 更改session设置

  5. 更改框架设置

  6. chrome查看访问情况

  7. chrome查看cookie情况

  8. 查看自定义日志

  9. 查看系统日志

  10. 查看apache日志

  11. 批量去掉bom头

终于,7,9带我成长带我飞。

解决方案:

日志里有,出现:Warning: Cannot send session cookie – headers already sent…”或者“Cannot add header information – headers already sent…”

只需对php.ini中的output_buffering进行设置,默认值为no,修改为1即可。

其他方案仅供参考:

  1. 去掉bom头

  2. 设置php中session属性,如session.cookie_httponly,session.cookie_lifetime,session.gc_maxlifetime,session.use_only_cookies

ps: 默认情况下,php buffer是开启的,而且该buffer默认值是4096,即4kb。你可以通过在php.ini配置文件中找到output_buffering配置.当echo,print等输出用户数据的时候,输出数据都会写入到php output_buffering中,直到output_buffering写满,会将这些数据通过tcp传送给浏览器显示。你也可以通过ob_start()手动激活php output_buffering机制,使得即便输出超过了4kb数据,也不真的把数据交给tcp传给浏览器,因为ob_start()将php buffer空间设置到了足够大。只有直到脚本结束,或者调用ob_end_flush函数,才会把数据发送给客户端浏览器。

收工。