laravel-excel如何使用队列导入数据量比较大的excel文件

最近想导入一个数据到系统中,数据有8W多行,使用传统的php-fpm肯定会导入超时。
这个时候需要使用到队列,想请教一下论坛里面有没有相关经验的大佬,指导一下。
比如:会不会内存溢出、超时等

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

laravel-excel中自带了你可以看一下官方文档

namespace App\Imports;

use App\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\RemembersRowNumber;
use Maatwebsite\Excel\Concerns\WithChunkReading;

class UsersImport implements ToModel, WithChunkReading
{
    use RemembersRowNumber;

    public function model(array $row)
    {
        $currentRowNumber = $this->getRowNumber();

        return new User([
            'name' => $row[0],
        ]);
    }

    public function chunkSize(): int
    {
        return 1000;
    }
}
3年前 评论
讨论数量: 12
3年前 评论
91it (楼主) 3年前
yzh52521 3年前
sreio

如果是只导入一次,建议写个临时脚本就行了。将文件转换为csv格式去读数据

3年前 评论

laravel-excel中自带了你可以看一下官方文档

namespace App\Imports;

use App\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\RemembersRowNumber;
use Maatwebsite\Excel\Concerns\WithChunkReading;

class UsersImport implements ToModel, WithChunkReading
{
    use RemembersRowNumber;

    public function model(array $row)
    {
        $currentRowNumber = $this->getRowNumber();

        return new User([
            'name' => $row[0],
        ]);
    }

    public function chunkSize(): int
    {
        return 1000;
    }
}
3年前 评论

最简单的做法就是用navicat导入 你新建一个表 列名字和exce列对应上的 然后navicat导入数据 然后写个脚本循环处理备份数据到你用的数据表中 :smirk:

3年前 评论
91it (楼主) 3年前
随波逐流

可以考虑使用cli
创建命令php artisan make:command ImportCommand , 读取文件导入.

3年前 评论

昨天就遇到这个问题,web方式总是超时,用comand方式可以带进度条且不超时,导入进度慢是因为有查询动作,且没有对应查询的索引,慢的一批。

3年前 评论
91it (楼主) 3年前

建好索引8w行几分钟就ok了。

3年前 评论

如何设置读取的时候仅读取 需要的列呢,导入的文件如果无限扩充列的话,易导致读取过大

3年前 评论

这个可以设置分页量的,比如一次500行,多次读取。再大就建议s3搭配job了

3年前 评论

laravel-excel 有分块导入的功能。导入的时候速度的瓶颈还是在插入数据库的时候,建议一次多插入几条数据比如每次插入五百条。8W数据应该也就二十来秒吧。

3年前 评论
jcc123

不用写代码,使用navicat 能将excel 导入到一张空表中

3年前 评论
91it (楼主) 3年前

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