PHP内存溢出详解

相信很多人做大批量数据导出和数据导入的时候,经常会遇到PHP内存溢出的问题,在解决了问题之后,总结了一些经验,整理成文章记录下。

优化点

  1. 优化SQL语句,避免慢查询,合理的建立索引,查询指定的字段,sql优化这块在此就不展开了。
  2. 查询的结果集为大对象时转数组处理,框架中一般有方法可以转,如Laravel中有toArray(),Yii2中有asArray()。
  3. 对于大数组进行数据切割处理,PHP函数有array_chunk()、array_slice()。
  4. 对于大型的字符串和对象,使用引用传递&。
  5. 用过的变量及时unset。
  6. 导出的文件格式由excel改为csv
  7. ini_set('memory_limit',''),设置程序可以使用的内存(不建议这样做)。

思考

内存管理

PHP的内存什么怎么管理的呢?
在学C语言时,开发者是需要手动管理内存。在PHP中,Zend引擎提供为了处理请求相关数据提供了一种特殊的内存管理器。请求相关数据是只需要服务单个请求,最迟会在请求结束时释放数据。

PHP内存溢出详解_第1张图片

防止内存泄漏并尽可能快地释放所有内存是内存管理的重要组成部分。因为安全原因,Zend引擎会释放所有上面提到的API锁分配的内存。

垃圾回收机制

简单说下:

PHP5.3之前,采用引用计数的方式管理。PHP中的变量存在zval的变量容器中,变量被引用的时,引用计数+1,变量引用计数为0时,PHP将在内存中销毁这个变量。但是在引用计数循环引用时,引用计数就不会消减为0,导致内存泄漏。

你可能感兴趣的:(php7面试架构师)