صف ها
پیکربندی
مولفه Laravel Queue یک API یکپارچه را در میان انواع خدمات صف مختلف ارائه می دهد. صفها به شما این امکان را میدهند که پردازش یک کار وقتگیر، مانند ارسال ایمیل را به زمان دیگری موکول کنید، بنابراین سرعت درخواستهای وب به برنامه شما را به شدت افزایش میدهد.
فایل پیکربندی صف در ذخیره می شود
app/config/queue.php
.
در این فایل پیکربندی های اتصال برای هر یک از درایورهای صف موجود در فریم
ورک را خواهید یافت که شامل یک درایور
Beanstalkd
،
IronMQ
،
Amazon SQS
،
Redis
و همزمان (برای استفاده محلی) است.
وابستگی های زیر برای درایورهای صف فهرست شده مورد نیاز است:
-
Beanstalkd:
pda/pheanstalk ~2.0
-
آمازون SQS:
aws/aws-sdk-php
-
IronMQ:
iron-io/iron_mq
استفاده پایه
فشار دادن یک کار بر روی صف
برای فشار دادن یک کار جدید در صف، از
Queue::push
روش استفاده کنید:
Queue::push('SendEmail', array('message' => $message));
تعریف مدیریت کار
اولین آرگومان داده شده به
push
متد، نام کلاسی است که باید برای پردازش کار استفاده شود.
آرگومان دوم آرایه ای از داده ها است که باید به handler ارسال شود.
مدیریت کار باید به این صورت تعریف شود:
class SendEmail { public function fire($job, $data) { // } }
توجه داشته باشید که تنها روش مورد نیاز این است
fire
که یک
Job
نمونه و همچنین آرایهای
data
که در صف قرار داده شده را دریافت میکند.
تعیین یک روش کنترل کننده سفارشی
اگر میخواهید کار از روش دیگری غیر
fire
از
Queue::push('SendEmail@send', array('message' => $message));
تعیین صف / لوله برای یک کار
همچنین می توانید صف / لوله ای را که یک کار باید به آن ارسال شود مشخص کنید:
Queue::push('SendEmail@send', array('message' => $message), 'emails');
انتقال بار یکسان به چندین شغل
اگر نیاز دارید که داده های مشابهی را به چندین کار صف ارسال کنید، می
توانید از
Queue::bulk
روش زیر استفاده کنید:
Queue::bulk(array('SendEmail', 'NotifyUser'), $payload);
تاخیر در اجرای یک کار
گاهی اوقات ممکن است بخواهید اجرای یک کار در صف را به تعویق بیندازید.
به عنوان مثال، ممکن است بخواهید شغلی را در صف قرار دهید که 15 دقیقه پس از
ثبت نام برای مشتری ایمیل ارسال می کند.
با استفاده از روش زیر می توانید این کار را انجام دهید
Queue::later
:
$date = Carbon::now()->addMinutes(15); Queue::later($date, 'SendEmail@send', array('message' => $message));
در این مثال، ما از کتابخانه تاریخ کربن برای تعیین تاخیری که میخواهیم به کار اختصاص دهیم استفاده میکنیم. از طرف دیگر، میتوانید تعداد ثانیههایی را که میخواهید به تأخیر بیندازید، بهعنوان یک عدد صحیح ارسال کنید.
توجه: سرویس Amazon SQS دارای محدودیت تاخیر 900 ثانیه (15 دقیقه) است.
حذف یک کار پردازش شده
هنگامی که یک کار را پردازش کردید، باید از صف حذف شود، که می تواند از طریق
delete
روش موجود در
Job
نمونه انجام شود:
public function fire($job, $data){ // Process the job... $job->delete();}
بازگرداندن شغل به صف
اگر می خواهید یک کار را دوباره در صف آزاد کنید، می توانید این کار را از
طریق
release
روش زیر انجام دهید:
public function fire($job, $data){ // Process the job... $job->release();}
همچنین میتوانید چند ثانیه منتظر ماندن قبل از انتشار کار را مشخص کنید:
$job->release(5);
بررسی تعداد تلاشهای اجرا
اگر در حین پردازش کار یک استثنا رخ دهد، به طور خودکار در صف باز می گردد.
می توانید تعداد تلاش هایی که برای اجرای کار انجام شده است را با استفاده
از
attempts
روش زیر بررسی کنید:
if ($job->attempts() > 3){ //}
دسترسی به شناسه شغلی
همچنین می توانید به شناسه شغل دسترسی داشته باشید:
$job->getJobId();
بسته شدن صف
شما همچنین می توانید یک بسته را روی صف فشار دهید. این برای کارهای سریع و ساده که باید در صف قرار گیرند بسیار راحت است:
فشار دادن بسته شدن بر روی صف
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
روش برای اطمینان از اتصال تازه استفاده کنید.
صف های فشاری
صفهای فشاری به شما این امکان را میدهند که از امکانات قدرتمند صف لاراول
4 بدون اجرای دیمون یا شنونده پسزمینه استفاده کنید.
در حال حاضر، صف های فشار فقط توسط درایور
Iron.io
پشتیبانی می شوند .
قبل از شروع، یک حساب Iron.io ایجاد کنید و اطلاعات کاربری Iron خود را به
app/config/queue.php
فایل پیکربندی اضافه کنید.
ثبت نام مشترک Push Queue
در مرحله بعد، میتوانید از
queue:subscribe
دستور Artisan برای ثبت یک URL پایانی استفاده کنید که کارهای صف جدید را
دریافت میکند:
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
جدول درج می شود.
نام جدول مشاغل ناموفق را می توان از طریق
app/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){ //});
برای مشاهده تمام کارهای ناموفق خود، می توانید از
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