我的网站内存不足(严重错误)

时间:2020-05-16 19:42:35

标签: php linux wordpress

当内存限制设置为256M时,我的网站经常在随机的代码点中耗尽内存,因此我将其更改为1024M,以查看这是空间问题还是代码中的某些不良循环...一段时间后,该网站仍然内存不足。为了不让内存溢出,我可以做些什么?

我看到了有关限制请求的信息,但我认为这不能解决问题的根源。如果这是我的最后选择,我会这样做,但是我想知道解决此问题的最佳方法是什么。

PHP版本:7.2.30

Apache版本:2.4.41

Wordpress版本:5.4.1

这是内存溢出时在网站上显示的错误的图像: Error shown on website when the server runs out of memory

这是一个错误的示例(请注意,一天之内在日志文件中大约有100个错误,错误的位置也有所不同(有时在plugins文件夹中的php文件中,有时在主题文件夹)):

[16-May-2020 19:16:22 UTC] PHP Fatal error:  Out of memory (allocated 21233664) (tried to allocate 4718592 bytes) in /var/www/html/wp-content/plugins/woocommerce/includes/log-handlers/class-wc-log-handler-file.php on line 21

编辑:日志还说我没有安装XML服务。我安装了它,但不确定是否是问题的根源。

2 个答案:

答案 0 :(得分:0)

Wordpress永远不要在一次加载中消耗那么多的内存。您是说这是一个相当标准的设置。使用没有主题和插件的原始安装,您是否获得相同级别的内存使用?然后,在使用了给定的插件后,事情会增加吗?从头开始构建它,看看是否可以找到罪魁祸首(例如,错误的插件,插件冲突或错误的配置)。

如果您想更深入地研究,而无需使用更多复杂的PHP调试工具(例如Xdebug),内置的memory_get_usage()功能就是您的朋友。例如,您可以使用这样的日志记录功能(在我的头顶上,经过简短测试):

function log_mem($file, $line, $save = true) {
    static $iter = 0;
    $iter++;
    $usage = round(memory_get_usage() / 1048576, 2) . ' MB';
    $log = "[" . time() . "] {$iter}, {$file}#{$line}, {$usage}\n";
    $save && file_put_contents('tmp/php_memory.log', $log, FILE_APPEND);
    return $log;
}

log_mem(__FILE__, __LINE__); // to save into log file
echo log_mem(__FILE__, __LINE__, false); // to output only

log_mem()命令弹出可疑位置。它将时间戳,迭代次数(即处理顺序),文件名,行号和当前内存使用情况记录到文件中。像这样:

[1589662734] 1, C:\server\home\more\dev\mem_log.php#14, 0.78 MB
[1589662734] 2, C:\server\home\more\dev\mem_log.php#18, 34.78 MB
[1589662734] 3, C:\server\home\more\dev\mem_log.php#22, 68.78 MB

然后您可以查看尖峰在哪里触发,并开始修复代码。

如果您不希望一遍又一遍地添加和删除日志命令(这显然会导致重复的filesys访问会导致一些处理开销),则可以使它有条件地运行,并在所有站点范围内使用恒定的布尔值开关包含的文件:

const MEM_LOG = true;
...
MEM_LOG && log_mem(__FILE__, __LINE__);

记住要跟进,让我们知道导致内存泄漏的原因。祝好运! ^ _ ^

答案 1 :(得分:0)

人们认为Wordpress很容易。即使您从未接触过代码,这也是一个很难管理和保持安全的系统。它的复杂性使代码定制非常非常困难。

您的日志已经显示出系统内存不足的地方。

这是当内存溢出时网站上显示的错误的图片

您在这里所说的话说明您对PHP网站的操作非常缺乏经验。您的安装不应将错误写入浏览器。这使我认为您在尝试解决此问题时走得太远了。

您已将此内容发布在编程论坛上-暗示您可能正在编写自定义代码。在这种情况下,解决错误的正确方法是使用探查器来跟踪内存用完的地方。

但是,如果实际上站点上没有自定义代码,则您需要先跟踪内存使用情况(为此注册一个关闭功能),并开始禁用主题和插件,直到发现问题为止。