نسخه:

صف ها

پیکربندی

مولفه Laravel Queue یک API یکپارچه را در میان انواع خدمات صف مختلف ارائه می دهد. صف‌ها به شما این امکان را می‌دهند که پردازش یک کار وقت‌گیر، مانند ارسال ایمیل را به زمان دیگری موکول کنید، بنابراین سرعت درخواست‌های وب به برنامه شما را به شدت افزایش می‌دهد.

فایل پیکربندی صف در ذخیره می شود config/queue.php . در این فایل پیکربندی های اتصال برای هر یک از درایورهای صف موجود با فریمورک را خواهید یافت که شامل یک پایگاه داده، Beanstalkd ، IronMQ ، Amazon SQS ، Redis ، null، و درایور همزمان (برای استفاده محلی) است. راننده null صف به سادگی کارهای در صف را کنار می گذارد تا هرگز اجرا نشوند.

جدول پایگاه داده صف

برای استفاده از database درایور صف، به یک جدول پایگاه داده برای نگهداری کارها نیاز دارید. برای ایجاد مهاجرت برای ایجاد این جدول، queue:table دستور Artisan را اجرا کنید:

php artisan queue:table

سایر وابستگی های صف

وابستگی های زیر برای درایورهای صف فهرست شده مورد نیاز است:

  • آمازون SQS: aws/aws-sdk-php
  • Beanstalkd: pda/pheanstalk ~3.0
  • IronMQ: iron-io/iron_mq ~1.5
  • ردیس: predis/predis ~1.0

استفاده پایه

فشار دادن یک کار بر روی صف

تمام کارهای قابل صف برای برنامه شما در App\Commands دایرکتوری ذخیره می شوند. می توانید با استفاده از Artisan CLI یک دستور جدید در صف تولید کنید:

php artisan make:command SendEmail --queued

برای فشار دادن یک کار جدید در صف، از Queue::push روش استفاده کنید:

Queue::push(new SendEmail($message));

توجه: در این مثال، ما از Queue نما به طور مستقیم استفاده می کنیم. با این حال، معمولاً شما دستورات صف را از طریق Command Bus ارسال می کنید . Queue ما به استفاده از نما در سراسر این صفحه ادامه خواهیم داد . با این حال، با گذرگاه فرمان نیز آشنا شوید، زیرا از آن برای ارسال دستورات در صف و همزمان برای برنامه شما استفاده می شود.

به طور پیش فرض، make:command دستور Artisan یک دستور "self-handling" تولید می کند، به این معنی که یک handle روش به خود دستور اضافه می شود. این متد زمانی فراخوانی می شود که کار توسط صف اجرا شود. می‌توانید وابستگی‌هایی را که به روش نیاز دارید تایپ کنید handle و ظرف سرویس به‌طور خودکار آنها را تزریق می‌کند:

public function handle(UserRepository $users)
{
//
}

اگر می خواهید دستور شما یک کلاس کنترل کننده جداگانه داشته باشد، باید پرچم را --handler به make:command دستور اضافه کنید:

php artisan make:command SendEmail --queued --handler

App\Handlers\Commands کنترل کننده تولید شده در کانتینر IoC قرار می گیرد و از آن خارج می شود.

تعیین صف / لوله برای یک کار

همچنین می توانید صف / لوله ای را که یک کار باید به آن ارسال شود مشخص کنید:

Queue::pushOn('emails', new SendEmail($message));

انتقال بار یکسان به چندین شغل

اگر نیاز دارید که داده های مشابهی را به چندین کار صف ارسال کنید، می توانید از Queue::bulk روش زیر استفاده کنید:

Queue::bulk([new SendEmail($message), new AnotherCommand]);

تاخیر در اجرای یک کار

گاهی اوقات ممکن است بخواهید اجرای یک کار در صف را به تعویق بیندازید. به عنوان مثال، ممکن است بخواهید شغلی را در صف قرار دهید که 15 دقیقه پس از ثبت نام برای مشتری ایمیل ارسال می کند. با استفاده از روش زیر می توانید این کار را انجام دهید Queue::later :

$date = Carbon::now()->addMinutes(15);
 
Queue::later($date, new SendEmail($message));

