یه تابستون متفاوت با یه تصمیم هوشمندانه! دوره هوش مصنوعی با تخفیف ویژه، فقط با کد AI84 دوره هوش مصنوعی با تخفیف ویژه، فقط با کد AI84
🎯 ثبت نام
بستن تبلیغات
دوره آموزش جامع PHP از صفر تا صد با پروژه‌های عملی

توی دوره رایگان PHP، هر چیزی که برای حرفه‌ای شدن نیاز داری رو یاد می‌گیری! از مفاهیم پایه تا پیشرفته، همراه با یه پروژه واقعی برای ساخت یه سایت مثل آپارات.

مشاهده بیشتر
دوره پروژه‌محور لاراول: ساخت وبسایت خبری از صفر تا صد

توی این دوره با هم یه وبسایت خبری واقعی رو از صفر می‌سازیم! از طراحی دیتابیس و احراز هویت تا ساخت API و یه پنل مدیریت حرفه‌ای، همه رو یاد می‌گیریم و آماده پروژه‌های واقعی میشی!

مشاهده بیشتر

آموزش سرویس Queue و صف بندی عملیات در Laravel

مقدمه

سرویس queue چارچوب نرم افزاری لاراول یک API متحدالشکل ارائه می کند که در چندین queue back-end مختلف مورد استفاده قرار می گیرد. queue ها به شما این امکان را می دهند تا پردازش کارها و عملیات زمان بر همچون ارسال ایمیل را به تعویق انداخته و بدین وسیله سرعت پاسخ دهی به درخواست های ارسالی به اپلیکیشن تحت وب خود را به شکل چشم گیری افزایش دهید.

فایل تنظیمات queue

فایل تنظیمات queue در config/queue.php نگهداری می شود. در این فایل تنظیمات connection برای هر یک از درایورهای queue که با فریم ورک لاراول عرضه می شود از جمله درایور database، Beanstalked، Amazon SQS، Redis و درایور synchronous (برای استفاده ی محلی) یافت می شود.
یک درایور null برای queue نیز در نظر گرفته شده که وظیفه ی آن صرفا حذف queued job ها (عملیات صف بندی شده) می باشد.

پیش نیازهای Driver

درایور Database

جهت استفاده از درایور database به یک جدول نیاز دارید که عملیات و job ها را ذخیره کند. برای ایجاد migration ای که این جدول را ایجاد می کند، فقط باید دستور آرتیزانqueue:table را صدا بزنید. پس از اینکه migration ایجاد شد، می توانید پایگاه داده ی خود را با استفاده از دستورmigrate، ویرایش (migrate) کنید:

1
2
3
php artisan queue:table
php artisan migrate
<button></button>

دیگر نیازمندی ها و Dependency های Queue

dependency های زیر برای queue driver های لیست شده مورد نیاز می باشد:

  • Amazon SQS: aws/aws-sdk-php ~3.0
  • Beanstalkd: pda/pheanstalk ~3.0
  • Redis: predis/predis ~1.0

نوشتن job class ها

ایجاد job class ها

به صورت پیش فرض، تمامی عملیات queueable اپلیکیشن شما در مسیر app/Jobs ذخیره می شوند. با استفاده از رابط خط فرمان (CLI) آرتیزان می توان یک queued job جدید ایجاد کرد:

1
2
                    php artisan make:job SendReminderEmail
<button></button>

دستور فوق یک کلاس جدید در پوشه ی app/Jobs ایجاد می کند و این کلاس ایجاد شده اینترفیسIlluminate\Contracts\Queue\ShouldQueue را پیاده سازی می کند. این کار به لاراول اعلان می کند که عملیات مورد نظر می بایست بجای اینکه همزمان و سنکرون اجرا شود، داخل صف قرار گرفته و در زمان مناسب اجرا شود.

ساختار Job Class

کلاس های job بسیار ساده هستند به طوری که داخل آن ها تنها یک متد handle وجود دارد که زمانی که عملیات توسط queue پردازش می شود، فراخوانی می گردد. برای شروع، نگاه مختصری به یک نمونه job class می اندازیم:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
namespace App\Jobs;
use App\User;
use App\Jobs\Job;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendReminderEmail extends Job implements ShouldQueue
{
   use InteractsWithQueue, SerializesModels;
   protected $user;
   /**
    * Create a new job instance.
    *
    * @param User $user
    * @return void
    */
   public function __construct(User $user)
   {
       $this->user = $user;
   }
   /**
    * Execute the job.
    *
    * @param Mailer $mailer
    * @return void
    */
   public function handle(Mailer $mailer)
   {
       $mailer->send('emails.reminder', ['user' => $this->user], function ($m) {
           //
       });
       $this->user->reminders()->create(...);
   }
}
<button></button>

در این مثال، همان طور که مشاهده می کنید به راحتی یک مدل Eloquent را مسقیم به تابع سازنده (constructor) queued job ارسال می کنیم. به خاطر استفاده ی job مورد نظر از (trait) SerializesModels، مدل های Eloquent (در حین پردازش job) به آسانی serialize وunserialize می شوند. اگر queued job مورد نظر یک مدل Eloquent به عنوان پارامتر ورودی در تابع constructor خود دریافت کرد، در آن صورت تنها شناسه (identifier) مدل در queue سریاله می شود. زمانی که job به معنای واقعی مدیریت شد، سیستم queue نمونه ی کامل مدل را به صورت خودکار مجددا از پایگاه داده بازیابی می کند. این امر از مشکلات برخاسته از serialize کردن کل نمونه ی مدل Eloquent جلوگیری می کند.
متد handle زمانی فراخوانی می گردد که job توسط queue پردازش شود. همان طور که در این مثال مشاهده می کنید، می توانیم به راحتیdependency ها را داخل پرانتز متد handle عملیات (job) مورد نظر اعلان-نوع (type-hint) کنیم. تزریق این dependency ها همان طور که قبلا هم به آن اشاره شد، به صورت اتوماتیک توسط service container لاراول اداره می شود.

رخداد خطا هنگام پردازش عملیات

اگر زمانی که job(عملیات) برای اجرا در queue (صف) پردازش می شود یک خطا (exception) رخ دهد، آنگاه job مورد نظر بار دیگر در صف قرار می گیرد تا مجددا در زمان معین تلاش برای اجرای آن صورت گیرد. در صورت عدم موفقیت اجرای job همین روال ادامه می یابد (بار دیگر عملیات در صف قرار گرفته و امتحان می شود) تا تعداد دفعات تلاش مجدد برای اجرای آن به حداکثر بار مجوزدهی شده و قابل قبول برای برنامه ی شما برسد. حداکثر تعداد تلاش مجدد مجاز توسط گزینه ی --tries در دستورات آرتیزان queue:listen یا queue:work تنظیم می شود.

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

اگر می خواهید عملیات مورد نظر را خود به صورت دستی در صف قرار دهید، در آن صورت بد نیست بدانید مشخصه ی (trait)InteractsWithQueue، که از قبل داخل job class ایجاد شده موجود هست، یک متد به نام release در اختیار شما قرار می دهد. متد مزبور یک آرگومان ورودی دریافت می کند: تعداد ثانیه هایی که می خواهید صبر کنید تا job مورد نظر بار دیگر برای تلاش مجدد در دسترس قرار گیرد:

1
2
3
4
5
6
7
public function handle(Mailer $mailer)
{
   if (condition) {
       $this->release(10);
   }
}
<button></button>

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

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

1
2
3
4
5
6
7
public function handle(Mailer $mailer)
{
   if ($this->attempts() > 3) {
       //
   }
}
<button></button>

قرار دادن job ها در صف

Laravel یک کنترلر پیش فرض دارد که در مسیر app/Http/Controllers/Controller.php قرار داشته و از مشخصه (trait)DispatchesJobs استفاده می کند. این trait تعدادی توابع برای قرار دادن job ها در صف ارائه می دهد که از جمله ی آن می توان به متدdispatch اشاره کرد:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use App\Jobs\SendReminderEmail;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
   /**
    * Send a reminder e-mail to a given user.
    *
    * @param Request $request
    * @param int $id
    * @return Response
    */
   public function sendReminderEmail(Request $request, $id)
   {
       $user = User::findOrFail($id);
       $this->dispatch(new SendReminderEmail($user));
   }
}
<button></button>

