PHP内存不足的错误,即使memory_limit的未达到(PHP out of memory er

2019-07-09 11:36发布

我刚刚继承了一个始终在117 MB运行内存PHP脚本的站点。 当我提高PHP的memory_limit的变量为312 MB,这我通过php.ini中做这甚至发生。

这是现在解决了由于从pcguru一个伟大的线索。 见我的回答如下开头: 我终于找到了答案

ini_get('memory_limit')返回在php.ini中设置的值,所以我敢肯定的Apache修改完毕重新启动。 我使用memory_get_usage(true)返回在沿途各点由脚本消耗的内存。 而且它一直未能当它到达117 MB。

有一些内部PHP限制,我不知道已经永远不会再得到一个单独的脚本分配超过117MB以上?

该服务器有1GB的RAM,并运行CentOS的。 我有root shell访问。 PHP 5.3.18是版本。 MySQL是版本66年1月5日-CLL。

这个脚本是后面的用户名/密码,我不能给它提供公共接入。

编辑补充:

1)感谢所有您的帮助迄今。 你会发现在我的答复如下下的各种答案,特定的用户评论的更多信息。

2)绝对不是安装了Suhosin。 我已经在多个地方,包括运行脚本,并检查常数和运行PHP -v检查

3)Apache的日志有没有我得到的特定错误信息的记录。 日志记录在php.ini接通。 我通过grep的管道输送到搜索整个日志。

4)是否有可能不正确的错误在这种情况下被报道?

Answer 1:

我终于找到了答案。 线索从pcguru的答案出来开始“自服务器只有1 GB的RAM ......”。

在一种预感,我看看阿帕奇是否有它自己的内存限制那些有可能影响到PHP的分配内存的能力。 就在httpd.conf文件的顶部,我发现这样的说法:RLimitMEM 204535125

这是由南国/的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谁与重要线索,让我到解决方案上来。



Answer 2:

由于服务器只有1 GB的RAM我倾向于你已经实际运行的系统内存完全的可能性。

看到这个线程 。 你会得到相同的“PHP致命错误:内存不足”,而不是更常见的“致命错误:允许内存大小...”。 你的错误表示系统无法在所有分配更多的内存,这意味着即使PHP:公司的内部功能无法分配更多的内存,更何况你自己的代码。

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

如果你使用PHP作为Apache中的一个模块,Apache可以将PHP程序分配内存保持的坏习惯。 猜测,因为它不能重新启动工人PHP模块,只需重新启动工人完全。 每个曾PHP工人简单地增长到PHP内存限制随着时间的推移为工人提供的是分配大量的RAM的脚本。 所以,如果你有在同一时间许多工人,每使用100 MB +,你很快就会耗尽RAM。 尝试限制在Apache中同时工人的数量。



Answer 3:

这可能不是回答你的问题,但如果你在命令行运行PHP,你可以从overrite php.ini中的内存限制。

php -d memory_limit=321M my_script.php

我不太确定通过CLI默认的内存限制是什么。

此外,您还可以运行php --ini并检查结果。



Answer 4:

这不是一个答案,为什么你的脚本是在一定的内存使用情况后死亡,但你可以通过完全的PHP脚本本身内取出存储限制绕过它:

ini_set('memory_limit', '-1');

这是危险的。 如果你有一个失控的脚本,PHP会直到你的服务器有没有留下来分配和下降接管内存。 所以,如果你确信脚本本身是没有问题的,只有到测试输出,你应该只使用此。

至于如果PHP对内存使用的一些每个脚本的限制,没有。 我曾亲自跑近1GB的内存使用脚本。



Answer 5:

你在你的代码的某个地方有一个无限循环。



文章来源: PHP out of memory error even though memory_limit not reached