关于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

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

1、盲猜是 excel 读取占用内存过大,解决方式:Excel 扩展
2、问题定位思路:排除法

  • 可能是 DB 查询导致内存累积,数据源换成大数组,硬编码进 job 测试内存增长情况
  • 可能是 Excel 读取导致的内存累积,去掉 DB 相关业务逻辑,纯测试 Excel 读取内存增长情况
2年前 评论
weiss_schnee (楼主) 2年前
weiss_schnee (楼主) 2年前

1 手动执行task,看看是否正常;2 看看有没有分批读取的接口,每次读一部分,循环读

2年前 评论
weiss_schnee (楼主) 2年前
第五焱陽

获取数据的时候使用chunk() 分块获取好像可以解决数量过大一次查询的情况

2年前 评论
weiss_schnee (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!