Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP脚本中管理内存的最佳实践?_Php_Memory Management - Fatal编程技术网

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

在PHP脚本中管理内存的最佳实践?,php,memory-management,Php,Memory Management,内存管理不是大多数PHP开发人员需要考虑的事情。我遇到了命令行脚本内存不足的问题。它对大量对象执行多次迭代,每次迭代都会发出多个数据库请求。我确信提高内存上限可能是一个短期解决方案,但我不认为这是一个合适的长期解决方案。我应该做些什么来确保我的脚本不会占用太多内存,并有效地使用内存?黄金法则 遇到(或预期会遇到)内存压力时,要做的第一件事是:如果要按顺序处理内存中的大量数据,请不要立即读取它们 示例: 不要在内存中获取作为数组的大型结果集;相反,依次获取每一行,并在获取下一行之前对其进行处理

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

黄金法则 遇到(或预期会遇到)内存压力时,要做的第一件事是:如果要按顺序处理内存中的大量数据,请不要立即读取它们

示例:

  • 不要在内存中获取作为数组的大型结果集;相反,依次获取每一行,并在获取下一行之前对其进行处理
  • 不要读取内存中的大型文本文件(例如,使用
    文件
    );相反,一次读一行
在PHP中,这并不总是最方便的事情(数组不会切割它,并且有很多代码只在数组上工作),但是在最近的版本中,尤其是在引入它之后,流式处理数据而不是分块处理数据比以往任何时候都要容易

虔诚地遵循这一做法也会“自动”为您处理其他事情:

  • 不再需要通过关闭资源并故意丢失对它们的所有引用来清理内存占用量大的资源,因为这样的资源就不存在了
  • 在处理完大变量后,不再需要取消设置它们,因为也不会有这样的变量
其他要做的事情
  • 小心在循环内创建闭包;这应该很容易做到,因为创建这样的内部循环是一种糟糕的代码味道。始终可以向上提起封口并为其提供更多参数
  • 当需要大量输入时,设计您的程序并相应地选择算法。例如,可以使用恒定的内存对任意大小的任意数量的文本文件进行合并排序

在计算大型对象数组时,尽量不要一次计算完所有对象。按步骤走,边走边处理元素,然后释放内存并获取下一个元素


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

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


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

基本上-在每次循环后进行清理。可能会显示一些代码?你在这个循环中没有使用匿名函数,是吗?我以前遇到过这个问题……也许,因为你使用CLI,你可以考虑切换语言。还有其他一些语言不仅内存占用更小(这可能会引起激烈的争论),而且可以让您更好地控制内存使用。我无法在这个项目上切换语言,但感谢您的建议。