如何在不使标题已发送警告的情况下在PHP中重新打开会话?
设置好我要设置的所有会话变量后,我用session_write_close()关闭会话。我这样做,因为只要会话打开,同一个客户端可能只有一个活动连接。但我喜欢有多个平行的。
但是,如果我想稍后设置另一个会话变量,我需要再次使用session_start()重新打开会话。这是有效的,但是因为我已经将代码发送到客户端,所以它会打印“已发送的标题”-warnings。为什么要再次设置cookie? cookie已经设置好了。我唯一需要的是获得再次在服务器上编写会话文件的权限。
好吧,我可以抑制它们。但有没有办法重新打开会话,已经使用session_write_close关闭而不重新发送Cookie标头? Cookie头已由第一个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();
?>
答案 0 :(得分:18)
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
虽然重组脚本似乎仍然是更好的选择 ......
答案 1 :(得分:6)
编辑请参阅@ 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();