Php 会话_start()在发送输出后工作

Php 会话_start()在发送输出后工作,php,session,Php,Session,我只是注意到一些奇怪的事情。我认为,正如PHP的手册所说,在将任何输出发送到浏览器之前,必须调用session_start(): 要使用基于cookie的会话,必须在将任何内容输出到浏览器之前调用会话启动() 出于好奇,我创建了两个脚本。一个是write.php: <?php echo 'foo'; session_start(); $_SESSION['bar'] = 'baz'; ?> <?php echo 'foo'; session_start(); var_du

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

要使用基于cookie的会话,必须在将任何内容输出到浏览器之前调用会话启动()

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

<?php
echo 'foo';

session_start();
$_SESSION['bar'] = 'baz';
?>
<?php
echo 'foo';

session_start();
var_dump($_SESSION['bar']);
?>

另一个是read.php

<?php
echo 'foo';

session_start();
$_SESSION['bar'] = 'baz';
?>
<?php
echo 'foo';

session_start();
var_dump($_SESSION['bar']);
?>

令人惊讶的是,即使在
echo
ingfoo之后,会话也会被写入和读取

但是,如果在
echo
s之后添加对
flush()
的调用,Apache的错误日志会报告:

[Tue Jan 03 11:57:21 2012][error][client 127.0.0.1]PHP警告:会话_start():无法发送会话缓存限制器-第5行的/var/www/sessions/write.PHP中已发送头 [Tue Jan 03 11:57:21 2012][error][client 127.0.0.1]PHP堆栈跟踪: [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/sessions/write.php:5


所以,我的问题是:为什么在
echo
ing了一些东西之后会话写得正确?它不是立即发送到浏览器吗?如果是这样的话,这是否意味着只要我以前不调用
flush()
,我就可以在任何地方启动会话?

会话中的这个错误\u start()并不意味着您还没有任何打开的会话。此方法正在尝试创建新的会话ID,但您已经有了一个会话ID。在运行这些脚本之前,请尝试删除所有cookie

要使用基于cookie的会话,必须在 将任何内容输出到浏览器

没错。服务器端cookie设置(与JavaScript cookie设置不同)通过发送HTTP头工作。HTTP头放在实际文档之前:一旦开始发送文档,就没有地方再放更多的头了

在您的情况下,会发生以下情况:

echo 'foo';
。。。实际上不会将输出发送到浏览器。相反,它将一些输出添加到稍后发送的队列中。PHP解释器配置为在特定事件发生(可能是脚本结束或队列达到特定大小)之前保持此输出


该指令很可能是嫌疑犯。

我怀疑了。我删除了
PHPSESSID
,然后再次运行脚本,同样的事情发生了:如果我在
echo
s之后添加
flush()
,read.php会显示NULL,如果我没有,它按预期显示baz。您必须在php设置中启用EXUT缓冲
输出缓冲设置为
4096
隐式刷新设置为
关闭
。因此,为了使我的脚本不再工作,即使不必调用
flush()
,我应该启用
隐式\u flush
,并将
输出缓冲设置为
0
,对吗?