测试 php 序列化后设置 cookie 返回 false 时报错:php Warning: Cannot modify header information - headers already sent by...

网上找到了原因:在修改 header 信息之前存在输出内容。这与之前碰到过的 ob_start('ob_gzhandler'); 执行错误 和 header("Content-type: image/png"); 显示图片出错 属于同一问题,都是在 php 后台脚本中不该输出内容的时候,输出了内容。

在当前这个案例里,是在 setcookie() 之前存在 echo xx 内容输出:

setcookie() 定义了 Cookie,会和剩下的 HTTP 头一起发送给客户端。 和其他 HTTP 头一样,必须在脚本产生任意输出之前发送 Cookie(由于协议的限制)。 请在产生任何输出之前(包括 和 或者空格)调用本函数。

要在调用本函数前输出内容,可以使用输出缓冲:让输出的内容在服务器里缓冲起来, 直至真正发送给浏览器。 可在脚本里调用 ob_start() 和 ob_end_flush(), 或设置 output_buffering php.ini 或服务器配置文件里的配置指令。 —— 注释

—— setcookie - php.net

测试是想输出 cookie 变量设置前的值,方便与之后取出的 cookie 变量值做对比。所以不能直接去掉输出,解决方法:使用 ob_* 方法包裹存在输出的部分,输出内容到缓存区,最后再统一输出。

ob_start();
...
ob_end_flush()