PHP:ob_end_flush()结束会话

PHP:ob_end_flush()结束会话,php,session,Php,Session,似乎ob_end_flush会导致隐式会话关闭。这是故意的行为吗?我想答案是“是的”,但我能设法阻止它吗 下面是我遇到的问题的描述。我使用的是使用自定义会话处理程序的框架,我认为在这种情况下这并不重要,只是为了提供信息。实际问题发生在框架代码ob_end_flush中的某个点被调用时。通过记录自定义会话处理程序调用,我注意到在本例中调用了会话写入和关闭。它是如此隐式,以至于我甚至不能用Zend Debugger调试它,只能用error_log记录它。所以,在ob_end_flush与会话的交互仍

似乎ob_end_flush会导致隐式会话关闭。这是故意的行为吗?我想答案是“是的”,但我能设法阻止它吗

下面是我遇到的问题的描述。我使用的是使用自定义会话处理程序的框架,我认为在这种情况下这并不重要,只是为了提供信息。实际问题发生在框架代码ob_end_flush中的某个点被调用时。通过记录自定义会话处理程序调用,我注意到在本例中调用了会话写入和关闭。它是如此隐式,以至于我甚至不能用Zend Debugger调试它,只能用error_log记录它。所以,在ob_end_flush与会话的交互仍在继续之后,我知道,这可能是错误的,但仍然是这样,在这种情况下,当上一个会话已关闭时,将启动具有新id的新会话。新会话具有新id,因为此时未设置cookie。因此,结果是,我得到了两个具有两个不同ID的单独会话

对我来说,最好的解决方案可能是禁用隐式ob_end_flush行为,但我会接受任何答案


提前感谢。

虽然回答有点间接,但启动输出缓冲区以缓冲整个请求是常见做法,有时也是推荐做法。这样做允许您在开始输出内容后很长时间内继续使用会话和/或设置包括重定向在内的标题。这应该会解决您隐含的会话结束问题。只需在引导程序顶部添加一个ob\u start调用。

ob\u end\u flush不会结束会话。你可以用小脚本检查它,而不需要所有的框架解决方法,嗯,真的吗?我需要检查一下。也许我弄错了,但我只是在ob_end_flush上设置断点,点击单步跳过键,然后在创建新会话文件之后,自定义会话写入就这样做了。然而,我无法进行那个写调用,因为调试器并没有去那个里,这就是为什么我认为它是隐式的。正如我在框架代码中看到的,它已经在正确的位置开始了ob_,并且它缓冲了整个请求。这个问题至少在我看来是这样的:session_write_close曾在ob_end_flush调用过一次,在请求处理结束时,当没有更多的代码要执行时,又一次调用过。上面的虫族告诉我,ob_end_flush不会结束会话,如果是这样的话,那么我就有点糊涂了。好吧,虽然这确实是一种常见的做法,但无论如何都不是推荐的做法。唯一的好做法是有这样一个应用程序设计,它不会无缘无故地进行任何输出。@Col.shrapanel,不同意没有错,但我可以明确指出一些绝对推荐使用输出缓冲的用例。我很惊讶看到你说这里只有一个好的做法。显然,最佳实践是根据具体情况确定的。