DispatchesJobs Trait

گاهی ممکن است لازم باشد یک job را از جایی به غیر از route یا controller اپلیکیشن dispatch کنید. به برای این منظور می توانید مشخصه (trait) DispatchesJobs را در هر یک از کلاس های اپلیکیشن خود برای دسترسی به توابع dispatch آن لحاظ نمایید. در زیر یک کلاس نمونه را می بینید که از این trait استفاده می کند:

1
2
3
4
5
6
7
8
<?php
namespace App;
use Illuminate\Foundation\Bus\DispatchesJobs;
class ExampleClass
{
   use DispatchesJobs;
}
<button></button>

تابع dispatch

یا می توانید تابع سراسری dispatch را صدا بزنید:

1
2
3
4
5
Route::get('/job', function () {
   dispatch(new App\Jobs\PerformTask);
   return 'Done!';
});
<button></button>

مشخص کردن queue معین برای job مورد نظر

می توانید صفی که قرار است job به آن فرستاده شود را خود مشخص نمایید.
با قرار دادن job ها در queue های مختلف می توان آن ها را دسته بندی کرده و حتی اینکه چه تعداد worker به queue های مختلف اختصاص یابد را اولویت بندی نمایید. این کار باعث نمی شود job ها در connection های مختلف، همان طور که در فایل تنظیمات queue تعریف شده، قرار گیرند بلکه سبب می شود عملیات مورد نظر تنها به queue های مشخص و در یک connection واحد تخصیص یابند. جهت تعیین queue دلخواه، کافی است متد onQueue را در نمونه ی job فراخوانی نمایید. متد مذکور توسط trait ای به نام Illuminate\Bus\Queueable ارائه می شود. این trait از قبل در کلاس پایه App\Jobs\Job لحاظ شده است:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use App\Jobs\SendReminderEmail;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
   /**
    * Send a reminder e-mail to a given user.
    *
    * @param Request $request
    * @param int $id
    * @return Response
    */
   public function sendReminderEmail(Request $request, $id)
   {
       $user = User::findOrFail($id);
       $job = (new SendReminderEmail($user))->onQueue('emails');
       $this->dispatch($job);
   }
}
<button></button>

به تاخیر انداختن اجرای job

گاهی لازم می شود اجرای یک عملیات در صف قرار گرفته (queued job) را به تاخیر بیاندازید. برای مثال ممکن است بخواهید یک job که وظیفه ی آن ارسال ایمیل یادآور 5 دقیقه پس از ثبت نام کاربر در سایت است را در صف قرار دهید. برای نیل به این هدف می بایست متد delay (قابل دسترسی از طریق trait Illuminate\Bus\Queueable ) را در job class خود صدا بزنید:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use App\Jobs\SendReminderEmail;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
   /**
    * Send a reminder e-mail to a given user.
    *
    * @param Request $request
    * @param int $id
    * @return Response
    */
   public function sendReminderEmail(Request $request, $id)
   {
       $user = User::findOrFail($id);
       $job = (new SendReminderEmail($user))->delay(60 * 5);
       $this->dispatch($job);
   }
}
<button></button>

در این مثال job ارسال ایمیل را در صف مربوطه تا 5 دقیقه به تاخیر می اندازیم. با گذشت زمان مشخص شده job به worker ها تحویل داده شده و اجرا می شود.

نکته:

سرویس Amazon SQS تا حداکثر 15 دقیقه به شما اجازه می دهد اجرای job را به تاخیر بیاندازید.

job event ها

Job Lifecycle Events

