لاراول٬ ابزار محبوب و قدرتمند یک ماژول فوق العاده داره به اسم Queue یا صف که قابلیت های بسیار خوبی داره و میتونیم ازش به عنوان یک Worker تو برنامه خودمون استفاده کنیم! به برنامه نویس قدرت خاصی میده٬ مخصوصا زمانی که میخوایم با سرویس دهنده های دیگر در برنامه خودمان کار کنیم. مثل ارسال SMS یا ارسال EMAIL و موارد دیگری که نیاز داریم به سرویس دهنده وصل بشیم و باعث میشه کاربر زمانی رو معطل بمونه تا درخواست رد و بدل بشه و این برای کاربر تجربه خوبی نخواهد شد!
قطعا نیاز داریم مباحث مربوط به ماژول Queue رو در داکیومنت خود لاراول بخونیم و من اینجا در مورد مباحث ابتدایی مثل موارد پایه ای توضیح نمیدم. هدف من به اشتراک گذاشتن تجربیات مفیدی هست که در طی کار باهاشون برخورد کردم و متوجه مفید بودن این موارد در طولانی مدت شدم.
فرض کنید ما یک مدل Post داریم و میخوایم بعد از اینکه این مدل فعال شد (منتشر شد) در سیستم یک کاری انجام بدیم یا یک ایمیلی به کاربر ارسال کنیم.
با استفاده از دستور زیر یک Job ایجاد میکنیم:
php artisan make:job PostJob
به کلاس ایجاد شده مدل Post رو پاس میدیم (میتونیم به صورت مستقیم بعد از ایجاد شدن مدل اینکارو کنیم و یا از Model Observer استفاده کنیم). با کمک SerializesModel trait لاراول میتونیم به کلاس هایی که نیاز داریم مدل بفرستیم که این میتونه خیلی مفید باشه در بعضی موارد مثل Event.
حالا میتونیم در handle function کاری که میخوایم رو انجام بدیم. به این صورت:
if($this->post->status == Post::ACTIVE) { // Do some stuff } else { $this->release(3600); }
متد release() در کد بالا برای زمانی به کار میره که ما میخوایم چندین بار یک مقدار رو چک کنیم. اینجا توی کد میگیم: اگر وضعیت مدل فعال نشده بود٬ ۱ ساعت دیگه بیا و مجدد چک کن که وضعیت فعال شده یا نه.
یک ویژگی دیگه ای که میتونیم ازش برای این بخش استفاده کنیم و خیلی کاربردی هست٬ اضافه کردن یک پارامتر (در ادامه مثال زدم) به کلاس Job هستش.
public $tries = 3 // تعداد دفعاتی که میخواید سیستم مدل رو بررسی کنه
بعد از ۳ بار تلاش اگر مدل یا پست مربوطه فعال نشده بود٬ عملیات این Job مربوط به مدل متوقف میشه.
فایل کامل کلاس PostJob
<?php namespace App\Jobs; use App\Models\Post; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class PostJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * @var int */ public $tries = 3; /** * @var Post */ public $post; /** * Create a new job instance. * * @param Post $post */ public function __construct(Post $post) { $this->post = $post; } /** * Execute the job. * * @return void */ public function handle() { if($this->post->status == Post::ACTIVE) { // Do some stuff } else { $this->release(3600); } } }
امیدوارم مطالب برای شما مفید باشه. آرزوی سلامتی و موفقیت دارم.