Cara Menggunakan Chunk Di Laravel
Catatan basis data aplikasi Anda akan bertambah setiap hari. Sebagai pengembang, kami menghadapi masalah kinerja dan memori server saat bekerja dengan catatan tabel besar. Di blog ini, kami akan memproses catatan tabel besar dan menjelaskan pentingnya metode Chunk Eloquent.
Kami membutuhkan aplikasi demo untuk bekerja dengan rekaman besar.
1. Instalasi Laravel
Seperti biasa, kita akan menginstal Basic Laravel Admin Panel secara lokal. Admin Dasar ini hadir bersama pengguna dengan peran dan izin.
Panel Admin Laravel Dasar didasarkan pada Laravel Sail. Apa itu Sail? Sail adalah solusi bawaan untuk menjalankan proyek Laravel Anda menggunakan Docker.
Lihat https://github.com/balajidharma/basic-laravel-admin-panel#langkah pemasangan dan selesaikan pemasangan.
2. Data demo
Untuk catatan demo, kami akan membuat pengguna tiruan di tabel pengguna menggunakan seeder Laravel. Untuk menghasilkan seeder, jalankan perintah make:seeder Artisan.
./vendor/bin/sail php artisan make:seeder UserSeederINFO Seeder [database/seeders/UserSeeder.php] created successfully.
Buka file seeder yang dihasilkan terletak di database/seeders/UserSeeder.php
dan perbarui dengan kode di bawah ini.
<?phpnamespace Database\Seeders;use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
for ($i=0; $i < 1000; $i++) {
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@gmail.com',
'password' => Hash::make('password'),
]);
}
}
}
Sekarang jalankan seeder menggunakan perintah Artisan di bawah ini. Butuh waktu ekstra untuk menyelesaikan penyemaian.
./vendor/bin/sail php artisan db:seed --class=UserSeeder
Setelah perintah Artisan, verifikasi pengguna yang dibuat di halaman daftar pengguna http://localhost/admin/user
3. Memproses catatan besar
Sekarang kita akan memproses catatan pengguna yang besar. Asumsikan kita perlu mengirim email pemberitahuan penawaran black Friday ke semua pengguna. Biasanya, kami membuat perintah Artisan baru dan mengirimkan email dengan menggunakan tugas scheduler.
Masalah memori
Kami akan mengambil semua pengguna dan mengirim email di dalam setiap loop.
$users = User::all();
$users->each(function ($user, $key) {
echo $user->name;
});
Jika Anda memiliki jutaan catatan atau jika kumpulan hasil Anda memiliki banyak sarana data relasi, server Anda akan menampilkan kesalahan Ukuran memori yang diizinkan dari byte yang habis.
Untuk mengatasi masalah ini kami akan memproses data yang terbatas dengan menyimpan batas di database atau cache.
Contoh: Pertama kali kita mengambil 100 catatan dan menyimpan 100 di tabel database.
Lain kali ambil 100 hingga 200 record dan simpan 200 di database. Jadi metode ini melibatkan pengambilan dan pembaruan tambahan. Selain itu, kami perlu menghentikan pekerjaan setelah memproses semua catatan.
Laravel menyediakan solusi inbuild dari metode chunk Eloquent untuk memproses catatan besar
4. Metode Chunk Laravel Eloquent
Metode pemeriksaan Laravel ELoquent mengambil sebagian kecil hasil sekaligus dan memasukkan setiap Chunk ke dalam Penutupan untuk diproses.
User::chunk(100, function ($users) {
foreach ($users as $user) {
echo $user->name;
}
});
5. Pahami metode Chunk
Saya akan membuat satu fungsi di pengontrol pengguna dan menjelaskan detail metode pemeriksaan.
Buka rute/admin.php dan tambahkan rute di bawah ini
Route::get('send_emails', 'UserController@sendEmails');
Sekarang buka app/Http/Controllers/Admin/UserController.php
dan tambahkan metode sendEmails
.
Tanpa bongkahan:
Setelah menambahkan kode di bawah ini, buka halaman http://localhost/admin/send_emails
public function sendEmails()
{
$users = User::all();
$users->each(function ($user, $key) {
echo $user->name;
});
}
Buka panel kueri Laravel Debugbar. Pilih * dari `pengguna` akan mengambil semua 1000+ catatan.
Dengan metode chunk:
Ganti fungsi yang sama dengan kode di bawah ini dan periksa halaman di browser.
public function sendEmails()
{
User::chunk(100, function ($users) {
foreach ($users as $user) {
echo $user->name;
}
});
}
Metode Chunk menambahkan batas dan memproses semua catatan. Jadi jika menggunakan chunk, ini memproses 100 koleksi record pada saat itu. Jadi tidak ada lagi masalah memori.
6. Apa itu chunkById?
Metode chunkById ini akan secara otomatis memberi nomor pada hasil berdasarkan kunci utama catatan. Untuk memahaminya, perbarui lagi metode sendEmails dengan kode di bawah ini
public function sendEmails()
{
User::chunkById(100, function ($users) {
foreach ($users as $user) {
echo $user->name;
}
});
}
Sekarang id pengguna ditambahkan pada kondisi di mana bersama dengan batas 100.
// chunkById
select * from `users` where `id` > 100 order by `id` asc limit 100
select * from `users` where `id` > 200 order by `id` asc limit 100
select * from `users` where `id` > 300 order by `id` asc limit 100// chunk
select * from `users` order by `users`.`id` asc limit 100 offset 0
select * from `users` order by `users`.`id` asc limit 100 offset 100
select * from `users` order by `users`.`id` asc limit 100 offset 200
ChunkById ini direkomendasikan saat memperbarui atau menghapus catatan di dalam penutupan (dalam lingkaran).
7. Kesimpulan
Metode Chunk Eloquent adalah metode yang sangat berguna saat Anda bekerja dengan catatan besar. Baca juga tentang metode pemeriksaan koleksi.
Terima kasih telah membaca.