توابع Queue::before و Queue::after به شما این امکان را می دهد تا یک تابع callback (بازفراخوان) ثبت نمایید. این تابع callback درQueue::before، پیش از اینکه queued job شروع و راه اندازی شود فراخوانی می گردد و در Queue::after زمانی که job مورد نظر با موفقیت اجرا شد صدا زده می شود. توابع callback فرصت مناسبی را برای اجرای ثبت گزارش بیشتر (logging)، در صف قرار دادن job های بعدی یا بروز رسانی آماره ها در یک dashboard (داشبورد اطلاعاتی) در اختیار ما قرار می دهند. در زیر یک تابع callback به رخداد مورد نظر (که ازAppServiceProvider لاراول گرفته شده) پیوست می کنیم:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
namespace App\Providers;
use Queue;
use Illuminate\Support\ServiceProvider;
use Illuminate\Queue\Events\JobProcessed;
class AppServiceProvider extends ServiceProvider
{
   /**
   * Bootstrap any application services.
    *
    * @return void
    */
   public function boot()
   {
       Queue::after(function (JobProcessed $event) {
           // $event->connectionName
           // $event->job
           // $event->data
       });
   }
   /**
    * Register the service provider.
    *
    * @return void
    */
   public function register()
   {
       //
   }
}
<button></button>

راه اندازی Queue listener (ناظر صف)

فریم ورک Laravel یک دستور آرتیزان دارد که عملیات و job ها را همین که وارد صف می شوند، راه اندازی می کند. می توان listener را با بهره گیری از دستور queue:listen راه اندازی کرد:

1
2
                    php artisan queue:listen
<button></button>

همچنین می توانید connection ای که listener از آن استفاده می کند را مشخص نمایید:

1
2
                    php artisan queue:listen connection-name
<button></button>

لازم به ذکر است که با آغاز شدن عملیات مورد نظر، اجرا تا زمانی که آن را به صورت دستی متوقف نکرده اید، ادامه می یابد. برای اینکه مطمئن شویدqueue listener همچنان به اجرا ادامه می دهد (متوقف نمی شود)، می توانید از یک ابزار نظارت بر جریان فرایند (process monitor) همچونSupervisor استفاده نمایید.

اولویت بندی Queue ها

می توانید لیستی از queue connection های تفکیک شده توسط ویرگول را به عملیات (job) listen ارسال کرده و بدین وسیله مشخص کنید کدام صف ها از اولویت بیشتر یا کمتری برخوردار هستند:

1
2
                    php artisan queue:listen --queue=high,low
<button></button>

در این مثال آن job هایی که در queue با مقدار high قرار گرفته اند پیش از job هایی که در queue با مقدار low صف بندی شده اند اجرا می شوند.

مقدار دهی پارامتر Timeout عملیات مورد نظر

می توان مدت زمانی (بر حسب ثانیه) که هر job می تواند ادامه (اجازه ی اجرا) داشته باشد را مشخص کنید:

1
2
                    php artisan queue:listen --timeout=60
<button></button>

مشخص کردن مقدار زمان توقف برای گرفتن عملیات جدید

همچنین می توانید تعداد ثانیه هایی که باید queue متنظر بماند و پس از آن job ها را دریافت کند (برای job های جدید poll کند) را مشخص نمایید:

1
2
                    php artisan queue:listen --sleep=5
<button></button>

توجه داشته باشید که queue تنها زمانی موقتا اجرا را متوقف می کند که هیچ job ای در صف برای پردازش و اجرا وجود نداشته باشد. تا زمانی کهjob در صف وجود دارد، queue بدون وقفه به کار خود ادامه می دهد.

پردازش اولین job در queue

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

1
2
                    php artisan queue:work
<button></button>

تنظیم supervisor

همان طور که قبلا گفته شد، Supervisor یک ابزار نظارت بر جریان فرایند در سیستم عامل Linux است. ابزار نام برده دستورات queue:listen وqueue:work را در صورتی که با موفقیت اجرا نشوند، به صورت خودکار مجددا اجرا می کند. به منظور نصب Supervisor بر روی Ubuntu می توانید از دستور زیر کمک بگیرید:

1
2
                    sudo apt-get install supervisor
<button></button>

