PHP 内存不足错误,即使未达到memory_limit

2022-08-30 17:13:15

我刚刚继承了一个带有PHP脚本的站点,该脚本在117 MB时一直内存不足。即使我将PHP的memory_limit变量增加到312 MB,也会发生这种情况,这是我通过php.ini完成的。

由于pcguru的一个很好的线索,这个问题现在已经解决了。看到我的答案开始:我终于找到了答案

ini_get('memory_limit')返回php中设置的值.ini,所以我确定Apache在更改值后重新启动。我使用返回脚本在过程中的不同点消耗的内存。当它达到117 MB时,它一直失败。memory_get_usage(true)

是否有一些我不知道的内部PHP限制,它从未为单个脚本分配超过117MB?

服务器有1GB的RAM,并且正在运行CentOS。我有根外壳访问权限。PHP 版本为 5.3.18。MySQL是5.1.66-cll版本。

此脚本位于用户名/密码后面,我无法提供对它的公共访问权限。

已编辑以添加:

1)感谢您迄今为止的帮助。您可以在我对特定用户评论的回复中找到更多信息,在下面的各种答案下。

2)Suhosin绝对没有安装。我已经在多个地方进行了检查,包括运行脚本并检查常量以及运行php -v

3)apache日志没有我收到的特定错误消息的记录。日志记录在 php.ini 中打开。我通过管道通过 grep 搜索整个日志。

4)在这种情况下,是否有可能报告错误的错误?


答案 1

我终于找到了答案。线索来自pcguru的答案,开头是“因为服务器只有1 GB的RAM......”。

在预感中,我研究了Apache是否有自己的内存限制,因为这些限制可能会影响PHP分配内存的能力。在httpd.conf的顶部,我发现了这个声明:RLimitMEM 204535125

这是由whm / cpanel放在那里的。根据以下网页 whm/cpanel 错误地计算了其在虚拟服务器上的值...http://forums.jaguarpc.com/vps-dedicated/17341-apache-memory-limit-rlimitmem.html

内存不足的脚本可以完成大部分工作,因此我将 RLimitMEM 增加到 268435456 (256 MB) 并重新运行脚本。它完成了数组合并并生成了供下载的csv文件。

ETA:在进一步阅读了有关RLimitMEM和RLimitCPU的信息后,我决定将它们从httpd.conf中删除。这允许ini_set('memory_limit','###M')工作,我现在为该特定脚本提供了所需的额外内存。我还将该服务器上的RAM翻了一番。

感谢大家帮助发现这个相当棘手的问题,特别是感谢pcguru,他提出了让我找到解决方案的重要线索。


答案 2

由于服务器只有1 GB的RAM,我倾向于您实际上已经完全耗尽系统内存的可能性。

请参阅此主题。您会得到相同的“PHP致命错误:内存不足”,而不是更常见的“致命错误:允许的内存大小...”。您的错误表明系统根本无法分配更多内存,这意味着即使PHP:的内部函数也无法分配更多内存,更不用说您自己的代码了。

PHP如何配置为与Apache一起运行?作为模块还是作为CGI?您可以同时运行多少个PHP进程?是否有可用的交换空间?

如果你在Apache中使用PHP作为模块,Apache有一个令人讨厌的习惯,即保留PHP进程分配的内存。猜测,因为它无法重新启动工作线程中的PHP模块,只需完全重新启动工作线程即可。每个为 PHP 提供服务的工作线程都会随着时间的推移而增长到 PHP 内存限制,因为该工作线程会提供分配大量 RAM 的脚本。因此,如果您同时有许多工作线程,每个工作线程使用100 MB +,则RAM将很快耗尽。尝试限制 Apache 中同时工作线程的数量。


推荐