使用laravel-excel与Laravel队列导入100万行Excel数据失败求助
解决Laravel-Excel大文件导入Nginx超时问题
你的问题核心是当前代码没实现真正的异步处理:Excel::import()会同步把100万行数据全加载到内存,再丢给队列——这一步就已经超出Nginx的连接超时限制了,改PHP执行时间没用,因为Nginx自身有独立的超时规则。
下面是具体解决步骤:
1. 改用Laravel-Excel自带的队列分片导入
不要手动dispatch队列,用包原生的队列导入功能,它会分片读取文件,避免一次性加载全量数据:
修改LeadsImport类
让类实现WithChunkReading和ShouldQueue接口,指定单次处理的行数:
use Maatwebsite\Excel\Concerns\ToCollection; use Maatwebsite\Excel\Concerns\WithChunkReading; use Illuminate\Contracts\Queue\ShouldQueue; class LeadsImport implements ToCollection, WithChunkReading, ShouldQueue { // 每次处理1000行,可根据服务器配置调整(比如500或2000) public function chunkSize(): int { return 1000; } public function collection(Collection $rows) { // 在这里处理单批行数据,比如批量插入数据库 foreach ($rows as $row) { // 你的业务逻辑示例: // Lead::create([ // 'col1' => $row[0], // 'col2' => $row[1], // // ... 对应50列的字段 // ]); } } }
修改控制器代码
直接用queueImport方法,包会自动把分片任务推送到队列:
public function import(Request $request) { Excel::queueImport(new LeadsImport, $request->file); return response()->json(['message' => '导入任务已提交,将在后台处理']); }
2. 调整Nginx超时配置
修改你的Nginx站点配置文件,延长超时时间(比如设置为300秒):
server { # 其他原有配置... proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; fastcgi_connect_timeout 300s; fastcgi_send_timeout 300s; fastcgi_read_timeout 300s; }
修改后重启Nginx:sudo systemctl restart nginx
3. 优化服务器和队列运行配置
- 确保队列Worker正常运行:执行
php artisan queue:work,生产环境推荐用Supervisor管理Worker,防止进程意外退出 - 调高PHP内存限制:在php.ini中设置
memory_limit = 256M(或更高,根据服务器内存调整) - 优先用CSV文件导入:XLSX解析比CSV更耗资源,大文件转成CSV能降低解析压力
内容的提问来源于stack exchange,提问作者Md. Mostafijur Rahman
相关产品推荐
相关产品推荐

