无法发送会话cookie - 标头已经发送

3

可能重复:
PHP已发送标头

以下是我 PHP 代码的简单示例,希望(如此)它是不言自明的。 我尝试更新会话变量。但脚本的输出如下所示:

警告:session_start() [function.session-start]:无法发送会话 cookie - 已通过(输出开始于/Library/WebServer/Documents/facebook/test.php:8)在/Library/WebServer/Documents/facebook/test.php中的第11行

这个警告当然是由第8和9行的 echo 语句引起的。是否有任何简单的解决方案来停止这个警告。

感谢任何指点,Andrej

<?php
session_start();
$_SESSION['percent'] = 0;
$iterations = 50;

for ($i = 0; $i <= iterations; $i++) {
  $percent = ($i / $iterations) * 100;
  echo "Hello World!";
  echo "<br />";
  // update session variable
  session_start();
  $_SESSION['percent'] = number_format($percent, 0, '', '');
  session_commit();
}
?>

对我有效的唯一解决方案(即更新会话变量)是:

<?php
ob_start();
session_start();
$_SESSION['percent'] = 0;
$iterations = 50;

for ($i = 0; $i <= 50; $i++) {
  $percent = ($i / $iterations) * 100;
  echo "Hello World!";
  echo "<br />";
  // update session variable
  session_start();
  $_SESSION['percent'] = number_format($percent, 0, '', '');
  session_commit();
}
ob_flush();
?>

它很丑,但它首先缓冲输出...

5个回答

4

将session_start()从for循环中移除。

将session_commit()放在整个for循环的外部,即最后一行。

这两个函数应该在脚本中只被调用一次。


1
虽然如此,您正在覆盖相同的会话变量。您实际上想要做什么? - James
请重现以下内容(参见process.php文件):http://q2interactive.net/view/how-to-build-an-ajax-progress-bar-with-jquery-and-php.html - Andrej
啊,那就是我的猜测。如果你想要复现它,那就去掉 echo 语句。 - James
session_start()需要发送HTTP头来发送cookie。如果已经发送了任何其他内容,它就无法执行此操作。因此,您的唯一两个选择是:1)删除echo语句或2)使用输出缓冲,正如您所指出的那样。 - James
我的代码的想法是打印数组的元素(不包括上面的示例)并使用进度条显示进度。 - Andrej
如果您一定要在进行操作时打印输出,那么您不能使用PHP会话。可以考虑将进度变量存储在其他地方,比如数据库、公共内存缓存或文件中。尽管如果需要进度条才能打印输出,那么这必须是一个非常大的数组,您确定这种方法是否正确吗? - James

2

2

如果在session-start()语句之前没有任何先前的输出,则尝试将.php文件重新保存为ANSI文件或UTF-8无BOM文件。 这是因为有些情况下,编辑器本身会将某些内容作为文件的输出。

这对我有用。


1

你只需要执行一次session_start()函数,所以在循环内部只需删除一个。

此外,在大多数情况下,你不需要手动执行session_commit(),PHP会自动处理。


1
正如其他人所说,错误的原因是你使用了第二个session_start()。然而,实际上它抛出错误的原因是因为在已经发送输出之后你试图设置一个头部。由于session_start()函数设置了会话cookie,它尝试设置cookie头部,这是在你已经输出内容之后进行的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接