لاراول 13.34 منتشر شد: چند بهبود مهم روی صفها
خلاصهٔ کاملتر
تیم لاراول نسخه 13.34.0 رو منتشر کرده و بیشتر چیزهای تازهاش دور و بر صف و ورکر میگرده: شمردن کرش ورکر بهعنوان exception، خبر دادن به job قبل از timeout، یه property مدت اجرا روی رویداد JobProcessed و آپشن --queue برای queue:flush. چند بهبود کوچکتر هم روی Schema، تست و enumها اومده.
تا قبل از این، اگه یه job یه exception پرت میکرد به حساب $maxExceptions گذاشته میشد، ولی اگه ورکر وسط کار میمرد (کشته شدن بهخاطر کمبود حافظه، segfault یا استاپ شدن کانتینر) هیچجا شمرده نمیشد. نتیجهاش این بود که یه job با retryUntil() و rate limiter میتونست تا رسیدن به deadline همینطور ورکرها رو بکشه. William Julian-Vicary یه attribute به اسم #[CountCrashesAsExceptions] اضافه کرده که هر تلاش کرششده رو یه exception حساب میکنه:
#[MaxExceptions(3), CountCrashesAsExceptions]
class ProcessPodcast implements ShouldQueue
{
public function retryUntil(): DateTime
{
return now()->addHour();
}
}پشت صحنه، ورکر وقتی یه job opt-inشده رو شروع میکنه یه کلید کش مینویسه و آخر تلاش پاکش میکنه. اگه تلاش بعدی اون کلید رو سر جاش ببینه یعنی تلاش قبلی مرده و ورکر اون رو به حساب maxExceptions میذاره. پراپرتی public $countCrashesAsExceptions = true; هم همون کار رو میکنه. چون job باید حتماً مقدار maxExceptions داشته باشه و هر تلاش دو فراخوانی کش اضافه میکنه، این قابلیت پیشفرض خاموشه.
کار دوم رو Jack Bayliss انجام داده: jobهایی که قرارداد Interruptible رو پیاده کردن حالا وقتی به timeout میرسن سیگنال SIGALRM میگیرن. قبلاً سیگنالهایی مثل SIGTERM به این jobها پاس داده میشد، ولی timeout ورکر رو میکشت بدون اینکه اول به job خبر بده. یعنی حالا job فرصت داره قبل از failed شدن پیشرفتش رو ذخیره کنه:
public function interrupted(int $signal): void
{
if ($signal === SIGALRM) {
$this->saveProgress();
}
}رویداد JobProcessed هم یه property به اسم duration گرفته که مدت اجرای job رو به میلیثانیه و با دو رقم اعشار میده، پس دیگه لازم نیست خودت JobProcessing رو گوش بدی و زمان شروع رو نگه داری. وقتی رویداد از جایی غیر از ورکر dispatch بشه مقدارش nullـه. دستور queue:flush هم آپشن --queue گرفته تا مثلاً بعد از قطعی یه API بیرونی، فقط failed jobهای همون صف رو پاک کنی و بقیه سر جاشون بمونن.
چند تغییر کوچکتر هم اومده: Schema::getColumn() جزئیات یه ستون رو مستقیم میده و برای ستونی که وجود نداره آرایه خالی برمیگردونه، assertDatabaseCount() آرایهای از جفت جدول و تعداد قبول میکنه، App::environment() و متد environments() زمانبند دیگه با enum کار میکنن (قبلاً اولی ارور میداد و دومی باعث میشد تسک هیچوقت اجرا نشه)، و Relation::requireMorphMap() سر خوندن رابطههای polymorphic هم اجرا میشه.
نکات کلیدی:
- #[CountCrashesAsExceptions] کرش ورکر رو یه exception حساب میکنه؛ پیشفرض خاموشه
- jobهای Interruptible موقع timeout سیگنال SIGALRM میگیرن و JobInterrupted هم dispatch میشه
- duration روی JobProcessed یه float به میلیثانیه با دو رقم اعشاره و بیرون از ورکر null میشه
- queue:flush --queue=sftp-sync فقط یه صف رو خالی میکنه و با --hours هم ترکیب میشه
- دایرکتیو @env بلید به App::environment() کامپایل میشه، پس enum رو هم قبول میکنه




