session_start()在输出发送后有效

Ale*_*tis 3 php session

我刚注意到一些奇怪的事情 我认为,正如PHP的手册所说,session_start()必须在将任何输出发送到浏览器之前调用它:

要使用基于cookie的会话,必须在向浏览器输出任何内容之前调用session_start().

所以,出于好奇,我创建了两个脚本.一个是write.php:

<?php
echo 'foo';

session_start();
$_SESSION['bar'] = 'baz';
?>
Run Code Online (Sandbox Code Playgroud)

另一个是read.php:

<?php
echo 'foo';

session_start();
var_dump($_SESSION['bar']);
?>
Run Code Online (Sandbox Code Playgroud)

令人奇怪的是,该会议被写,甚至后读取echo荷兰国际集团FOO.

但是,如果我flush()echos 之后添加一个调用,Apache的错误日志会报告:

[Tue Jan 03 11:57:21 2012] [错误] [client 127.0.0.1] PHP警告:session_start():无法发送会话缓存限制器 - 已在第5行/var/www/sessions/write.php中发送的标头[Tue Jan 03 11:57:21 2012] [错误] [client 127.0.0.1] PHP Stack trace:[Tue Jan 03 11:57:21 2012] [error] [client 127.0.0.1] PHP 1. {main} ()/var/www/sessions/write.php:0 [Tue Jan 03 11:57:21 2012] [error] [client 127.0.0.1] PHP 2. session_start()/ var/www/session/write.php :5

所以,我的问题是:为什么会话结束后会话正确echo?是不是立即发送到浏览器?而且,如果是这样,这是否意味着我可以在任何地方开始会议,只要我flush()以前不打电话?

Álv*_*lez 7

要使用基于cookie的会话,必须在向浏览器输出任何内容之前调用session_start().

确实如此.服务器端的cookie设置(与JavaScript cookie设置不同)通过发送HTTP头来工作.HTTP标头位于实际文档之前:一旦开始发送文档,就没有其他标题的位置.

在你的情况下,发生的是这一行:

echo 'foo';
Run Code Online (Sandbox Code Playgroud)

...实际上并没有将输出发送到浏览器.相反,它会将一些输出添加到稍后将发送的队列中.PHP解释器配置为保持此输出,直到发生某些事件(可能是脚本结束或队列达到特定大小).

output_buffering指令是可能的犯罪嫌疑人.