如何通过多个输出缓冲区和Gzip保持会话存活?

时间:2011-06-12 23:11:29

标签: php session gzip buffer

我最近意识到我对网站的修改导致会话停止在页面重新加载之间。在做了一点调查之后,我注意到session_start() manual at PHP.net中的这一行:

  

如果用户使用ob_gzhandler或与ob_start()类似,则函数顺序对于正确输出很重要。例如,必须在开始会话之前注册ob_gzhandler。

问题是,我在页面中很早就打电话给session_start()。我想可能在开头添加Gzip处理程序,但这不起作用,因为我在整个脚本执行过程中打开并清理了几个输出缓冲区(通常每页加载3或4)。在页面的最后,我将所有缓冲区组合在一起并填入数据然后用Gzip处理程序打开最终输出缓冲区并将最终结果回显到页面。现在问题是:如何通过PHP继续完成Gzip压缩并保持会话正常工作?我尝试在打开最终输出缓冲区后再次重新打开会话,但这没有任何效果。在开头打开一个额外的输出缓冲区只会导致浏览器出现内容编码错误。有什么想法吗?

这是一个非常简化的可视化代码片段。对不起,我的代码跨越了几页冗长的编码,所以我无法粘贴所有内容。

session_start(); // The session is started early on for data

...

ob_start(); // Start an output buffer
echo "some content here"; // Some stuff is processed and sent
$data = ob_get_clean(); // That data is stored for later

...

ob_start(); // Another output buffer is started
echo "some other stuff"; // Different content for another piece of the page is sent
$moredata = ob_get_clean(); // That data is also stored for later use

...

ob_start(); // Another output buffer
echo $data.$moredata; // The data so far is more or less "combined" into the final template
$final = ob_get_clean(); // All of this is stored for final output
// Some other final touches are made to the final data here
ob_start("ob_gzhandler"); // Start the Gzip handler
echo $final; // Send the final output

1 个答案:

答案 0 :(得分:1)

使用:

调用session_start()后获取会话ID
$id = session_id();

然后,在代码结束时,使用以下命令重新构建会话:

session_id($id);
相关问题