在PHP中重新打开一个会话

如何在PHP中重新打开一个会话而不使头部发送警告?

在设置完所有会话variables之后,我使用session_write_close()closures会话。 我这样做,因为只要会话是打开的,可能只有一个来自同一客户端的活动连接。 但我喜欢有多个平行的。

但是,如果我想稍后设置另一个会话variables,则需要再次使用session_start()重新打开会话。 这工作,但因为我已经发送代码到客户端它打印“头已经发送” – 警告。 为什么要重新设置cookie? 该cookie已经设置。 唯一需要的是获得访问权限,再次在服务器上写会话文件。

那么,我可以压制他们。 但是有没有重新开放会话的方式,已经closuressession_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(); ?> 

 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()
看到它工作 。

虽然重组脚本似乎仍然是更好的选择

编辑见@ 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(); 

参考: 输出控制功能