فایل های تنظیمات Supervisor معمولا در پوشه ی /etc/supervisor/conf.d نگهداری می شوند. داخل این پوشه می توانید هر تعداد فایل تنظیمات که لازم است تعریف کنید. این فایل ها به supervisor اعلان می کنند چگونه فرایند ها را باید نظارت کند. برای نمونه یک فایل laravel-worker.conf ایجاد می کنیم که یک فرایند queue:work را راه اندازی کرده و بر آن نظارت می کند:

1
2
3
4
5
6
7
8
9
10
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --daemon
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
<button></button>

در این مثال فرمان (directive) numprocs به Supervisor دستور می دهد 8 فرایند queue:work راه اندازی کرده و بر تمامی آن نظارت داشته باشد و نیز در صورتی که در اجرا موفق نبودند آن ها را restart کند. البته برای انتخاب queue driver مورد نظر بایستی بخشqueue:work sqs را در دستور command ویرایش کنید.
پس از ایجاد فایل کانفیگ مورد نیاز، می توانید تنظیمات Supervisor را بروز رسانی نموده و فرایندها را با اجرای دستور زیر راه اندازی کنید:

1
2
3
4
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
<button></button>

یا می توانید از امکان Forge برای پیکربندی خودکار و مدیریت تنظیمات Supervisor از طریق یک web interface آسان و کارآمد، استفاده کنید.

آپشن daemon در Queue Listener

دستور آرتیزانqueue:work یک آپشن به نام --daemon دارد که worker ها را وادار می کند بدون اینکه هیچگاه فریم ورک را مجددا تنظیم و راه اندازی (re-boot) کنند، همچنان به پردازش job ها ادامه دهند. اعمال این آپشن در دستور ذکر شده سبب می شود میزان استفاده از پردازنده،به خصوص در مقایسه با دستور queue:listen ، به طور قابل توجهی کاهش یابد.
برای راه اندازی worker (عامل) مورد نظر در مدdaemon ، کافی است --daemon را به دستور اضافه کنید:

1
2
3
4
php artisan queue:work connection-name --daemon
php artisan queue:work connection-name --daemon --sleep=3
php artisan queue:work connection-name --daemon --sleep=3 --tries=3
<button></button>

همان طور که مشاهده کنید عملیات (job) queue:work از بیشتر گزینه های queue:listen پشتیبانی می کند. می توانید php artisan help queue:work را برای مشاهده ی تمامی آپشن های موجود فراخوانی کنید.

ملاحظات کدنویسی برای Daemon Queue Listener

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

نصب برنامه با daemon queue listener

از آنجایی که daemon worker ها فرایندهای طولانی مدت هستند، بایستی پیش از اینکه تغییرات اعمال شده در کد در آن ها نیز اعمال شود،restart شوند. با توجه به آنچه گفته شد، آسان ترین روش برای نصب (deploy) یک اپلیکیشن با استفاده از queue worker ها این است کهworker ها را داخل deployment script خود restart کنید (deployment script یک برنامه است که به شما کمک می کند اپلیکیشن خود را نصب و آماده ی بهره برداری نمایید. daemon فرایند یا برنامه های پس زمینه ای و پشت پرده هستند).

1
2
                    php artisan queue:restart
<button></button>

این دستور به تمامی queue worker ها دستور می دهد پس از اتمام پردازش job جاری از بین بروند ("die") تا بدین وسیله از ازدست رفت jobهای بعدی موجود جلوگیری شود. لازم به ذکر است که queue worker ها زمانی از بین می روند که دستور queue:restart اجرا شود. به همین خاطر توصیه می شود از یک process manager نظیر Supervisor استفاده کنید که خود queue worker ها را restart می کند.
نکته: این دستور برای زمان بندی restart، وابسته به سیستم cache می باشد. به طور پیش فرض APCu با job های CLI سازگار نیستند. بنابراین اگر می خواهید از APCu استفاده کنید، در آن صورت می بایست apc.enable_cli=1 را به تنظیمات APCu اضافه نمایید.

مدیریت job های ناموفق

