在PHP脚本中管理内存的最佳实践?

时间:2011-09-22 15:30:58

标签: php memory-management

内存管理不是大多数PHP开发人员需要考虑的事情。我遇到了一个问题,我的命令行脚本内存不足。它对大量对象执行多次迭代,每次迭代产生多个数据库请求。我确信增加内存上限可能是一个短期解决方案,但我不认为这是一个合适的长期解决方案。我应该做些什么来确保我的脚本没有使用太多内存,并且有效地使用内存?

3 个答案:

答案 0 :(得分:37)

黄金法则

当您遇到(或期望遇到)内存压力时,要做的第一件事是:如果您打算按顺序处理它们,请不要一次读取内存中的大量数据

示例:

  • 不要将内存中的大型结果集作为数组获取;相反,在获取下一个
  • 之前依次获取每一行并处理它
  • 不要在内存中读取大文本文件(例如file);相反,一次读一行

这并不总是PHP中最方便的事情(数组不会削减它,并且很多代码只适用于数组),但在最近的版本中,特别是在引入generators比以往更容易流式传输数据而不是分块数据。

遵循这种做法,宗教会“自动”为你照顾其他事情:

  • 不再需要通过关闭它们并且故意丢失对它们的所有引用来清理占用大量内存的资源,因为没有这样的资源可以开始
  • 完成它们后不再需要取消设置大变量,因为也不会有这样的变量

其他待办事项

  • 小心在循环内创建闭包;这应该很容易,因为创建这样的内部循环是一个糟糕的代码气味。您可以随时向上提起盖子并为其提供更多参数。
  • 当期待大量输入时,请设计您的程序并相应地选择算法。例如,您可以使用恒定的内存量合并任意数量的任意大小的文本文件。

答案 1 :(得分:2)

您可以尝试对其进行分析,对memory_get_usage()进行一些调用,以寻找它达到峰值的位置。

当然,了解代码的真正含义,您将获得更多信息来减少其内存使用量。

答案 2 :(得分:1)

计算大量对象时,请尝试不要一次计算所有对象。步行和处理元素,然后走路,然后释放内存并采用下一个元素。

这需要更多时间,但您可以管理您使用的内存量。