似乎ob_end_flush()
导致隐式会话关闭。这是预期的行为吗?我想答案是肯定的,但我能阻止它吗?
这是对我遇到的问题的描述。我使用的框架使用自定义会话处理程序,我不认为这在这种情况下很重要,但只是为了提供信息。当在框架代码的某个点调用ob_end_flush()
时,实际问题就出现了。通过记录自定义会话处理程序调用,我注意到在这种情况下会话写入和关闭调用。它是如此隐含,我甚至不能用Zend Debugger调试它,只能用error_log记录它。所以,在ob_end_flush()
与会话交互之后仍然继续(我知道,这可能是错误的,但仍然是这种情况),并且在这种情况下,当先前的会话已经关闭时,新id的新会话开始。新的会话有新的id,因为目前没有设置cookie。因此,作为结果,我得到了两个独立的会话,具有两个不同的id。
对我来说最好的解决方案可能是禁用隐含的ob_end_flush()
行为,但我将接受任何答案。
虽然这是一个稍微间接的回答,但通常的做法(有时也是推荐的做法)是启动一个输出缓冲区,目的是缓冲整个请求。这样做允许您在开始"输出"内容后很长时间内继续使用会话和/或设置标头(包括重定向)。这应该可以解决您的隐式会话关闭问题。只需在你的bootstrap顶部添加一个ob_start()
调用。