【发布时间】:2012-01-03 19:09:37
【问题描述】:
我刚刚注意到一些奇怪的事情。我认为,正如 PHP 手册所说,必须在将任何输出发送到浏览器之前调用 session_start():
要使用基于 cookie 的会话,必须在向浏览器输出任何内容之前调用 session_start()。
所以,出于好奇,我创建了两个脚本。一种是write.php:
<?php
echo 'foo';
session_start();
$_SESSION['bar'] = 'baz';
?>
另外一个是read.php:
<?php
echo 'foo';
session_start();
var_dump($_SESSION['bar']);
?>
令人惊讶的是,即使在 echoing foo 之后,会话也会被写入和读取。
但是,如果我在echos 之后添加对flush() 的调用,Apache 的错误日志报告:
[2012 年 1 月 3 日星期二 11:57:21] [错误] [客户端 127.0.0.1] PHP 警告:session_start():无法发送会话缓存限制器 - 标头已在 /var/www/sessions/write.php 中发送在第 5 行 [2012 年 1 月 3 日星期二 11:57:21] [错误] [客户端 127.0.0.1] PHP 堆栈跟踪: [2012 年 1 月 3 日星期二 11:57:21] [错误] [客户端 127.0.0.1] PHP 1. {main}() /var/www/sessions/write.php:0 [2012 年 1 月 3 日星期二 11:57:21] [错误] [客户端 127.0.0.1] PHP 2. session_start() /var/www/sessions/write.php:5
所以,我的问题是:为什么会话在echoing 之后写入正确?不是立即发送到浏览器吗?如果是这样,这是否意味着我可以在任何地方开始会话,只要我之前不调用flush()?
【问题讨论】: