error_log 被“不支持字符集,假设为 utf-8”消息淹没

Posted

技术标签:

【中文标题】error_log 被“不支持字符集,假设为 utf-8”消息淹没【英文标题】:error_log flooded by "charset not supported, assuming utf-8" messages 【发布时间】:2019-05-08 15:16:12 【问题描述】:

问题: Wordpress 博客的错误日志被“不支持字符集,假设为 utf-8”消息淹没;在 24 小时内增长 0 字节至 450 Mb(如果统计数据正确,页面浏览量约为 28k)。

详细信息:我在共享主机帐户上托管了一个由 Wordppress 提供支持的博客。它已经运行了多年,直到不久前这才成为问题,但我无法确定开始发生这种情况的确切时间范围。几个月前,我开始超出允许的资源(主要是内存),所以他们把我转移到了不同​​的服务器,我不得不升级帐户以获得更高的允许资源使用率。旧服务器运行的是 php5,这个是 php7。最新的 WP + 大约 15 个流行的插件,都是各自的最新版本。主题很古老,从一开始就存在。

昨天我删除了站点根目录中 9 GB(!) 的错误日志,今天,24 小时后它的 500 MB。所有行都相似:

[datetime] PHP Warning:  html_entity_decode(): charset `keep-ali0' not supported, assuming utf-8 in /home/accountname/public_html/wp-includes/formatting.php on line 5124
[datetime] PHP Warning:  htmlentities(): charset `/[^0-9\.]/' not supported, assuming utf-8 in /home/accountname/public_html/wp-content/plugins/wp-super-cache/wp-cache-base.php on line 5
... etc.

我解析了旧的 2 GB 日志:

它们来自 13 个文件:3 个核心 WP 文件,其他来自 6 个不同的插件 仅来自这些函数:htmlentities()htmlspecialchars()html_entity_decode() 超过 1000 个独特的“字符集”:全都是垃圾,大多数包括不可打印的字符,其他只是奇怪的东西:路径(不是我的!)、正则表达式、整数、十六进制值...:#^[a-z]:[/\\]#imeta_value , 0x7fe858ae2920, /home/someone-elses-account-name/public_html/includes/functions.php, ...

这些值从何而来?

我什至从哪里开始解决这个问题?

【问题讨论】:

不是一个解决方案,但作为一种临时破解,将 php.ini 中选项 error_reporting 的值更改为不包括常量 E_WARNING。这可能有点棘手,因为该值是位掩码,并且 E_WARNING 可以通过使用另一个选项的补码来指定。这将在您解决实际问题时禁止将警告消息写入日志文件。 或者,转到第 5124 行的 /wp-includes/formatting.php 并将 html_entity_decode 更改为 @html_entity_decode - 同样不是解决方案,而只是抑制错误消息。 您对源代码有编辑权限吗?如果您可以编辑源代码,我会告诉您如何找到问题的根源。 bugs.php.net/bug.php?id=71876 @miken32 - 哇,我从来没有怀疑过 PHP 中的错误,你真是个大师!感谢您的课程,下次发生真正奇怪的事情时,我也会考虑 PHP 错误。确实是非常宝贵的一课,再次感谢您。 【参考方案1】:

这似乎是 PHP 中的一个已知错误,它难以重现,因此被搁置了一段时间。

https://bugs.php.net/bug.php?id=71876

已经提出了各种解决方法,包括:

在 php.ini 中设置 internal_encoding=utf-8 或使用 ini_set('internal_encoding', 'utf-8'); 确保default_charset 未在 php.ini 中设置 将字符集添加到函数调用中,例如html_entity_decode($x, null, 'utf-8');

这些变通办法似乎有好坏参半的结果。

【讨论】:

谢谢!这似乎是它。接下来几天我会试试这些。不过,我无法访问 php.ini ,但我会再次与支持人员交谈。 所以,我无法使用任何解决方法(一个 php.ini 用于共享主机上的多个帐户;代码更改将被软件更新覆盖)。但是托管支持通过include config(?类似的东西)将internal_encoding utf-8添加到Apache Web服务器配置中,并且它起作用了。感谢您为我指明正确的方向!

以上是关于error_log 被“不支持字符集,假设为 utf-8”消息淹没的主要内容,如果未能解决你的问题,请参考以下文章

将 PDO 异常记录到 error_reporting 和 error_log

如果 error_log 指令只是说“error_log”,那么 PHP 错误会记录到哪里?

如何将 PHP error_log 错误消息记录到 Apache 服务器 error_log?

PHP 7 - error_log 中没有记录异常。 error_log 根本没有得到处理

每个文件夹的php error_log

Nginx: error_log