PHP命令行脚本忽略php.ini和ini_set('memory_limit',...)指令。

4
我遇到了常见的“致命错误:内存不足(已分配30408704)(尝试分配24字节)…”PHP致命错误。通过Apache提供的页面没有表现出这种行为。
我尝试了以下方法:
  1. 将php.ini中的memory_limit增加到更大的值。
  2. 通过调用ini_set('memory_limit', -1)ini_set('memory_limit', '-1')ini_set('memory_limit', 100000000)ini_set('memory_limit', '128M')等方式,在脚本本身中增加memory_limit。
  3. 使用unset()删除不需要的数组和对象,以鼓励垃圾回收器释放内存。
  4. 联系网站主机。他们通常非常有能力和知识,但是也无法帮助我解决这个问题。
  5. 我尝试使用-c命令行标志显式包含php.ini文件,手动选择具有不同值的特定php.ini文件。
  6. 我尝试在php.ini中使用原始字节数和值(如64M、128M等)设置memory_limit。
  7. 托管提供商可以使用root身份运行脚本而没有任何问题,但在使用我的非root用户运行时遇到了相同的问题。也许涉及某种权限问题?
无论我尝试什么,错误信息都是一样的。似乎我的命令行脚本忽略了对memory_limit的更改。
我倾向于确保我的脚本具有内存效率,但目前我需要通过Simple HTML DOM解析大量HTML,并且在解析器中遇到了内存不足问题。为了减少脚本的内存占用,我尝试使用DOMDocument。但这并没有帮助。实际上,内存不足错误现在在脚本的其他地方触发。
我的问题是:有人经历过这种或类似的问题吗?您有任何建议吗?
谢谢。

好的,这个问题比较困难,但你需要检查你的代码是否存在无限循环。我建议使用分治调试方法。让我给你举个例子,下面这段代码会抛出一个“内存不足”的错误:function returnSomething( $what ) { return returnSomething( $what ); } returnSomething( true ); 运行后会输出 'Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 261900 bytes) in ...' - Dereleased
不行。我的托管账户管理员可以使用root用户运行我的脚本而没有任何问题。此外,我的脚本在我的本地开发机器上也可以正常运行。 - jkndrkn
2个回答

7

事实证明问题是由于服务器启用了shell fork bomb保护,对所有命令行脚本设置了硬内存限制。这是我的网络主机在未告知我的情况下启用的。


3

你在命令行界面上使用的PHP可能会与Apache PHP使用不同的php.ini文件。尝试运行phpinfo()命令并检查它是否使用了你认为的ini文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接