ZLIB 的“Zlib 错误 -2 压缩数据”的由来是什么

ZLIB 的“Zlib 错误 -2 压缩数据”的由来是什么

我的一些网站似乎毫无原因地出现了一些奇怪的错误,例如:

[Fri Nov 06 08:29:07.677505 2020] [deflate:error] [pid 23820:tid 140019129566976] [client XXX.XXX.XXX.XXX:XXXXX] AH01386: Zlib error -2 deflating data ((null)), referer: https://www.XXX.XXX/XXX

这些错误似乎随机出现在页面上,甚至可以通过更新源代码并添加注释来修复。每次更改似乎都可以修复此问题,但错误仍然会不断出现。

我尝试过的方法

读完这篇文章后https://stackoverflow.com/questions/37952355/zlib-z-stream-error-deflating-data-in-apache-error-log,我们尝试将网站迁移到另一台服务器,更新 zlib 库,使用较新的服务器操作系统 (debian),使用另一个 php 版本(当前为 7.4)。代码中没有任何使用 (g)zip 功能的内容。.htaccess 中除了重定向之外也没有任何内容。

来自 phpinfo 的一些信息:

Configure command:
'./configure' '--enable-embed' '--prefix=/usr/local/php74' '--program-suffix=74' '--enable-fpm' '--with-fpm-systemd' '--enable-litespeed' '--with-config-file-scan-dir=/usr/local/php74/lib/php.conf.d' '--with-curl' '--enable-gd' '--with-gettext' '--with-jpeg' '--with-freetype' '--with-kerberos' '--with-openssl' '--with-mhash' '--with-mysql-sock=/var/lib/mysql/mysql.sock' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--with-pear' '--with-sodium=/usr/local' '--with-webp' '--with-xsl' '--with-zlib' '--with-zip' '--with-iconv=/usr/local' '--enable-bcmath' '--enable-calendar' '--enable-exif' '--enable-ftp' '--enable-sockets' '--enable-soap' '--enable-mbstring' '--enable-intl' 'PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/icu/lib/pkgconfig:/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig'

ZLIB:
ZLib Support        enabled
Stream Wrapper      compress.zlib://
Stream Filter       zlib.inflate, zlib.deflate
Compiled Version    1.2.7
Linked Version      1.2.7

Directive                       | Local Value       | Master Value
------------------------------------------------------------
zlib.output_compression         | Off               | Off
zlib.output_compression_level   | -1                | -1
zlib.output_handler             | no value          | no value

当检查站点从服务器获得的响应时,Content-Encoding 标头被设置为 gzip,我认为这很奇怪,因为(使用我有限的 DevOps 知识)我认为上面给出的信息应该表明不使用压缩。

我想分享一些代码,但我无法准确指出代码中似乎存在问题的部分,而且展示旧式自定义 CMS 的整个代码似乎适得其反。

答案1

我们的网站也遇到了类似的问题。查看从服务器检索到的页面源代码时,我们发现它在某个时候被切断了。我们通过添加刷新()在截止点附近打电话。说实话,不确定为什么需要这样做以及为什么这样做有效。

答案2

对我来说,这是由于网页太大,output_buffering超出了 php.ini 的值而导致的。缓冲区提前刷新,因此您只能获得部分网页。

您可以设置更高的限制output_buffering或者关闭output_buffering以解决此问题。

https://www.php.net/manual/en/outcontrol.configuration.php#ini.output-buffering

之后一定要重新启动 php。重新启动 apache2 并没有为我加载新的 php.ini 设置,需要单独重新启动 php。

答案3

我今天遇到了这个错误。禁用页面顶部的 PHP 通知:

<?php error_reporting (E_ALL ^ E_NOTICE); ?>

解决了这个问题,尽管我不明白为什么。

相关内容