【问题标题】:PHP Out of Memory ExceptionPHP 内存不足异常
【发布时间】:2014-01-03 16:52:44
【问题描述】:

我有一个将永远运行的 PHP 程序(不是网页或套接字服务器)。在处理超过 1000 个请求后,程序最终由于内存不足异常而崩溃。

这是link to my project

这是link to my program

我不确定为什么会发生这种情况,我尝试在程序中处理请求的函数(onMessage)中使用垃圾收集函数,但它不会导致任何更改。任何建议将不胜感激。

【问题讨论】:

  • 检查您的代码是否存在内存泄漏。他们可能不容易找到。 PHP 通常不作为守护进程运行,因此您可能会遇到意外情况。至少让你可以停止/启动/重生你的守护进程。
  • 1.检查程序特定点的内存使用情况 2. 增加memory_limit(); 3. 检查garbage collector 是否启用

标签: php memory


【解决方案1】:

投入大量精力,您也许可以暂时缓解这种情况。但最终你将无法运行非终止的 PHP 应用程序。

查看PHP is meant to die。本文讨论了 PHP 的内存处理(以及其他内容),并特别关注为什么所有长时间运行的 PHP 进程最终都会失败。部分摘录:

有几个问题使 PHP 成为了错误的工具。请记住,无论您如何努力,PHP 都会死。首先,存在内存泄漏问题。一旦不再使用,PHP 就不再关心释放内存,因为一切都会在最后被释放 - 通过死亡。在一个持续运行的进程中,这将缓慢地增加分配的内存(实际上是浪费的内存),直到达到 PHP 的 memory_limit 值并在没有警告的情况下终止您的进程。你没有做错任何事,只是期望这个过程永远存在。在负载下,将“慢”部分替换为“相当快”。

“不要浪费内存”方面有所改进。可悲的是,它们还不够。随着事情变得复杂或负载增加,它会崩溃。

【讨论】:

  • 谢谢你,克里斯,我想我必须使用更可靠的语言。
  • PHP 垃圾收集器怎么样?
  • @DanFromGermany,将 PHP 作为守护程序运行时还面临其他挑战,其中一些在同一篇文章中进行了概述。我并不是说这是不可能的(ReactPHP 的人已经取得了一定的成功),但这非常困难。
  • 我一直在阅读文章,我不太同意,.. PHP 不适合用作极端守护进程,但它们可以与 gc 收集器、forks/process 一起使用控制(pcntl)。其他服务器和游戏也做维护,每周重启什么的,所有语言都一样,不仅仅是PHP。您不能分配比可用内存更多的内存,因此您必须以任何语言处理它。我的意见:)
  • @DanFromGermany “你不能分配比可用内存更多的内存,所以你必须用任何语言处理它。”非常正确,但有些语言在这方面比其他语言更好。对于长时间运行的进程,PHP 并不是一种很好的语言。 我的意见:-)。
猜你喜欢
  • 2010-10-05
  • 1970-01-01
  • 2010-12-21
相关资源
最近更新 更多