WordPress:由wp-db.php引起的允许内存耗尽



这是一个WordPress网站,在浏览网站或仪表板时,错误会在任何地方随机发生。它始终是相同的字节 53248 或 8192。实际上非常小的字节。但是除了内存不足之外,还有其他事情发生。

我想某处有一个错误。它从第 1896 行的/wp-includes/wp-db.php抛出错误:

$num_rows = 0;
if ( $this->use_mysqli && $this->result instanceof mysqli_result ) {
while ( $row = mysqli_fetch_object( $this->result ) ) {
$this->last_result[$num_rows] = $row;
$num_rows++;
}
} elseif ( is_resource( $this->result ) ) {
while ( $row = mysql_fetch_object( $this->result ) ) {
$this->last_result[$num_rows] = $row;
$num_rows++;
}
}

注意:为什么投反对票?问题实际上来自其他难以捕获的东西,而不是来自PHP或服务器配置。

最终答案和解决方案: 问题来自写得不好和价格过高(专业版)插件。终极会员:https://wordpress.org/plugins/ultimate-member/

此插件的设置中有一个选项。"缓存用户"。无论是"是"还是"否"都没关系。该插件wp_options表中为您拥有的每个用户创建一行。例如,我的网站有 17.000 个用户,该插件向wp_options表添加了17.000 行,如下所示:

  • 缓存亚当用户 - 是
  • 缓存史密斯用户 - 否
  • 缓存约翰用户 - 是
  • 等等...

因此,这会wp_options表中创建 17.000 行。如果您有 100.000 个用户,则会额外增加 100.000 行。多么残暴!像这个插件旨在破坏您的网络服务器。因此,即使是 6 个 CPU 核心和 12 GB 内存也无济于事。一直收到 Http 500 错误。

阻止这种情况的唯一方法是编辑插件的源代码并删除更新表wp_options行。然后从表中删除wp_options所有这些数据。

以前:

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | grep php-fpm
517.02 Mb php-fpm: pool www
455.77 Mb php-fpm: pool www
5.46 Mb php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
0.35 Mb grep php-fpm

现在,网站的加载速度提高了 5 倍,并且没有任何 500 错误:

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | grep php-fpm
26.21 Mb php-fpm: pool www
25.29 Mb php-fpm: pool www
24.99 Mb php-fpm: pool www
24.72 Mb php-fpm: pool www
24.28 Mb php-fpm: pool www
23.83 Mb php-fpm: pool www
23.16 Mb php-fpm: pool www
23.06 Mb php-fpm: pool www
22.25 Mb php-fpm: pool www
21.85 Mb php-fpm: pool www
18.76 Mb php-fpm: pool www
5.46 Mb php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
0.35 Mb grep php-fpm

您的服务器配置为只允许 PHP 进程使用 256 MB 的内存。WordPress使用的远不止这些。您尝试分配的字节数(53248 或 8192)无关紧要,您正在达到限制,因为您请求的内存超过了允许的内存。

似乎您的数据库太大了,WordPress需要更多的内存来处理您的数据。请重新配置您的服务器(允许使用更多内存),或向wordpress开发人员提出问题,以便代码能够以仅256 MByte运行。

来自Dawid Loranc的回答

"问题是由iThemes Security插件引起的。我关闭了它,错误已经消失了。如果我知道这个插件的哪一部分导致超出内存限制,我会更多地调查这个问题并编辑这个答案。

最新更新