【问题标题】:PHP Command-line scripts are ignoring php.ini and ini_set('memory_limit',...) directivesPHP 命令行脚本忽略 php.ini 和 ini_set('memory_limit',...) 指令
【发布时间】:2010-12-17 15:02:55
【问题描述】:

我面临常见的“致命错误:内存不足(分配 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()ing 不需要的数组和对象,以鼓励垃圾收集器释放内存。
  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 ); 将转储'致命错误:允许的内存大小为 134217728 字节已用尽(试图分配 261900 字节)...'跨度>
  • 没有骰子。我的托管帐户管理员能够以 root 用户身份毫无问题地运行我的脚本。此外,我的脚本在我的本地开发机器上运行得很好。

标签: domdocument php simple-html-dom memory-limit


【解决方案1】:

事实证明,问题是由于在服务器上启用了 shell fork 炸弹保护导致所有命令行脚本都设置了硬内存限制。这是我的虚拟主机在我不知情的情况下启用的。

【讨论】:

    【解决方案2】:

    您的 cli 上的 PHP 可能使用与您的 apache php 不同的 php.ini。尝试 phpinfo() 并使用您认为它使用的 ini 文件检查它。

    【讨论】:

      猜你喜欢
      • 2023-02-09
      • 2016-01-19
      • 2013-04-04
      • 2012-04-15
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多