【问题标题】:Why is ob_gzhandler not working?为什么 ob_gzhandler 不工作?
【发布时间】:2017-08-29 23:54:21
【问题描述】:

我使用“ob_gzhandler”函数来压缩内容。这是我的代码:

<?php
ob_start("ob_gzhandler");
?>
<html>
<body>
<p>This should be a compressed page.</p>
</body>
</html> 

不要抛出任何错误,但压缩操作不起作用! 在 "inspect element" 中不是 "content-encoding : gzip" 短语!

我的系统信息:

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

【问题讨论】:

    标签: php apache php-5.6


    【解决方案1】:

    PHP 文档说,ob_gzhandler 需要安装 zlibextension,所以请确保它是真的:

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

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

    header('Content-Encoding: gzip');
    

    所以,结合这两个步骤,你就有了一个解决方案:

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

    我还检查了.iniconfiguration。如果zlib.output_compressionOn所有输出 将被压缩,所以ob_gzhandler 是多余的。

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

    【讨论】:

    • 请多描述一下,我还不明白! Tnx
    • @Farshad,我添加了更多信息。希望对您有所帮助。
    • 我已经按照上述所有方法进行操作,但问题没有解决!请帮我。 tnx
    【解决方案2】:

    问题 1

    ob_start(ob_gzhandler) 需要零预输出。

    (断言&lt;? 是文件的第一个字节。)


    陷阱 2

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

    【讨论】:

    • 我已经按照上述所有方法进行操作,但问题没有解决!请帮我。 tnx
    • 这个答案实际上是零意义。 ob_start(ob_gzhandler) 是 PHP 调用的第一件事,因此将是第一件事输出,那么有人怎么可能“修复”这个?也完全不清楚您所断言的 OP 代码“错误”。
    【解决方案3】:

    首先确保正确配置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();}
    

    我尝试了以上所有方法,但不得不更改最后的结尾位,希望这可以挽救某人的理智。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 2018-02-23
      • 2016-11-19
      • 1970-01-01
      • 2015-06-15
      • 2013-06-01
      • 2011-09-29
      相关资源
      最近更新 更多