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

2022-08-30 17:39:37

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


答案 1

黄金法则

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

例子:

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

这在PHP中并不总是最方便的事情(数组不会削减它,并且有很多代码仅适用于数组),但是在最新版本中,特别是在引入生成器之后,流式传输数据比以往任何时候都容易。

虔诚地遵循这种做法将“自动”为你照顾其他事情:

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

其他要做的事情

  • 小心在循环内创建闭包;这应该很容易做到,因为创建这样的内部循环是一种难闻的代码气味。您始终可以将闭包向上抬起并为其提供更多参数。
  • 当期望大量输入时,请设计程序并相应地选择算法。例如,可以使用恒定的内存量对任意数量的任意大小的文本文件进行合并排序。

答案 2

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

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


推荐