![ZLIB 的“Zlib 错误 -2 压缩数据”的由来是什么](https://linux22.com/image/759719/ZLIB%20%E7%9A%84%E2%80%9CZlib%20%E9%94%99%E8%AF%AF%20-2%20%E5%8E%8B%E7%BC%A9%E6%95%B0%E6%8D%AE%E2%80%9D%E7%9A%84%E7%94%B1%E6%9D%A5%E6%98%AF%E4%BB%80%E4%B9%88.png)
我的一些网站似乎毫无原因地出现了一些奇怪的错误,例如:
[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); ?>
解决了这个问题,尽管我不明白为什么。