در این مثال، ما از کتابخانه تاریخ کربن برای تعیین تاخیری که می‌خواهیم به کار اختصاص دهیم استفاده می‌کنیم. از طرف دیگر، می‌توانید تعداد ثانیه‌هایی را که می‌خواهید به تأخیر بیندازید، به‌عنوان یک عدد صحیح ارسال کنید.

توجه: سرویس Amazon SQS دارای محدودیت تاخیر 900 ثانیه (15 دقیقه) است.

صف و مدل های الکوئنت

اگر کار در صف شما یک مدل Eloquent را در سازنده خود بپذیرد، فقط شناسه مدل در صف سریال قرار می گیرد. هنگامی که کار واقعاً انجام می شود، سیستم صف به طور خودکار نمونه کامل مدل را از پایگاه داده بازیابی می کند. همه اینها برای برنامه شما کاملاً شفاف است و از مشکلاتی که ممکن است از سریال‌سازی نمونه‌های کامل مدل Eloquent ایجاد شود جلوگیری می‌کند.

حذف یک کار پردازش شده

هنگامی که یک کار را پردازش کردید، باید از صف حذف شود. اگر در حین اجرای کار شما استثنایی وجود نداشته باشد، این کار به صورت خودکار انجام می شود.

اگر بخواهید delete یا release کار را به صورت دستی انجام دهید، این Illuminate\Queue\InteractsWithQueue ویژگی دسترسی به کار release و delete روش های صف را فراهم می کند. این release روش یک مقدار واحد را می پذیرد: تعداد ثانیه هایی که می خواهید منتظر بمانید تا کار دوباره در دسترس قرار گیرد.

public function handle(SendEmail $command)
{
if (true)
{
$this->release(30);
}
}

بازگرداندن شغل به صف

اگر در حین پردازش کار یک استثنا ایجاد شود، به طور خودکار در صف بازگردانده می شود، بنابراین ممکن است دوباره تلاش شود. کار تا زمانی که حداکثر تعداد دفعاتی که درخواست شما مجاز کرده است، به انتشار برسد. تعداد حداکثر تلاش ها توسط --tries سوئیچ استفاده شده در دستورات queue:listen یا queue:work Artisan تعریف می شود.

بررسی تعداد تلاش‌های اجرا

اگر در حین پردازش کار یک استثنا رخ دهد، به طور خودکار در صف باز می گردد. می توانید تعداد تلاش هایی که برای اجرای کار انجام شده است را با استفاده از attempts روش زیر بررسی کنید:

if ($this->attempts() > 3)
{
//
}

توجه: Illuminate\Queue\InteractsWithQueue برای فراخوانی این متد، دستور / کنترلر شما باید از این ویژگی استفاده کند .

بسته شدن صف

شما همچنین می توانید یک بسته را روی صف فشار دهید. این برای کارهای سریع و ساده که باید در صف قرار گیرند بسیار راحت است:

فشار دادن بسته شدن بر روی صف

Queue::push(function($job) use ($id)
{
Account::delete($id);
 
$job->delete();
});

توجه: به‌جای در دسترس قرار دادن اشیاء برای بسته‌های در صف از طریق use دستورالعمل، کلیدهای اصلی را پاس داده و مدل‌های مرتبط را دوباره از داخل کار صف خود بکشید. این اغلب از رفتار سریال‌سازی غیرمنتظره جلوگیری می‌کند.

هنگام استفاده از صف‌های فشار Iron.io ، باید از بستن صف‌های احتیاطی بیشتری استفاده کنید. نقطه پایانی که پیام‌های صف شما را دریافت می‌کند باید نشانه‌ای را بررسی کند تا تأیید کند که درخواست واقعاً از Iron.io است. به عنوان مثال، نقطه پایان صف فشار شما باید چیزی شبیه به: https://yourapp.com/queue/receive?token=SecretToken . سپس می‌توانید ارزش رمز مخفی در برنامه خود را قبل از بررسی درخواست صف بررسی کنید.

اجرای شنونده صف

لاراول شامل یک کار Artisan است که مشاغل جدید را با قرار گرفتن در صف اجرا می کند. می توانید این کار را با استفاده از queue:listen دستور زیر اجرا کنید:

راه اندازی شنونده صف

php artisan queue:listen

