【发布时间】:2012-09-01 04:00:55
【问题描述】:
如何在 PHP 中重新打开会话而不收到标头已发送警告?
设置完所有我喜欢设置的会话变量后,我用session_write_close() 关闭会话。我这样做是因为只要会话打开,同一个客户端可能只有一个活动连接。但我喜欢有多个并行的。
但是,如果我想稍后设置另一个会话变量,我需要再次使用 session_start() 重新打开会话。这可行,但由于我已经将代码发送到客户端,它会打印“标头已发送”警告。为什么它试图再次设置cookie? cookie 已经设置好了。我唯一需要做的就是重新获得在服务器上写入会话文件的权限。
好吧,我可以压制他们。但是有没有办法重新打开一个会话,它已经用 session_write_close 关闭而不重新发送 Cookie-header?第一个 session_start() 已经正确发送了 Cookie-header。所以第二个只需要让我重新访问存储在 Web 服务器上的会话文件。
<?php
session_start();
// setting all the session vars I like to set
session_write_close(); // <-- // To allow parallel requests by the same user, while this script is still running
// Code that takes some time to execute
// It also prints output, so no more cookie headers after this point
@session_start(); // <-- works, but I like to use it without suppressing warnings
$_SESSION['key'] = 'new value I like to store';
session_write_close();
?>
【问题讨论】:
-
您可以禁止警告,但会话不会启动,因为标头已经发送。您需要在向浏览器输出任何内容之前启动会话,别无他法。
-
不,会话将重新开始。有用。这是因为第一个 session_start() 已经正确发送了 cookie
-
更好地构建您的应用程序流程,以便您首先在会话中完成所有需要做的事情。将内容输出到浏览器应该是您做的最后一件事;在您组装 HTML 时,您的所有业务逻辑都应该已经完成,并且在输出已经开始后不需要写入会话。
-
I do this, because as long as the session is open...- 仅当您在具有大量文件锁定的机器(即 MSWindows)上使用基于默认文件的处理程序时。为什么不直接使用更好的会话处理程序? -
不知道自定义会话处理程序会有所不同。尝试也是一件好事。谢谢!
标签: php apache session session-cookies