PHP: ob_end_flush()结束会话


PHP: ob_end_flush() end session

似乎ob_end_flush()导致隐式会话关闭。这是预期的行为吗?我想答案是肯定的,但我能阻止它吗?

这是对我遇到的问题的描述。我使用的框架使用自定义会话处理程序,我不认为这在这种情况下很重要,但只是为了提供信息。当在框架代码的某个点调用ob_end_flush()时,实际问题就出现了。通过记录自定义会话处理程序调用,我注意到在这种情况下会话写入和关闭调用。它是如此隐含,我甚至不能用Zend Debugger调试它,只能用error_log记录它。所以,在ob_end_flush()与会话交互之后仍然继续(我知道,这可能是错误的,但仍然是这种情况),并且在这种情况下,当先前的会话已经关闭时,新id的新会话开始。新的会话有新的id,因为目前没有设置cookie。因此,作为结果,我得到了两个独立的会话,具有两个不同的id。

对我来说最好的解决方案可能是禁用隐含的ob_end_flush()行为,但我将接受任何答案。

虽然这是一个稍微间接的回答,但通常的做法(有时也是推荐的做法)是启动一个输出缓冲区,目的是缓冲整个请求。这样做允许您在开始"输出"内容后很长时间内继续使用会话和/或设置标头(包括重定向)。这应该可以解决您的隐式会话关闭问题。只需在你的bootstrap顶部添加一个ob_start()调用。