در این پست میخوام استفاده از Chunk در لاراول رو آموزش بدم خدمتتون. زمانی که دادههای زیادی از دیتابیس میخواهید بخوانید (مثلا ۲۰ هزار رکورد) معمولا این عمل تا وسطش که پیش میره، اررور out of memory رو دریافت میکنید. همچین کوئری سرعت برنامه رو هم به شدت کاهش میده. برای همین، روشی در لاراول وجود داره به اسم Chunk که میاد به طور مثال ۲۰۰ تا ۲۰۰ تا میخونه دیتا رو. هم باعث افزایش سرعت میشه، هم فشار کمتری به سرور میاره و اررور out of memory هم دریافت نمیکنید.
مثال زیر رو ببینید:
$users = User::all(); foreach ($users as $user) { $tasks = $user->tasks; // do some processing... }
این همچین خروجی میده به من:
همونطور که میبینید، روی ۸۸٪ اررور داد. خب، این خوب نیستش، برای همین کدم رو اینجوری اصلاح میکنم:
User::chunk(200, function($users) { foreach ($users as $user) { $tasks = $user->tasks; // do some processing... } });
و حالا که لود کنم کد رو همچین مقداری رو میگیرم:
نکته: ما میتونیم eager loading رو با chunk ترکیب کنیم. مثال زیر رو ببینید:
User::with('tasks')->chunk(200, function($users) { foreach ($users as $user) { $tasks = $user->tasks; // do some processing... } });
اینجوری باز هم سرعت لاراول رو افزایش دادیم.
این مورد جزء موارد سادهای هستش که خیلی وقتها توی پروژهها رعایت نمیکنیمش و پروژه که یه مقدار بزرگ شد مجبور میشیم برگردیم و از اول همهی کد رو بخونیم و اصلاح کنیم. بهتره توی کوئریهاتون ازش استفاده کنید. ولی همیشه یادتون باشه، یه اصطلاحی هست به نام Over Optimize . زیاده روی نکنید، چون نتیجهی معکوس میگیرید توی بهینهسازی.
دیدگاهتان را بنویسید