Memory PHP内存不足错误,即使未达到内存限制

Memory PHP内存不足错误,即使未达到内存限制,memory,php,php-ini,Memory,Php,Php Ini,我刚刚继承了一个带有PHP脚本的站点,它的内存一直在117MB以下。甚至当我通过PHP.ini将PHP的memory_limit变量增加到312MB时,也会发生这种情况 多亏了pcguru的一条重要线索,这一问题现在得以解决。请参见下面开始的答案:我终于找到了答案 ini\u get('memory\u limit')返回php.ini中设置的值,因此我确定Apache在更改该值后已重新启动。我正在使用memory\u get\u usage(true)返回脚本在过程中各个点消耗的内存。当它达到

我刚刚继承了一个带有PHP脚本的站点,它的内存一直在117MB以下。甚至当我通过PHP.ini将PHP的memory_limit变量增加到312MB时,也会发生这种情况

多亏了pcguru的一条重要线索,这一问题现在得以解决。请参见下面开始的答案:我终于找到了答案

ini\u get('memory\u limit')
返回php.ini中设置的值,因此我确定Apache在更改该值后已重新启动。我正在使用
memory\u get\u usage(true)
返回脚本在过程中各个点消耗的内存。当它达到117MB时,它总是失败

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

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

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

编辑以添加:

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

2) Suhosin肯定没有安装。我在多个地方进行了检查,包括运行脚本、检查常量和运行php-v

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


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

这可能不是问题的答案,但如果从命令行运行PHP,则可以覆盖PHP.ini中的内存限制

php -d memory_limit=321M my_script.php
我不确定通过cli的默认内存限制是多少


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

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

这并不能解释为什么您的脚本在特定内存使用后会消亡,但您可以通过完全删除php脚本本身的内存限制来解决此问题:

ini_set('memory_limit', '-1');
这是危险的。如果您有一个失控的脚本,PHP将占用内存,直到您的服务器没有剩余的内存可分配并崩溃。因此,只有在确定脚本本身没有问题的情况下才应该使用它,并且只用于测试输出


至于PHP是否对每个脚本的内存使用有一定限制,没有。我个人运行的脚本内存使用量接近1GB。

由于服务器只有1GB的RAM,我倾向于系统内存完全耗尽的可能性

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

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


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

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

凭直觉,我想看看Apache是否有自己的内存限制,因为这些限制可能会影响PHP分配内存的能力。在httpd.conf的顶部,我找到了这样一条语句:rlimitmem204535125

这是whm/cpanel放在那里的。根据以下网页,whm/cpanel在虚拟服务器上错误地计算其值。。。

内存不足的脚本大部分时间都在运行,因此我将RLimitMEM增加到268435456(256 MB),然后重新运行脚本。它完成了阵列合并并生成了csv文件供下载

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


感谢大家在发现这一棘手问题时给予的帮助,尤其是pcguru,他提出了让我找到解决方案的关键线索。

您看到的错误到底是什么?也许你会被“试图分配xxx字节”所迷惑,因为它拥有最新的PHP5.3版本。你有没有可能得到suhosin补丁?我知道这是离题的,但是你用需要分配300mb内存的PHP做什么呢?这比典型的PHP脚本要多得多。需要这种RAM有很多很好的理由,所以我不想批评,但我想知道更多,因为我见过很多情况,人们编写PHP程序,在内存中加载大量数据时效率更高(通常也更快)一次只加载一点数据。php--ini返回:配置文件(php.ini)路径:/usr/local/lib加载的配置文件:/usr/local/lib/php.ini扫描:(无)解析的其他.ini文件:(无)另外-我无法从提示符运行脚本,因为崩溃的部分需要几个post变量。不幸的是,它非常复杂,使用大规模阵列的原因对我来说毫无意义。在我看来,它应该使用临时表,并将最终结果发送到PHP。但同时,如果我能给它198MB,它将