为什么 ob_gzhandler 不起作用?
Why is ob_gzhandler not working?
我使用“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 - Port defined for Apache: 80
Php 文档说,ob_gzhandler
需要安装 zlib
扩展,所以请确保它是真的:
if (extension_loaded('zlib')){
echo "zlib installed";
}
如果已安装,您可以使用 ob_gzhandler
,内容将被压缩。问题是您没有看到 HTTP header Content-Encoding: gzip
响应 header。此 header 不是由您的网络服务器设置的,但您可以通过 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_compression
是On
,所有输出都会被压缩,所以ob_gzhandler
是多余的。
此代码有效,但 php 不应使用它。压缩输出和设置 headers 是 web 服务器 的责任。请阅读有关 configuring .htaccess file 的相关答案,以便 Apache 进行压缩并为您设置正确的响应 headers。
陷阱 1
ob_start(ob_gzhandler)
需要零预输出。
(断言 <?
是文件的 第一个字节 。)
陷阱 2
ob_start(ob_gzhandler)
需要 zlib.output_compression_level
在 -1 和 9 之间。
首先确保PHP配置正确(不需要任何重启);通过 PHP 7.3.10:
验证
php.ini
zlib.output_compression = On
zlib.output_compression_level = 9
其次还有一些奇怪的地方。不要尝试手动设置 Content-Encoding
header,因为某些原因似乎会破坏页面。此代码必须在任何输出(包括spaces/tabs)发送到客户端之前开始:
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && stristr($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip'))
{
ob_start('ob_gzhandler');
//header('Content-Encoding: gzip');
}
最后,您必须确保正确处理 "closing" 压缩 - 如果 它处于活动状态:
if (ob_get_level() > 0) {ob_end_flush();}
我尝试了以上所有方法,但不得不更改最后一个结束位,希望这能挽救某人的理智。
我使用“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 - Port defined for Apache: 80
Php 文档说,ob_gzhandler
需要安装 zlib
扩展,所以请确保它是真的:
if (extension_loaded('zlib')){
echo "zlib installed";
}
如果已安装,您可以使用 ob_gzhandler
,内容将被压缩。问题是您没有看到 HTTP header Content-Encoding: gzip
响应 header。此 header 不是由您的网络服务器设置的,但您可以通过 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_compression
是On
,所有输出都会被压缩,所以ob_gzhandler
是多余的。
此代码有效,但 php 不应使用它。压缩输出和设置 headers 是 web 服务器 的责任。请阅读有关 configuring .htaccess file 的相关答案,以便 Apache 进行压缩并为您设置正确的响应 headers。
陷阱 1
ob_start(ob_gzhandler)
需要零预输出。
(断言 <?
是文件的 第一个字节 。)
陷阱 2
ob_start(ob_gzhandler)
需要 zlib.output_compression_level
在 -1 和 9 之间。
首先确保PHP配置正确(不需要任何重启);通过 PHP 7.3.10:
验证php.ini
zlib.output_compression = On
zlib.output_compression_level = 9
其次还有一些奇怪的地方。不要尝试手动设置 Content-Encoding
header,因为某些原因似乎会破坏页面。此代码必须在任何输出(包括spaces/tabs)发送到客户端之前开始:
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && stristr($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip'))
{
ob_start('ob_gzhandler');
//header('Content-Encoding: gzip');
}
最后,您必须确保正确处理 "closing" 压缩 - 如果 它处于活动状态:
if (ob_get_level() > 0) {ob_end_flush();}
我尝试了以上所有方法,但不得不更改最后一个结束位,希望这能挽救某人的理智。