Hướng dẫn export large data with chunk in laravel excel - xuất dữ liệu lớn với chunk trong laravel excel

Tôi cần phải xuất một lượng lớn hàng để xuất sắc. Tôi đang sử dụng Laravel-Excel. Tôi đã làm theo tất cả các đề xuất được đưa ra trong tài liệu để xuất cơ sở dữ liệu lớn.

// routes/web.php
Route::post['/dashboard/export', [DashboardController::class, 'export']]->middleware['auth'];

// app/Http/Controllers/DashboardController.php
class DashboardController extends Controller
{

    public function export[Request $request]
    {
        $filename = str::random[20].".xlsx";
        [new UsersExport[$request->all[]]]->queue[$filename, 'public']->chain[[
            new NotifyUserOfCompletedExcelExport[request[]->user[],$filename ],
        ]];
        
        return json_encode[[
            'message' => "You will receive email with download link once export is complete."
        ]];
        
    }
}


// app/Exports/UsersExport.php
class UsersExport implements FromCollection, WithHeadings
{
    use Exportable;
    public function __construct[$config]
    {
        
        $this->config = $config;
    }
    
    public function collection[]
    {
        $mains = DB::table['mains']->select['name', 'email', 'designation', 'country', 'university', 'discipline', 'subject', 'school_or_department'];
        


        //filter one
        $one = $this->config['filterOne']['column'];
        if [$one != null] {
            // dd[$one];
            $mains = $mains->where[$one, 'like', $this->config['filterOne']['value'] . "%"];
        }

        $mains = $mains->offset[$this->config['page'] * $this->config['num_entries_per_page']];
        $mains = $mains->limit[$this->config['num_entries_per_page']];
        $mains = $mains->where['delete', 0];
        return $mains->get[];
    }
    
    public function headings[]: array
    {
        return [
            'NAME', 'EMAIL', 'DESIGNATION', 'COUNTRY', 'UNIVERSITY', 'DISCIPLINE', 'SUBJECT', 'SCHOOL_OR_DEPARTMENT'
        ];
    }
}

Rõ ràng bạn có thể thấy, tôi đang xếp hàng xuất khẩu. Tôi chạy lệnh trong thiết bị đầu cuối.

php artisan queue:work

Nó cung cấp đầu ra như dưới đây cho số lượng lớn các hàng [30000], sau đó xếp hàng: thoát khỏi công việc.queue:work exits.

[2021-11-12 05:13:56][151] Processing: Maatwebsite\Excel\Jobs\QueueExport
[2021-11-12 05:14:17][151] Processed:  Maatwebsite\Excel\Jobs\QueueExport
[2021-11-12 05:14:25][152] Processing: Maatwebsite\Excel\Jobs\AppendDataToSheet
[2021-11-12 05:14:39][152] Processed:  Maatwebsite\Excel\Jobs\AppendDataToSheet
.
.
.
.
[2021-11-12 05:17:48][167] Processed:  Maatwebsite\Excel\Jobs\AppendDataToSheet

Tôi nghĩ về việc thay đổi giới hạn bộ nhớ PHP trong tệp php.ini

memory_limit = 512M

Tuy nhiên, nó không hoạt động.

Đối với số lượng nhỏ hàng đợi hàng: Công việc hoạt động đúng [không thoát] và đầu ra được đưa ra dưới đây.

[2021-11-12 03:21:19][112] Processing: Maatwebsite\Excel\Jobs\QueueExport
[2021-11-12 03:21:22][112] Processed:  Maatwebsite\Excel\Jobs\QueueExport
[2021-11-12 03:21:24][113] Processing: Maatwebsite\Excel\Jobs\AppendDataToSheet
[2021-11-12 03:21:26][113] Processed:  Maatwebsite\Excel\Jobs\AppendDataToSheet
[2021-11-12 03:21:27][114] Processing: Maatwebsite\Excel\Jobs\AppendDataToSheet
[2021-11-12 03:21:28][114] Processed:  Maatwebsite\Excel\Jobs\AppendDataToSheet
[2021-11-12 03:21:29][115] Processing: Maatwebsite\Excel\Jobs\CloseSheet
[2021-11-12 03:21:30][115] Processed:  Maatwebsite\Excel\Jobs\CloseSheet
[2021-11-12 03:21:30][116] Processing: Maatwebsite\Excel\Jobs\StoreQueuedExport
[2021-11-12 03:21:31][116] Processed:  Maatwebsite\Excel\Jobs\StoreQueuedExport
[2021-11-12 03:21:31][117] Processing: App\Jobs\NotifyUserOfCompletedExcelExport
[2021-11-12 03:21:35][117] Processed:  App\Jobs\NotifyUserOfCompletedExcelExport

Câu hỏi của tôi là :-

-> Làm thế nào tôi có thể xuất một số lượng lớn các hàng như vậy?

-> Tôi đang làm gì sai?

-> Có cách nào thay thế để đạt được giống nhau không?

-> Tôi có nên tạo một dịch vụ riêng để xuất dữ liệu trong Excel bằng một số ngôn ngữ khác không?

-> Có phải là một ý tưởng tốt để thực hiện xử lý nặng như vậy trên máy chủ đầu tiên sản xuất không?

Nhập một tệp lớn có thể có tác động rất lớn đến việc sử dụng bộ nhớ, vì thư viện sẽ cố gắng tải toàn bộ trang tính vào bộ nhớ.

Để giảm thiểu sự gia tăng này trong việc sử dụng bộ nhớ, bạn có thể sử dụng mối quan tâm của WithChunkReading. Điều này sẽ đọc bảng tính trong các khối và giữ cho việc sử dụng bộ nhớ được kiểm soát.

namespace App\Imports;

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

class UsersImport implements ToModel, WithChunkReading
{
    public function model[array $row]
    {
        return new User[[
            'name' => $row[0],
        ]];
    }
    
    public function chunkSize[]: int
    {
        return 1000;
    }
}

1234567891011121314151617181920
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Kích thước chunk của

php artisan queue:work
0 sẽ không phải là tình huống tối ưu nhất cho việc nhập khẩu của bạn. Chơi xung quanh với con số này để tìm điểm ngọt ngào.

# Sử dụng nó cùng với các phần chèn hàng loạt

Tình huống lý tưởng nhất [liên quan đến tiêu thụ thời gian và bộ nhớ] bạn sẽ tìm thấy khi kết hợp các phần chèn hàng loạt và đọc khối.

namespace App\Imports;

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

class UsersImport implements ToModel, WithBatchInserts, WithChunkReading
{
    public function model[array $row]
    {
        return new User[[
            'name' => $row[0],
        ]];
    }
    
    public function batchSize[]: int
    {
        return 1000;
    }
    
    public function chunkSize[]: int
    {
        return 1000;
    }
}

1234567891011121314151617181920212223242526
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# Theo dõi số hàng

Nếu bạn cần số hàng, bạn có thể sử dụng đặc điểm

php artisan queue:work
1.

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;
    }
}

12345678910111213141516171819202122232425
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

Ghi nhớ số hàng chỉ dành cho nhập khẩu tomodel.

Nếu bạn chỉ cần thông tin về phần bù của khối, bạn có thể sử dụng đặc điểm

php artisan queue:work
2.

namespace App\Imports;

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

class UsersImport implements ToModel, WithChunkReading
{
    use RemembersChunkOffset;

    public function model[array $row]
    {
        $chunkOffset = $this->getChunkOffset[];

        return new User[[
            'name' => $row[0],
        ]];
    }
    
    public function chunkSize[]: int
    {
        return 1000;
    }
}

12345678910111213141516171819202122232425
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

Bài Viết Liên Quan

Chủ Đề