这里的其他答案提供了很好的解决方案。正如@Jon 所提到的,诀窍是在您想要进行更改之前再次调用 session_start() 。然后,当您完成更改后,再次调用 session_write_close()。
正如@Armel Larcier 所提到的,问题在于PHP 尝试生成新的标头并且可能会生成警告(例如,如果您已经将非标头数据写入客户端)。当然,您可以简单地在 session_start() 前加上“@” (@session_start()),但有更好的方法。
@VolkerK 提供的另一个 Stack Overflow 问题揭示了最佳答案:
session_start(); // first 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); //May be necessary in some situations
ini_set('session.cache_limiter', null);
session_start(); // second session_start
这可以防止 PHP 再次尝试发送标头。您甚至可以编写一个辅助函数来包装 ini_set() 函数,以使其更方便:
function session_reopen() {
ini_set('session.use_only_cookies', false);
ini_set('session.use_cookies', false);
//ini_set('session.use_trans_sid', false); //May be necessary in some situations
ini_set('session.cache_limiter', null);
session_start(); //Reopen the (previously closed) session for writing.
}
原始相关 SO 问题/答案:https ://stackoverflow.com/a/12315542/114558