【问题标题】:Find out if PHP ran out of memory查看 PHP 是否内存不足
【发布时间】:2014-01-28 09:28:50
【问题描述】:

是否可以(以编程方式)查明当前 PHP 进程是否即将耗尽内存?

一些背景

我是Bulk Delete WordPress plugin的作者,它允许人们批量删除帖子、用户等。

我从插件用户那里得到的一个常见抱怨是,他们在尝试删除大量帖子时得到一个空白页面。发生这种情况是因为 PHP 内存不足。

如果我能发现PHP进程即将耗尽内存,那么我可以尝试批量删除或者至少给用户一个警告,而不是仅仅抛出一个空白页。

【问题讨论】:

  • “如果我看到它会崩溃,我可以做一些不同的事情......” - 你为什么不从一开始就做不同的事情呢?我看不出这种过程开始需要使用大量内存的内在原因。
  • @deceze 我的插件需要从数据库中检索记录,而这正是它大部分内存不足的地方。在检索这些记录之前,我不知道返回记录的大小。此外,我的插件代码将在具有不同配置的各种服务器中运行。所以我不能仅仅根据可用内存限制将返回的行数。
  • 当然,如果你可以做不同的事情,为什么不考虑已经消耗的内存,做不同的事情呢?我猜你是在一次将所有记录都塞进内存——你不必那样做,对吗?
  • 好吧,我必须使用内置的 WordPress 功能。所以我没有太多控制如何检索或存储内存中的记录期望指定我可以检索多少。我试图看看我是否可以以某种不同的方式做到这一点,但在这种情况下似乎没有任何其他选择。这就是为什么我想知道我是否可以通过编程方式检测到这一点。
  • 嗯,直接的答案是:不是真的。一旦 PHP 内存不足,您将无能为力,因为您已经内存不足。如果您甚至无法估计要获得多少数据,您就无法知道何时会耗尽内存。所以你能做的唯一也是最好的事情就是改变你的算法,从一开始就使用尽可能少的内存。

标签: php memory-management out-of-memory


【解决方案1】:

经过更多研究,我找到了解决方案。解决方法是使用register_shutdown_function

一个缺点是这个函数会在 PHP 内存不足而不是 before 之后执行(这对我来说仍然很好,因为我可以让用户了解一下)

【讨论】:

  • 谢谢。我希望您可以在答案中添加更多信息。你在关机时到底做了什么来检测你的插件是否内存不足?您是否使用了 error_get_last()?实际上,您的回答并没有完全回答您的问题,并且在 grepping 插件的源代码之后,我没有看到任何提及“关闭”的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2012-10-25
相关资源
最近更新 更多