صف ها
پیکربندی
مولفه 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