گاهی ممکن است job های در صف قرار گرفته ی شما با موفقیت اجرا نشوند. در چارچوب نرم افزاری لاراول این امکان برای شما در نظر گرفته شده که به راحتی حداکثر تعداد دفعات تلاش مجدد و تکرار اجرای یک job را مشخص نمایید. پس از اینکه job از حداکثر مجاز دفعات تکرار اجرا فراتر برود، لاراول آن را به جدولی به نام failed_jobs منتقل می کند. اسم جدول را می توان از طریق فایل تنظیماتconfig/queue.php ویرایش کرد.
جهت ایجاد یک migration ویژه ی جدول failed jobs می توانید از دستور queue:failed-table استفاده نمایید:

1
2
                    php artisan queue:failed-table
<button></button>

به هنگام راه اندازی queue listener، می توانید حداکثر تعداد دفعات مجاز تکرار را با مقدار دهی گزینه ی –tries در دستور queue:listen تعیین نمایید:

1
2
                    php artisan queue:listen connection-name --tries=3
<button></button>

job event های ناموفق

اگر می خواهید یک event ثبت کنید که با شکست خوردن یک job در اجرا صدا زده شود، کافی است دستور Queue::failing را اجرا کنید. با بهره گیری از این event به راحتی می توانید به اعضای تیم خود از طریق ایمیل یا HipChat اطلاع رسانی کنید. برای مثال می توان یک callback به اینevent (از AppServiceProvider) اضافه کرد:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
namespace App\Providers;
use Queue;
use Illuminate\Queue\Events\JobFailed;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
   /**
    * Bootstrap any application services.
    *
    * @return void
    */
   public function boot()
   {
       Queue::failing(function (JobFailed $event) {
           // $event->connectionName
           // $event->job
           // $event->data
       });
   }
   /**
    * Register the service provider.
    *
    * @return void
    */
   public function register()
   {
       //
   }
}
<button></button>

فراخوانی متد failed در کلاس های Job

اگر می خواهید زمانی که یک عملیات زمان بندی شده مشخص با شکست مواجه شد، action های خاصی به ازای هر job اجرا شود، کافی است متدfailed را مسقیما در کلاس job تعریف نمایید. این کار در اصل برای داشتن کنترل جزئی , و مستقل تر (granular) انجام می گیرد:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendReminderEmail extends Job implements ShouldQueue
{
   use InteractsWithQueue, SerializesModels;
   /**
    * Execute the job.
    *
    * @param Mailer $mailer
    * @return void
    */
   public function handle(Mailer $mailer)
   {
       //
   }
   /**
    * Handle a job failure.
    *
    * @return void
    */
   public function failed()
   {
       // Called when the job is failing...
   }
}
<button></button>

اجرای مجدد (retry) job های ناموفق

برای مشاهده ی تمامی job ها و عملیات زمان بندی شده ی ناموفق که در جدول failed_jobs درج گردیده، می توان دستور آرتیزان queue:failedرا اجرا کرد:

1
2
                    php artisan queue:failed
<button></button>

دستور queue:failed شناسه (ID)، connection، queue و failure time عملیات زمان بندی شده ی مورد نظر را لیست می کند. به وسیله ی IDمی توان job ناموفق را retry (مجددا اجرا) کرد. برای مثال برای retry یک failed job که دارای شناسه ی 5 می باشد، دستور زیر را صدا می زنیم:

1
2
                    php artisan queue:retry 5
<button></button>

برای تکرار (اجرای مجدد) تمامی عملیات ناموفق، می توان دستور queue:retry را همراه با شناسه ی all فراخوانی کرد:

1
2
                    php artisan queue:retry all
<button></button>

به منظور حذف تمامی job های ناموفق (عملیات زمان بندی شده که موفقیت آمیز نیستند)، کافی است دستور queue:forget را فراخوانی نمایید:

1
2
                    php artisan queue:flush
<button></button>

جهت حذف تنها یک job ناموفق کافی است دستور queue:forget را بکار ببرید:

1
2
                    php artisan queue:forget 5
<button></button>
1395/03/17 11917 1755
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...