Laravel 8使用Maatwebsite Excel队列导出10万行数据报内存溢出及超时错误如何解决
问题根源与解决方法
你遇到的超时、文件大小停止增长的问题,来自配置错误、代码语法残留以及队列CLI环境配置不匹配几个原因,按以下步骤排查修改即可:
1. 修复队列任务超时与重试配置
MaxAttemptsExceededException 报错是因为默认队列任务的最大执行时长、重试次数不匹配大数据导出的需求,直接在 MarkupAccount 类中增加两个属性覆盖默认配置:
class MarkupAccount implements WithMultipleSheets, ShouldQueue { use Exportable; // 新增以下两个属性 public $timeout = 3600; // 任务最大执行时长设为1小时,可根据实际需要调整 public $tries = 1; // 任务仅重试1次,避免重复执行占用资源 protected $year; // 原有代码保持不变 }
启动队列进程时增加--timeout参数和任务配置对齐:
php artisan queue:work --memory=1024 --timeout=3600
2. 修正Laravel Excel配置错误
你之前在config/excel.php中设置的memory_limit => 6000000单位为字节,换算后仅不到6MB,完全无法支撑大数据导出,修改为:
// config/excel.php return [ // 其他配置不变 'memory_limit' => '1024M', 'chunk_size' => 500, // 调小分块大小,减少单次查询内存占用 // 额外增加临时目录配置,避免系统临时目录权限/空间不足 'temporary_files' => [ 'path' => storage_path('tmp/laravel-excel'), ], ];
创建对应的临时目录并赋予写入权限:
mkdir -p storage/tmp/laravel-excel chmod -R 755 storage/tmp
3. 修复代码语法错误
MarkupAccountsYears类的query方法第一行有多余的语法残留>orderBy('TimeMsc');,直接删除该行即可,避免SQL语法异常导致任务中断。
4. 修正CLI端PHP配置
你修改的WAMP下的php.ini是Web请求使用的配置,队列CLI进程加载的是独立的PHP配置文件,执行以下命令查看CLI加载的配置路径:
php --ini
打开对应路径的php.ini文件,修改以下配置:
memory_limit = 1024M max_execution_time = 0
5. 修正Controller中的链式调用逻辑
你当前代码中chain([dump("Done")])的dump方法只能在HTTP请求上下文输出内容,队列执行时没有输出终端,会导致进程异常中断,修改为日志记录或者用户通知逻辑即可:
public function downloadExcl(){ (new MarkupAccount(2021))->queue('test'.time().'.xlsx')->chain([ // 替换为实际的完成逻辑,比如给用户发站内信、写日志等 new \App\Jobs\NotifyExportComplete() ]); }
内容的提问来源于stack exchange,提问作者SWAT 10101
相关产品推荐
相关产品推荐

