如何在PHP中重新打开会话,而不会收到报头已发送的警告?
在设置了我想要设置的所有会话变量之后,我使用session_write_close()关闭会话。我这样做是因为只要会话处于打开状态,可能只有一个来自同一客户端的活动连接。但我喜欢有多个并行的。
但是,如果我想在以后设置另一个会话变量,则需要再次使用session_start()重新打开会话。这是可行的,但是因为我已经向客户端发送了代码,所以它会输出"headers as“-warnings。为什么它要再次尝试设置cookie?cookie已设置。我唯一需要做的就是再次获得在服务器上写入会话文件的权限。
好吧,我可以抑制他们。但是,有没有一种方法可以在不重新发送Cookie-header的情况下重新打开使用session_write_close关闭的会话?Cookie-header已经由第一个session_start()正确发送。因此,第二个只需要让我重新访问存储在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();
?>发布于 2012-09-07 17:37:39
session_start();
...
session_write_close();
...
ini_set('session.use_only_cookies', false);
ini_set('session.use_cookies', false);
ini_set('session.use_trans_sid', false);
ini_set('session.cache_limiter', null);
session_start(); // second session_start这将阻止php再次调用php_session_send_cookie()。
See it working。
虽然重构脚本似乎仍然是更好的选择,...
对于PHP 7.2+,你基本上需要重新实现会话cookie来避免错误和警告:
ini_set('session.use_only_cookies', false);
ini_set('session.use_cookies', false);
ini_set('session.use_trans_sid', false);
ini_set('session.cache_limiter', null);
if(array_key_exists('PHPSESSID', $_COOKIE))
session_id($_COOKIE['PHPSESSID']);
else {
session_start();
setcookie('PHPSESSID', session_id());
session_write_close();
}
session_start();
...
session_write_close();
...
session_start(); // second session_start发布于 2012-09-07 17:22:43
编辑查看@VolkerK的解决方案,它比这个更好。
只需在脚本执行时缓冲输出,以防止头部被发送,并在最后输出它:
<?php
session_start();
// setting all the session vars I like to set
session_write_close();
// Start output buffer
ob_start();
// Code that takes some time to execute
// Do session stuff at the end of the script
session_start();
$_SESSION['key'] = 'new value I like to store';
session_write_close();
// Send output to client
ob_end_flush();参考:Output control functions
https://stackoverflow.com/questions/12315225
复制相似问题