2010-02-24 132 views
0

这是一个奇怪的。我正在缓慢地在现场服务器上重建网站。该网站的某些部分已被重建,因此代码被放置在主目录的子目录中(即:/ mysite/newcode)。为什么gzip压缩不起作用?

我已经使用ob_start(“ob_gzhandler”)成功地对旧网站进行了gzip压缩;所以,我已经为新代码应用了完全相同的代码。然而,由于某种奇怪的原因,它的返回没有被压缩。我检查了http://www.whatsmyip.org/http_compression/http://www.gidnetwork.com/tools/gzip-test.php。我不明白为什么如果gzip处理程序被包含在旧代码和新代码中的第一行之前(任何输出之前),为什么它不会对新代码进行gzip处理。

PHP 5.1.6 的Apache 2.0 CentOS 5的

+1

你在哪儿叫'ob_start'? – Gumbo 2010-02-24 09:15:50

回答

0

如果使用ob_start测试这才发现出了问题,不知道是否记录任何地方......

( “ob_gzhandler”);和你什么刷新你的内容,你必须使用ob_flush(),而不是flush()。使用flush会抛出压缩。

+0

一旦你完成了输出,你应该使用ob_end_flush()或ob_end_clean() – stillstanding 2010-02-24 10:34:48

+0

请注意,我问为什么? – David 2010-02-25 09:11:00

+0

我认为对PHP文档的评论很好解释。 http://php.net/manual/en/function.ob-end-flush.php你可以把它放在一个简单的网页请求场景中,它会自动调用。但是PHP和这些函数可以用于其他场景。此外,如果您决定在将来重新使用您的代码,如果您尚未手动清理,则更有可能遇到问题。 – Liam 2010-06-04 17:02:58

1

http://docs.php.net/ob_gzhandler说:

ob_gzhandler()之前实际发送压缩数据,它决定什么类型的编码器会接受( “压缩” 的内容, “放气”或者根本没有)并且将相应地返回其输出。
这可能是你的问题的原因?

编辑:你可以像

function dbg_ob_gzhandler($buffer, $mode) { 
    error_log('dbg_ob_gzhandler invoked'); 
    $rv = ob_gzhandler($buffer, $mode); 
    if (false===$rv) { 
    error_log('client does not support compressed content'); 
    } 
    return $rv; 
} 
ob_start('dbg_ob_gzhandler'); 
+0

我已经检查过Live HTTP Headers(在Firefox 3.6中),并且即时将'Accept-Encoding:gzip,deflate'传递给服务器。所以肯定它应该返回压缩信息。但是,它似乎唯一被压缩的是一个随机的css文件。 – David 2010-02-24 09:36:34

+0

我宁愿测试一下,不管是否在服务器端调用ob_gzhandler()(如果仅仅因为它是如此简单的测试)。 – VolkerK 2010-02-24 09:45:49