当没有会话时,ob_gzhandler返回空白页面

时间:2010-07-29 05:20:15

标签: php gzip output-buffering

我想压缩我的页面,所以我把

ob_start('ob_gzhandler');

在我的php头文件的开头。然而,当我在玩耍的时候,我注意到如果我在没有使用ob_gzhandler时开始一个会话,它会给我一个空白页面! 所以我做了下面的工作:

<?php
  if (session_id() === null ) ob_start('ob_gzhandler');
?>

我怎么不确定这是否总是使用压缩,因为我想它们可能是一个会话但浏览器仍然会收到未压缩的数据!我想我必须重新启动会话,如果情况发生,除了开发时间之外真的不应该。但我想我真正想知道的是关于zlib和这种压缩的一些快速提示。有任何性能提示吗?我假设服务器输出内部缓冲区,如果文件末尾没有指示,但我应该把它放在那里? ob_end_flushob_end_clean?ob_end_close?

使用memcache的任何注意事项?任何提示和信息将非常感谢!

1 个答案:

答案 0 :(得分:0)

在ob_gzhandler()压缩数据之前,它将检查浏览器将接受哪种类型的编码,如果它的gzip或deflate(也许其他东西,我不确定)它将使用该压缩打印输出。支持所有流行的浏览器,即使您编写自己的代码或担心搜索引擎蜘蛛,HTTP请求者也可以发送正确的HTTP标头,说它接受压缩页面。 不用担心,如果浏览器不支持压缩页面,则此函数返回FALSE且不应用压缩。

这里有一些其他东西来自php man: 的 ob_start  此功能将打开输出缓冲。当输出缓冲处于活动状态时,不会从脚本(标头除外)发送输出,而是将输出存储在内部缓冲区中。

可以使用ob_get_contents()将此内部缓冲区的内容复制到字符串变量中。要输出存储在内部缓冲区中的内容,请使用ob_end_flush()。或者,ob_end_clean()将静默地丢弃缓冲区内容。 警告

某些Web服务器(例如Apache)在调用回调函数时会更改脚本的工作目录。您可以通过例如更改它回调函数中的chdir(dirname($ _ SERVER ['SCRIPT_FILENAME']))。

输出缓冲区是可堆叠的,也就是说,当另一个ob_start()处于活动状态时,您可以调用ob_start()。只需确保调用ob_end_flush()适当的次数。如果多个输出回调函数处于活动状态,则将按嵌套顺序依次对每个输出回调函数进行过滤。

此部分再次从php手册中复制!