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

And*_*rew 20 php memory-management

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

Jon*_*Jon 37

黄金法则

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

例子:

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

这并不总是PHP中最方便的东西(数组不会削减它,并且有很多代码只适用于数组),但在最近的版本中,尤其是在引入生成器之后,它比以往更容易流式传输数据而不是分块.

遵循这种做法,宗教上也将"自动"为你处理其他事情:

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

其他事情要做

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