همچنین می‌توانید تعیین کنید شنونده از کدام اتصال صف استفاده کند:

php artisan queue:listen connection

توجه داشته باشید که پس از شروع این کار، تا زمانی که به صورت دستی متوقف شود، به کار خود ادامه خواهد داد. برای اطمینان از اینکه شنونده صف متوقف نمی شود، می توانید از یک مانیتور فرآیند مانند Supervisor استفاده کنید.

listen برای تنظیم اولویت‌های صف، می‌توانید فهرستی از اتصالات صف با کاما را به فرمان ارسال کنید :

php artisan queue:listen --queue=high,low

در این مثال، کارهای موجود در high اتصال همیشه قبل از انتقال به مشاغل از low اتصال پردازش می شوند.

تعیین پارامتر زمان پایان کار

همچنین می‌توانید مدت زمانی (بر حسب ثانیه) را برای اجرای هر کار تعیین کنید:

php artisan queue:listen --timeout=60

تعیین مدت زمان خواب صف

علاوه بر این، می‌توانید تعداد ثانیه‌های انتظار قبل از نظرسنجی برای مشاغل جدید را مشخص کنید:

php artisan queue:listen --sleep=5

توجه داشته باشید که صف فقط زمانی "خواب" می‌کند که هیچ شغلی در صف نباشد. اگر مشاغل بیشتری در دسترس باشد، صف بدون خواب به کار آنها ادامه می دهد.

پردازش اولین کار در صف

برای پردازش فقط اولین کار در صف، می توانید از queue:work دستور استفاده کنید:

php artisan queue:work

کارگر صف دیمون

همچنین queue:work شامل --daemon گزینه ای برای وادار کردن کارگر صف به ادامه پردازش کارها بدون راه اندازی مجدد فریم ورک است. این منجر به کاهش قابل توجه استفاده از CPU در مقایسه با queue:listen دستور می شود، اما با پیچیدگی اضافی نیاز به تخلیه صف های کارهای در حال اجرا در حین استقرار شما.

برای شروع یک صف کارگر در حالت دیمون، از --daemon پرچم استفاده کنید:

php artisan queue:work connection --daemon
 
php artisan queue:work connection --daemon --sleep=3
 
php artisan queue:work connection --daemon --sleep=3 --tries=3

همانطور که می بینید، این queue:work دستور از اکثر گزینه های موجود برای queue:listen . می توانید از php artisan help queue:work دستور برای مشاهده تمام گزینه های موجود استفاده کنید.

استقرار با Daemon Queue Workers

ساده ترین راه برای استقرار یک برنامه با استفاده از دیمون صف کارگران این است که در ابتدای استقرار برنامه را در حالت تعمیر و نگهداری قرار دهید. این را می توان با استفاده از php artisan down دستور انجام داد. هنگامی که برنامه در حالت تعمیر و نگهداری قرار گرفت، لاراول هیچ کار جدیدی را خارج از صف نمی پذیرد، اما به پردازش کارهای موجود ادامه می دهد.

ساده ترین راه برای راه اندازی مجدد کارگران این است که دستور زیر را در اسکریپت استقرار خود بگنجانید:

php artisan queue:restart

این دستور به همه کارگران صف دستور می دهد که پس از اتمام پردازش کار فعلی خود، مجدداً راه اندازی شوند.

توجه: این دستور برای برنامه ریزی راه اندازی مجدد به سیستم کش متکی است. به طور پیش فرض، APCu برای دستورات CLI کار نمی کند. اگر از APCu استفاده می کنید، apc.enable_cli=1 به پیکربندی APCu خود اضافه کنید.

کدنویسی برای کارگران صف دیمون

کارگران صف Daemon قبل از پردازش هر کار، چارچوب را دوباره راه اندازی نمی کنند. بنابراین، باید مراقب باشید که منابع سنگین را قبل از اتمام کار خود آزاد کنید. به عنوان مثال، اگر در حال دستکاری تصویر با کتابخانه GD هستید، imagedestroy پس از اتمام کار باید حافظه را آزاد کنید.

به طور مشابه، اتصال پایگاه داده شما ممکن است هنگام استفاده توسط دیمون طولانی مدت قطع شود. می‌توانید از این DB::reconnect روش برای اطمینان از اتصال تازه استفاده کنید.

