即使没有达到memory_limit,PHP也会出现内存错误

use*_*109 21 php memory php-ini

我刚刚继承了一个带有PHP脚本的站点,该脚本一直耗尽117 MB的内存.即使我将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是版本5.1.66-cll.

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

编辑添加:

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

2)绝对没有安装Suhosin.我检查了多个地方,包括运行脚本并检查常量和运行php -v

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

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

use*_*109 20

我终于找到了答案.线索来自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.


old*_*ard 8

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

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

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

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