写在最前面
如果你买了一本PHP的书, 它告诉你: "不用在PHP主动释放资源, 因为PHP会帮你释放"的话, 我建议你, 烧了它.
请手动释放你的资源(Please release resources manually)
问题
内存使用:2259.38M, pid:62602, 类名:app\report\task\ReportSalesDailyByEditorTask:6553, 服务器:common, 请相关人员处理。
一段报表的循环代码占用了2.2G内存
/**
* 手动释放资源
*/
$allJobUser = null;
每个select查询结果的地方都手动释放了一下,内存使用量一下子降到512M以下
测试代码
<?php
$s = str_repeat('1',1024);
$b = &$s;
$mem_1 = memory_get_usage(); //获取当前占用内存
echo $mem_1 . "<br>";
unset($s);
// $s = null;
$mem_2 = memory_get_usage(); // 再查看当前占用内存
echo $mem_2 . "<br>";
echo $mem_1 - $mem_2 ;
结果分析
1、将 $s = null 注释
237280
237328
-48
2、将 unset 注释
237680
236768
912
结论
1. unset只是变量计数器减1,,当计数器为0的时候会触发回收
2. $s=null 会直接触发回收