关于laravel队列和excel读取的问题
也不用贴代码..
问题已经定位了 大概率是job内存问题 就是不知道怎么解决 用了try catch
环境:windows+phpstudy
队列:database的job
正题:
功能需求需要用队列来读取一个10w行excel的文件并执行
但是读取完成后队列会自动关闭没有任何的报错信息,执行时间10秒以内,有时候会有尝试重复次数.
大多数是执行完一次读取后 就自动断掉队列 需要重新启动又能正常读取一次
代码应该是没错的,因为没有任何错误日志
[2021-05-11 15:21:26] local.INFO: data:{"company_id":"3","page":18,"page_size":1000,"page_count":19,"file_address":"F:\\WWW\\huanuo_code\\new_second_standard\\public\\gate_role_excel\\1620717676767_22262.xls","is_url":1,"user_account":"admin","log_type":"GateRole","is_import":1,"user_ip":"192.168.0.66"}
[2021-05-11 15:21:26] local.INFO: 执行时间:2021-05-11 15:21:26
[2021-05-11 15:21:26] local.INFO: 内存使用:46 mb
[2021-05-11 15:21:27] local.INFO: 内存使用:46 mb
[2021-05-11 15:21:27] local.INFO: 内存使用:46 mb
[2021-05-11 15:21:27] local.INFO: 结束时间:2021-05-11 15:21:27
[2021-05-11 15:21:27] local.INFO: data:{"company_id":"3","page":19,"page_size":1000,"page_count":19,"file_address":"F:\\WWW\\huanuo_code\\new_second_standard\\public\\gate_role_excel\\1620717676767_22262.xls","is_url":1,"user_account":"admin","log_type":"GateRole","is_import":1,"user_ip":"192.168.0.66"}
[2021-05-11 15:21:27] local.INFO: 执行时间:2021-05-11 15:21:27
[2021-05-11 15:21:27] local.INFO: 内存使用:46 mb
[2021-05-11 15:21:27] local.INFO: 内存使用:46 mb
[2021-05-11 15:21:27] local.INFO: 内存使用:46 mb
[2021-05-11 15:21:27] local.INFO: 结束时间:2021-05-11 15:21:27
------------前面两段是1mb的xls文件,可以正常执行------
------------以下是1.2mb的xlsx文件,读取一次断掉一次------
[2021-05-11 15:21:48] local.INFO: data:{"company_id":"3","page":0,"page_size":1000,"page_count":99,"file_address":"F:\\WWW\\huanuo_code\\new_second_standard\\public\\gate_role_excel\\1620717707714_8318.xlsx","is_url":1,"user_account":"admin","log_type":"GateRole","is_import":1,"user_ip":"192.168.0.66"}
[2021-05-11 15:21:48] local.INFO: 执行时间:2021-05-11 15:21:48
[2021-05-11 15:21:48] local.INFO: 内存使用:46 mb
[2021-05-11 15:21:52] local.INFO: 内存使用:142 mb
[2021-05-11 15:21:52] local.INFO: 内存使用:142 mb
[2021-05-11 15:21:52] local.INFO: 结束时间:2021-05-11 15:21:52
做过的尝试:
1,设置超时执行时间和config/queue.php的超时时间
2,设置memory_limit内存到500m
3,DB::connection()->disableQueryLog(); 禁用query_log,应该不管这个的事情,队列执行里只有读取excel文件的代码了
4,unset和设置变量为null尝试手动释放(结果无用,内存使用无变化)
更新一下常识
5,分别使用2w行2列和10w行2列的excel进行 queue:listen和queue:work 测试:
2w行excel
queue:listen 内存变化 第一次14m->46m 重复 14m->46m;
queue:work 内存变化 第1次:14->46m, 第2次:46m->46m 第3次:46m->46m 第4次:46m->46m;
10w行excel
queue:listen 内存变化 14m->146m 重复 14m->146m
queue:work 内存变化 第1次:14m->146m 队列自动结束(问题就在这,为什么结束了!)
疑问:
对比实际文件只有1m 不知道为什么会吃这么多内存,而且不是任务中途断掉,而是执行完毕之后才退出队列.
思路:
大概是手动释放内存,或者是知道内存消耗的位置…求助ing
1、盲猜是 excel 读取占用内存过大,解决方式:Excel 扩展
2、问题定位思路:排除法
1 手动执行task,看看是否正常;2 看看有没有分批读取的接口,每次读一部分,循环读
获取数据的时候使用chunk() 分块获取好像可以解决数量过大一次查询的情况