Mostafa Nazar
4 سال پیش توسط Mostafa Nazar مطرح شد
4 پاسخ

به روزرسانی تعداد زیادی رکورد در لاراول

سلام
فرض کنید که 10000 تا رکورد تو یک جدول داریم و اینا رو میخوایم به روز رسانی کنیم همه رو .
چیکار کنیم که به روز رسانی انجام بشه و به سرور فشار نیاد و خطا نگیره .
مثل طوری باشه یه تاخیر بدیم و هر مرحله 50 تا رو به روزرسانی کنه تا اخر بره .
با تشکر


ثبت پرسش جدید
محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 4 سال پیش آپدیت شد
1

@mostafa.8722
سلام.
می تونید برای آپدیت کردن یک Job و Queue بسازید که کار آپدیت کردن رو در پس زمینه انجام بده.


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 4 سال پیش آپدیت شد
1

یکی از راه هاش اینه که این عملیات بصورت دسته دسته بروی رکوردها اعمال بشه نه همگی یکجا. برای این کار هم خود لاراول یک قابلیت داره بنام chunk که توضیحات و مثال هاش رو میتونید از طریق لینک زیر مطالعه کنید:

https://laravel.com/docs/7.x/queries#chunking-results

البته این نکته رو هم باید اضافه کنم که تا حدی بستگی داره به نوع تغییری که میخواید بدید. مثلا اگر قراره فلان فیلد تمام رکوردها برابر یک مقدار ثابت قرار بگیره اصلا نیازی به این کارها نیست و باید کوئری تون رو به شکلی بهینه بنویسید که این عملیات رو با یک کوئری انجام بده. خیلی هم سریع این کار انجام میشه معمولا. ولی همین کار رو به اشتباه میشه از طریق حلقه foreach انجام داد و باعث ایجاد یک کوئری جداگانه به ازای هر یک از رکورد ها بشیم که طبیعتا زمان خیلی بیشتری میبره و به شدت غیربهینه ست.

اما اگر قراره این آپدیت همراه با محاسبه و شرط و شروط باشه، فکر میکنم بهترین گزینه همون‌ chunk باشه. برای اینکه با ارور timeout و بلاتکلیفی کاربر در زمان انجام درخواست هم روبرو نشید معمولا این کار توسط job و queue در پشت صحنه انجام میشه.


مهدی
تخصص : برنامه نویس سرور
@mahdi12 4 سال پیش مطرح شد
1

بستگی داره به نوع کارتون.
مهندسی یگانه اشاره کردن ، چیزی که مشخصه بیشتر فشار کاری روی dbms ببرید با یک کوئری خوب خیلی منطقی و بهینه هست تا ببرید روی واسطه مثل وب سرویس یا ...


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

کدهای PHP به شکل پیش‌فرض synchronous اجرا میشند
پس بهتره به جای فشار آوردن روی سرور همونطور که دوستان گفتند از Job و Queue استفاده کنی.

اما در عین حال در پروژه های بزرگتر که پرفرمنس مهم میشه، میشه از اجرای کدها به شکل asynchronous در PHP استفاده کرد.
که میتونی ابزارهایی مثل Swoole یا ReactPHP رو بررسی کنی


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام