内存管理不是大多数
PHP开发人员需要考虑的内容.我遇到一个问题,我的命令行脚本的内存不足.它对大量对象执行多次迭代,每次迭代创建多个数据库请求.我相信增加内存上限可能是一个短期的修复,但我不认为这是一个适当的长期解决方案.我应该怎么做才能确保我的脚本没有使用太多的内存,并且有效地使用内存?
黄金法则
当遇到(或期望遇到)内存压力时,最重要的一件事是:如果您打算顺序处理内存,请勿立即读取大量内存中的数据.
例子:
>不要在存储器中获取大型结果集作为数组;而是依次获取每一行,然后在获取下一个行之前处理它
>不要在内存中读取大文本文件(例如使用文件);而是一次读一行
这并不总是PHP中最方便的事情(数组不剪切,并且有很多代码只适用于数组),但是在最近的版本中,特别是在引入generators之后,流媒体数据而不是分块.
遵循这种做法,宗教上也会“自动”照顾你的其他事情:
>不再需要通过关闭它们来清理资源,同时关闭它们并丢失所有对它们的引用,因为没有这样的资源可以开始
>完成之后,不再需要取消设置大变量,因为也不会有这样的变量
其他事情要做
>小心在循环内创建闭包;这应该很容易做到,因为创建这样的内部循环是一个坏的代码气味.您可以随时向上提起封盖,并提供更多参数.>当期望大量输入时,设计您的程序并相应地选择算法.例如,您可以使用常量的内存来合并任意大小的任何大小的文本文件.