Laravel6.x 中Artisan 命令行中循环调用Artisan::call(),出现内存溢出
1. 环境信息 Laravel6.x,php7.2,centos7
2. Laravel6.x 中Artisan 命令行中循环调用Artisan::call(),出现内存溢出,请问如何解决?
public function handle()
{
for ($circularId = 0; $circularId < 1000; $circularId++){
Log::channel('cron-daily-info')->info('----- ' . memory_get_usage());
Log::channel('cron-daily-info')->info('autoSave:circularCompleted {circularId = ' . $circularId . '}');
\Artisan::call("circular:storeS3", ['id' => $circularId]);
Log::channel('cron-daily-info')->info('===== ' . memory_get_usage());
}
}
得到的结果
1 development.INFO: ----- 28738280
2 development.INFO: ===== 28852216
3 development.INFO: ----- 28852688
4 development.INFO: ===== 28853864
5 development.INFO: ----- 28854928
6 development.INFO: ===== 28856040
7 development.INFO: ----- 28856256
8 development.INFO: ===== 28857448
9 development.INFO: ----- 28859072
10 development.INFO: ===== 28860328
11 development.INFO: ----- 28860480
12 development.INFO: ===== 28861656
13 development.INFO: ----- 28862080
14 development.INFO: ===== 28863192
15 development.INFO: ----- 28863408
16 development.INFO: ===== 28864600
17 development.INFO: ----- 28870576
18 development.INFO: ===== 28871832
19 development.INFO: ----- 28871984
20 development.INFO: ===== 28873160
21 development.INFO: ----- 28873584
22 development.INFO: ===== 28874696
23 development.INFO: ----- 28874912
24 development.INFO: ===== 28876104
25 development.INFO: ----- 28876512
26 //这里有一段调用接口,存取文件的操作
27 development.INFO: ===== 41062856
28 development.INFO: ----- 41063280
29 development.INFO: ===== 41064376
30 development.INFO: ----- 41065184
31 development.INFO: ===== 41070472
32 development.INFO: ----- 41070896
33 development.INFO: ===== 41072024
34 development.INFO: ----- 41072240
35 development.INFO: ===== 41073448
36 development.INFO: ----- 41073792
37 development.INFO: ===== 41075064
在正式环境上已经设置了2048M,但是还会有溢出的情况。
ini_set('memory_limit','2048M');
gc_collect_cycles
内存溢出一般都是静态变量之类的,检查一下被 call 的命令呗,然后执行完命令把不需要的变量释放掉
不一定是框架的问题,你写一个简单的test命令代码来回调看下,里面不做什么操作,先排除这个可能先
可以考虑用new Process('your command')解决内存泄漏也不怕