2011-12-22 66 views
0

看起来ob_end_flush()会导致隐式会话关闭。这是预期的行为?我想答案是'是',但我可以以某种方式阻止它吗?PHP:ob_end_flush()结束会话

下面是我遇到的问题的描述。我使用的是使用自定义会话处理程序的框架,在这种情况下,我认为它不重要,但仅供参考。实际的问题发生在框架代码ob_end_flush()被调用时。通过记录自定义会话处理程序调用,我注意到在这种情况下会话编写和关闭调用。这太隐含了,我甚至不能用Zend Debugger调试它,只能用error_log记录它。所以,ob_end_flush()与会话的交互仍然继续(我知道,这可能是错误的,但仍然是这种情况),并且在那种情况下,当前一个会话已经关闭时,开始具有新id的新会话。新会话有新ID,因为此刻cookie尚未设置。所以,结果我得到了两个不同的会议,两个不同的ID。

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

在此先感谢。

+1

'ob_end_flush()'不会结束会话。你可以用小脚本检查它,而不用你所有的框架解决方法 – zerkms 2011-12-22 01:00:12

+0

嗯,真的吗?需要检查它。也许我错了,但我只是在ob_end_flush()上设置断点,点击“step over”键,然后创建新的会话文件(自定义会话write()会这样做)。然而,我不能进入write()调用,因为调试器不会去那里,这就是为什么我认为它是如此隐含。 – Stranger 2011-12-22 02:18:24

回答

0

虽然是一个稍微间接的答案,但通常的做法(有时推荐的做法)是为了缓冲整个请求而启动输出缓冲区。这样做可让您在开始“输出”内容后很长时间继续使用会话和/或设置标题(包括重定向)。这应该处理隐含的会话关闭问题。只需将ob_start()电话添加到引导程序的顶部即可。

+0

正如我在框架代码中看到的,它已经在正确的位置执行了ob_start(),并且缓冲了整个请求。问题(至少在我看到它的时候)session_write_close()曾经在ob_end_flush()上调用过,并且在请求处理结束时(当没有更多的代码执行时)再次发生。 上面的zerkms告诉我ob_end_flush()不会结束会话,如果是这样,那么我有点搞砸了。 – Stranger 2011-12-22 02:21:43

+0

嗯,虽然它确实是一个“常见的做法”,但它不是以任何方式推荐的。唯一的好做法是拥有这样的应用程序设计,如果没有理由,这种设计永远不会做任何输出。 – 2011-12-22 05:04:21

+1

@ Col.Shrapnel,分歧没什么问题,但我绝对可以指出一些绝对推荐输出缓冲的用例。我很惊讶地看到你说这里只有一个好习惯。显然,最佳做法是根据情况确定的。 – Kenaniah 2011-12-22 22:51:58