Cara Upload Banyak Data Sekaligus Dengan Laravel

Cara Upload Banyak Data Sekaligus Dengan Laravel.Pada tutorial kali ini kita akan membandingkan dua cara pertama menggunakan fungsi mysql LOAD DATA LOCAL dan yang kedua package composer league/csv.Cara pertama adalah yang paling cepat ,yang ada saat ini untuk import csv ukuran besar.

Tetapi terkadang hosting tidak support untuk cara pertama,terutama yang bersifat shared hosting dengan alasan keamanan ucap support hosting.Jadi karena kemaren team medanincode juga terkena kendala kita cari alternatif lain yang sudah dicoba dan lumayan cepat ,menggunakan package league/csv.

Disini kita juga akan membandingkan kecepatan keduanya.Untuk membandingkan kita punya file csv dengan format seperti dibawah ini ,dengan jumlah data 100.000 baris.Kita akan mengukur kecepatan insert dengan menggunakan LOAD DATA LOCAL dan package league/csv.

LOAD DATA LOCAL INFILE

Untuk mengecheck apakah hosting kita support LOAD DATA LOCAL,bisa tulis query dibawah ini di phpmyadmin atau sejenisnya.

SHOW GLOBAL VARIABLES LIKE 'local_infile';

Dan pastikan juga settingan di config/database.php bagian connections mysql pada options ada perintah seperti dibawah ini.

<?php
....
'options'        => extension_loaded('pdo_mysql') ? array_filter([
    PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    PDO::MYSQL_ATTR_LOCAL_INFILE => true,
]) : [],

Untuk penggunaannya LOAD DATA LOCAL di laravel seperti code dibawah ini.

<?php
....
public function store_load(Request $request){
        $pathname = $request->file('report_file')->getPathName();
        $query = '
            LOAD DATA LOCAL INFILE "'.$pathname.'"
            INTO TABLE persons
            FIELDS TERMINATED by \',\'
            OPTIONALLY ENCLOSED BY \'"\'
            LINES TERMINATED BY \'\n\'
            IGNORE 1 LINES
            (@col1,@col2,@col3) 
            set 
            nama="@col1",umur="@col2",jk="@col3"';
        $time_start = microtime(true); 
        $result  = DB::statement($query);
        $time_end = microtime(true);
        $execution_time = ($time_end - $time_start);
        echo '<b>Total Execution Time:</b> '.($execution_time).' seconds';
    }

@col1 sampai @col3 adalah jumlah dari kolom yang akan kita ambil dari csv.FIELDS TERMINATED by adalah jenis separator yang digunakan oleh file csv. IGNORE 1 LINES untuk skip baris pertama dari file csv ,karena hanya berisi judul baris.

league/csv

League/csv sendiri adalah salah satu package untuk mengolah csv di php untuk informasi lebih bisa kunjungi di (https://csv.thephpleague.com/). Untuk instalasinya sama seperti package composer lainnya.

composer require league/csv

Untuk penggunaannya ,pertama tambahkan script dibawah di bagian atas.

<?php
....
use League\Csv\Reader;
....

Kemudian tambahkan script dibawah untuk membaca csv dan insert data.

<?php
....
public function store(Request $request){
    $pathname = $request->file('report_file')->getPathName();
    $csv = Reader::createFromPath($pathname,'r');
    $csv->setDelimiter(",");
    $records = $csv->getRecords();

    $person_data =collect();
    $i=0;
    foreach ($records as $offset => $row) {
        if($i>0){
            $data=[
                'nama'=>$row[0],
                'umur'=>$row[1],
                'jk'=>$row[2],
            ];
            $person_data->push($data);
        }
        $i++;

    }
    $time_start = microtime(true); 
    $chunks = $person_data->chunk(100);
    foreach ($chunks as $chunk)
    {
        Person::insert($chunk->toArray());
    }
    $time_end = microtime(true);
    $execution_time = ($time_end - $time_start);
    echo '<b>Total Execution Time:</b> '.($execution_time).' seconds';
}
....

Untuk league/csv kita juga menggunakan chunk untuk meminimalkan penggunaan memory,ada baiknya juga untuk set memory_limit yang lebih besar jika ingin mengupload file csv berukuran besar.

Perbandingan Kecepatan

Untuk memberikan gambaran lebih jelas tentang perbedaan kecepatan keduanya,saya melakukan masing-masing tes lima kali upload file csv dengan 100.000 data.Berikut hasil dari keduannya.

LOAD DATA LOCAL INFILE

league/csv

Percobaan dilakukan di laptop yang sama dengan data yang sama.Sekian tutorial kali ini,jika ada yang kurang jelas bisa ditanyakan dibawah.Kalau diatas susah gak ada kolom komentar.