سلام
فرض کنید که 10000 تا رکورد تو یک جدول داریم و اینا رو میخوایم به روز رسانی کنیم همه رو .
چیکار کنیم که به روز رسانی انجام بشه و به سرور فشار نیاد و خطا نگیره .
مثل طوری باشه یه تاخیر بدیم و هر مرحله 50 تا رو به روزرسانی کنه تا اخر بره .
با تشکر
@mostafa.8722
سلام.
می تونید برای آپدیت کردن یک Job و Queue بسازید که کار آپدیت کردن رو در پس زمینه انجام بده.
یکی از راه هاش اینه که این عملیات بصورت دسته دسته بروی رکوردها اعمال بشه نه همگی یکجا. برای این کار هم خود لاراول یک قابلیت داره بنام chunk که توضیحات و مثال هاش رو میتونید از طریق لینک زیر مطالعه کنید:
https://laravel.com/docs/7.x/queries#chunking-results
البته این نکته رو هم باید اضافه کنم که تا حدی بستگی داره به نوع تغییری که میخواید بدید. مثلا اگر قراره فلان فیلد تمام رکوردها برابر یک مقدار ثابت قرار بگیره اصلا نیازی به این کارها نیست و باید کوئری تون رو به شکلی بهینه بنویسید که این عملیات رو با یک کوئری انجام بده. خیلی هم سریع این کار انجام میشه معمولا. ولی همین کار رو به اشتباه میشه از طریق حلقه foreach انجام داد و باعث ایجاد یک کوئری جداگانه به ازای هر یک از رکورد ها بشیم که طبیعتا زمان خیلی بیشتری میبره و به شدت غیربهینه ست.
اما اگر قراره این آپدیت همراه با محاسبه و شرط و شروط باشه، فکر میکنم بهترین گزینه همون chunk باشه. برای اینکه با ارور timeout و بلاتکلیفی کاربر در زمان انجام درخواست هم روبرو نشید معمولا این کار توسط job و queue در پشت صحنه انجام میشه.
بستگی داره به نوع کارتون.
مهندسی یگانه اشاره کردن ، چیزی که مشخصه بیشتر فشار کاری روی dbms ببرید با یک کوئری خوب خیلی منطقی و بهینه هست تا ببرید روی واسطه مثل وب سرویس یا ...
کدهای PHP به شکل پیشفرض synchronous اجرا میشند
پس بهتره به جای فشار آوردن روی سرور همونطور که دوستان گفتند از Job و Queue استفاده کنی.
اما در عین حال در پروژه های بزرگتر که پرفرمنس مهم میشه، میشه از اجرای کدها به شکل asynchronous در PHP استفاده کرد.
که میتونی ابزارهایی مثل Swoole یا ReactPHP رو بررسی کنی
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