صف های فشاری

صف‌های فشاری به شما این امکان را می‌دهند که از امکانات قدرتمند صف لاراول 5 بدون اجرای هیچ شیطان یا شنونده پس‌زمینه استفاده کنید. در حال حاضر، صف های فشار فقط توسط درایور Iron.io پشتیبانی می شوند . قبل از شروع، یک حساب Iron.io ایجاد کنید و اطلاعات کاربری Iron خود را به config/queue.php فایل پیکربندی اضافه کنید.

ثبت نام مشترک Push Queue

در مرحله بعد، می‌توانید از queue:subscribe دستور Artisan برای ثبت یک URL پایانی استفاده کنید که کارهای صف جدید را دریافت می‌کند:

php artisan queue:subscribe queue_name queue/receive
 
php artisan queue:subscribe queue_name http://foo.com/queue/receive

اکنون، هنگامی که به داشبورد Iron خود وارد می‌شوید، صف فشار جدید خود و همچنین URL مشترک را مشاهده خواهید کرد. می توانید هر تعداد URL را که بخواهید در یک صف معین مشترک شوید. سپس، یک مسیر برای queue/receive نقطه پایانی خود ایجاد کنید و پاسخ را از Queue::marshal روش برگردانید:

Route::post('queue/receive', function()
{
return Queue::marshal();
});

این marshal روش از اخراج کلاس مدیریت کار صحیح مراقبت می کند. برای شلیک کارها به صف فشار، فقط از همان Queue::push روشی که برای صف های معمولی استفاده می شود استفاده کنید.

مشاغل ناموفق

از آنجایی که همیشه همه چیز طبق برنامه پیش نمی رود، گاهی اوقات مشاغل در صف شما با شکست مواجه می شوند. نگران نباشید، این برای بهترین ما اتفاق می افتد! لاراول شامل یک راه راحت برای تعیین حداکثر تعداد دفعاتی است که یک کار باید انجام شود. پس از اینکه یک کار از این مقدار تلاش بیشتر شد، در failed_jobs جدول درج می شود. نام جدول مشاغل ناموفق را می توان از طریق config/queue.php فایل پیکربندی پیکربندی کرد.

برای ایجاد یک مهاجرت برای failed_jobs جدول، می توانید از queue:failed-table دستور زیر استفاده کنید:

php artisan queue:failed-table

--tries با استفاده از سوئیچ روی دستور می توانید حداکثر تعداد دفعاتی که یک کار باید انجام شود را مشخص کنید queue:listen :

php artisan queue:listen connection-name --tries=3

اگر می خواهید رویدادی را ثبت کنید که در صورت شکست یک کار صف فراخوانی شود، می توانید از این Queue::failing روش استفاده کنید. این رویداد فرصتی عالی برای اطلاع تیم خود از طریق ایمیل یا HipChat است .

Queue::failing(function($connection, $job, $data)
{
//
});

همچنین می‌توانید failed روشی را مستقیماً روی یک کلاس شغلی در صف تعریف کنید، که به شما امکان می‌دهد در صورت بروز خطا، اقدامات خاصی را انجام دهید:

public function failed()
{
// Called when the job is failing...
}

اگر شغل شما خودگردان نیست و دارای یک کلاس کنترل کننده مجزا است، failed باید به جای آن روش تعریف شود.

تلاش مجدد مشاغل ناموفق

برای مشاهده تمام کارهای ناموفق خود، می توانید از queue:failed دستور Artisan استفاده کنید:

php artisan queue:failed

این queue:failed دستور شناسه شغل، اتصال، صف و زمان شکست را فهرست می کند. شناسه شغل ممکن است برای امتحان مجدد کار ناموفق استفاده شود. به عنوان مثال، برای امتحان مجدد یک کار ناموفق که دارای شناسه 5 است، دستور زیر باید صادر شود:

php artisan queue:retry 5

اگر می خواهید یک کار ناموفق را حذف کنید، می توانید از queue:forget دستور زیر استفاده کنید:

php artisan queue:forget 5

برای حذف تمام کارهای ناموفق خود، می توانید از queue:flush دستور زیر استفاده کنید:

php artisan queue:flush