为什么ob_gzhandler不起作用?

时间:2017-04-04 16:40:36

标签: php apache php-5.6

我使用" ob_gzhandler "压缩内容的功能。这是我的代码:

<?php
ob_start("ob_gzhandler");
?>
<html>
<body>
<p>This should be a compressed page.</p>
</body>
</html> 
不要抛出任何错误,但压缩操作不起作用! in&#34; 检查元素&#34;不是&#34;内容编码:gzip&#34; 短语!

enter image description here

我的系统信息:

  

Apache / 2.4.23(Win64)PHP / 5.6.25 - 为Apache定义的端口:80

3 个答案:

答案 0 :(得分:3)

Php文档说,ob_gzhandler需要安装zlib扩展名,所以请确保它是真的:

 if (extension_loaded('zlib')){
    echo "zlib installed";
}

如果已安装,则可以使用ob_gzhandler并压缩内容。问题是您在响应标头中看不到 HTTP标头 Content-Encoding: gzip。此标头不是由您的Web服务器设置的,但您可以通过header()函数从php设置它:

header('Content-Encoding: gzip');

因此,结合这两个步骤,你就有了解决方案:

if (extension_loaded('zlib') && !ini_get('zlib.output_compression')){
    header('Content-Encoding: gzip');
    ob_start('ob_gzhandler');
}

我还检查.ini配置。如果zlib.output_compressionOn,则所有输出将被压缩,因此ob_gzhandler是多余的。

此代码有效,但不是php可以用于的。压缩输出和设置标题是 Web服务器的责任。请阅读有关configuring .htaccess file的相关答案,以便Apache进行压缩并为您设置正确的响应标题。

答案 1 :(得分:3)

得到1

ob_start(ob_gzhandler)需要零输出。

(断言<?是文件的第一个字节。)

得到2

ob_start(ob_gzhandler)需要zlib.output_compression_level介于-1和9之间。

答案 2 :(得分:0)

首先确保正确配置了 PHP (无需重新启动任何形式);经PHP 7.3.10验证:

php.ini

zlib.output_compression = On

zlib.output_compression_level = 9

第二,有些奇怪的地方。出于某些似乎会破坏页面的原因,请勿尝试手动设置Content-Encoding标头。此代码必须必须在任何输出(包括空格/制表符)发送到客户端之前开始:

if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && stristr($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip'))
{
 ob_start('ob_gzhandler');
 //header('Content-Encoding: gzip');
}

最后,您必须确保正确处理“关闭”压缩-如果处于活动状态:

if (ob_get_level() > 0) {ob_end_flush();}

我尝试了以上所有方法,不得不更改最后一个结尾,希望这可以节省人的理智。