كيفية إيقاف مؤقت والتحكم في قوائم الانتظار في Laravel خطوة بخطوة

آخر تحديث: ديسمبر 5 2025
نبذة عن الكاتب: تكنوديجيتال
  • يقدم Laravel واجهة برمجة تطبيقات موحدة للطابور مع برامج تشغيل متعددة (قاعدة بيانات، Redis، SQS…) وفصل بين الاتصالات والطوابير المنطقية.
  • تتيح الوظائف نقل المهام الثقيلة إلى الخلفية، مع دعم نماذج التسلسل، والبرامج الوسيطة، والوظائف الفريدة، والتشفير، والدفعات، والسلاسل.
  • يتم إدارة العمال باستخدام queue:work، وSupervisor، والأوامر مثل queue:pause/queue:continue، والتحكم في إعادة المحاولة، وأوقات الانتظار، والأولويات.
  • يوجد نظام بيئي كامل للفشل والمراقبة والاختبار (failed_jobs، queue:retry، queue:monitor، Queue::fake) مما يجعل قوائم الانتظار موثوقة في الإنتاج.

إدارة قائمة الانتظار في لارافيل

يُعد العمل مع قوائم الانتظار في Laravel أمرًا شبه إلزامي في أي مشروع جاد إلى حد ما: إرسال رسائل البريد الإلكتروني، ومعالجة ملفات CSV، وإنشاء ملفات PDF، وتغيير حجم الصور، واستدعاء واجهات برمجة التطبيقات الخارجية... إذا تم القيام بكل ذلك في طلب HTTP الرئيسي، يصبح الموقع الإلكتروني بطيئًا، وتظهر أخطاء 500، وينتهي الأمر بالمستخدم وهو يحدق بيأس في شاشة فارغة.

الخبر السار هو أن Laravel يوفر بنية تحتية قوية ومرنة لإدارة قوائم الانتظار، مما يسمح لك بتفويض المهام الثقيلة إلى عمليات الخلفية، وإدارتها حسب الأولوية، وتجميعها في دفعات، ومراقبتها، وإعادة تشغيلها عند فشلها، وحتى إيقافها مؤقتًا للصيانة. دعونا نلقي نظرة فاحصة (دون إغفال أي تفاصيل) على كيفية الاستفادة القصوى منها، بما في ذلك كيفية إيقافها مؤقتًا، واستئنافها، والتحكم في أدائها في بيئة الإنتاج.

المفاهيم الأساسية: الاتصالات، والطوابير، وبرامج التشغيل

في Laravel، قبل إيقاف أي شيء مؤقتًا، عليك أن تفهم الفرق بين اتصالات قائمة الانتظار وقوائم الانتظار نفسها. في config/queue.php لديك مجموعة connections حيث يمكنك تعريف كل واجهة خلفية: قاعدة بيانات، redis، beanstalkd، sqs، مزامنة، null، فشل، rabbitmq (إذا أضفته) وما إلى ذلك.

يمكن أن يكون لكل اتصال عدة طوابير منطقية (أسماء مثل default, emails, high, low, importsالسمة queue يشير كل اتصال إلى قائمة الانتظار الافتراضية التي ستذهب إليها الوظائف إذا لم يتم تحديد أي قائمة أخرى. onQueue()بهذه الطريقة يمكنك القيام بأشياء مثل:

  • طابور سريع للرسائل الإلكترونية أو المعاملات القصيرة.
  • أولوية منخفضة أخرى للمهام الطويلة مثل معالجة مقاطع الفيديو أو التقارير الكبيرة.
  • قوائم الانتظار المقسمة حسب نوع المهمة: imports, notificaciones, reportes، الخ.

عند تشغيل العامل بـ php artisan queue:workبشكل افتراضي، يستمع إلى قائمة الانتظار المحددة كـ إفتراضي على الاتصال المحدد. لتحديد الأولويات، يمكنك تمرير عدة قوائم انتظار مفصولة بفواصل:

php artisan queue:work redis --queue=high,default,low

بهذه الطريقة، يقوم العامل بمعالجة الرسائل ذات الأولوية العالية أولاً ، ثم الرسائل ذات الأولوية الافتراضية ، وبعد ذلك فقط الرسائل ذات الأولوية المنخفضة ، وهو أمر بالغ الأهمية عندما يكون النظام محملاً ولا تريد أن يقوم تقرير مدته 30 دقيقة بحظر رسائل البريد الإلكتروني ذات الأولوية العالية.

برامج تشغيل قائمة الانتظار والمتطلبات الأساسية

يُوفر Laravel واجهة برمجة تطبيقات موحدة للعديد من مُشغّلات قوائم الانتظار ، ولكن لكل منها خصائصها وتوابعها الخاصة. يُعد اختيار المُشغّل المناسب أمرًا بالغ الأهمية قبل مناقشة إيقاف العمال مؤقتًا.

قاعدة بيانات السائقين

السائق قاعدة بيانات يقوم بتخزين الوظائف في جدول SQL (عادةً jobsمن السهل إعداده ويعتبر مثاليًا للمشروعات الصغيرة أو بيئات التطوير حيث لا ترغب في العبث بـ Redis أو SQS.

الخطوات الأساسية:

  • إنشاء الهجرة: php artisan queue:table (أو في الإصدارات الأحدث، يأتي كـ create_jobs_table تقصير).
  • تشغيل عمليات الهجرة: php artisan migrate.
  • تكوين QUEUE_CONNECTION=قاعدة البيانات في .env وتأكيد في config/queue.php أن 'default' => env('QUEUE_CONNECTION','database').

إنه مريح وقوي بما فيه الكفاية، ولكن مع وجود العديد من قوائم الانتظار وحركة مرور كبيرة، يمكن أن يصبح عنق زجاجة ، لأن كل شيء يمر عبر قاعدة البيانات العلائقية نفسها.

سائق Redis

يُعد برنامج تشغيل Redis المعيار الأساسي في بيئات الإنتاج. فهو سريع، ويدعم ميزات متقدمة (مثل التأمين، وتحديد معدل الطلبات، والتأمين الذري، وHorizon، وما إلى ذلك)، ويتميز بقابلية توسع عالية.

نقاط مهمة:

  • تحتاج إلى تكوين اتصال Redis في config/database.php.
  • الخيارات serializer y compression من ريديس إنها غير متوافقة مع سائق الطابور.
  • إذا كنت تستخدم مجموعة Redisيجب أن تحتوي أسماء قوائم الانتظار على علامة تصنيف، على سبيل المثال {default}بحيث تقع جميع المفاتيح الموجودة في تلك القائمة في نفس الفتحة.
  • الخيار block_for إنه يسمح للعامل بالحظر أثناء انتظار الوظائف لبضع ثوانٍ، بدلاً من الاستطلاع المستمر: يوفر وحدة المعالجة المركزية ويقلل الاستعلامات إلى خادم Redis.

على سبيل المثال:

'redis' => ,

إذا وضعت كتلة_لـ = 0يظل العامل محظورًا إلى أجل غير مسمى حتى تصبح الوظيفة متاحة، وهو أمر يجب وضعه في الاعتبار إذا كنت تريد أن يستجيب بسرعة لإشارات مثل SIGTERM أو أوامر الإيقاف المؤقت.

برامج تشغيل أخرى: SQS، Beanstalkd، null، failover…

بالإضافة إلى قواعد البيانات و Redis، يدعم Laravel أنظمة أخرى :

  • الأمازون SQSقوائم الانتظار المُدارة على AWS، مع دعم لـ FIFOمجموعات الرسائل، وإزالة التكرارات، وإعدادات الرؤية المتقدمة. يتطلب حزمة تطوير البرامج (SDK). aws/aws-sdk-php.
  • فاصولياءسريع وسهل جدًا، باستخدام الحزمة pda/pheanstalk.
  • مزامنة:ينفذ المهام فورا في نفس العملية. مفيد في التطوير والاختبار، لكن في الإنتاج، يُشبه عمليًا عدم استخدام الطوابير إطلاقًا.
  • فارغة: يُلغي المهام فور إرسالها. يُستخدم لتعطيل نظام الانتظار تمامًا.
  • الفشليتيح لك هذا تكوين اتصالات متعددة، وفي حال فشل الاتصال الرئيسي، يحاول لارافيل نقل المهمة إلى الاتصال التالي في القائمة. مثالي للبيئات التي توافر عالية إنه أمر بالغ الأهمية.
  Gemini Code Assist: مساعد الذكاء الاصطناعي للمبرمجين متاح الآن مجانًا

على مستوى إيقاف واستئناف العمال، فإن المنطق هو نفسه عمليًا بغض النظر عن برنامج التشغيل، لأنه تتم إدارته من أوامر Artisan وفئة Worker ، وليس من الواجهة الخلفية لقائمة الانتظار.

إنشاء الوظائف وتسلسل النماذج

Un وظيفة في لارافيل، هي ببساطة فئة تُغلّف مهمةً تُنفّذ في قائمة انتظار. عادةً ما تُولّد باستخدام Artisan وتُحفظ في app/Jobs.

لإنشاء واحد:

php artisan make:job ProcessPodcast

الفئة المولدة الأدوات ShouldQueue ويستخدم عادة السمات Dispatchable, InteractsWithQueue, Queueable y SerializesModelsالقلب في الطريقة handle()وهذا ما يفعله العامل عندما يصل العمل.

من أبرز ميزات Laravel خاصية التسلسل التلقائي لنماذج Eloquent . فعند قبول نموذج في مُنشئ المهمة، لا يُضيف Laravel الكائن بأكمله إلى قائمة الانتظار، بل مُعرّفه فقط. وعند معالجة المهمة، يُعيد بناء النموذج من قاعدة البيانات مع تحميل علاقاته.

مثال نموذجي (في الكود الزائف، لتجنب تكراره حرفيًا):

  • يتلقى البناء بودكاست $بودكاست.
  • السمة SerializesModels فهو المسؤول عن حفظ الهوية.
  • En handle(AudioProcessor $processor) أنت تقوم بالعمل الشاق (معالجة الصوت، على سبيل المثال).

إذا كنت لا تريد أن يتم تسلسل العلاقات في النموذج (حتى لا تكون الحمولة ضخمة)، فيمكنك استخدام $model->withoutRelations() أو في PHP 8 السمة # على الممتلكات المروجة للبناء.

حقن التبعية في طريقة المقبض

ميزة أخرى هي أنه يمكنك حقن الخدمات مباشرة في طريقة التعامل (كما لو كان وحدة تحكم)، لأن لارافيل يستخدم أيضًا حاوية الخدمة في المهام. على سبيل المثال، يمكنك طلب AudioProcessorعملاء HTTP ومستودعات التخزين وما إلى ذلك، ويتولى الإطار مهمة حلها.

إذا كنت بحاجة إلى تحكم فائق الدقة فيما يسمى handleيمكنك استخدام Container::bindMethod() في مزود الخدمة وتحديد منطق الحقن بنفسك، ولكن في معظم الحالات ليست هناك حاجة إلى تعقيد الأمور كثيرًا.

برامج الوسيط الوظيفي

تمامًا كما تحتوي الطرق على برامج وسيطة، يمكن أن تحتوي الوظائف أيضًا على برامج وسيطة محددة التي تعمل قبل وبعد المهمة. هذا يقلل بشكل كبير من تكرار الكود في الطرق handle() وهو مفيد بشكل خاص لـ:

  • تحديد المعدل مع Redis.
  • تجنب يتداخل من الأعمال التي تتطرق إلى نفس المصدر.
  • استثناءات منتظمة للواجهات البرمجية غير المستقرة.
  • تخطي الوظائف في ظل ظروف معينة (Skip (الوسيط).

يتم وضع البرامج الوسيطة عادة في app/Jobs/Middleware ويتم إرجاعها من الطريقة middleware() من أيوب. مثال مفاهيمي:

public function middleware(): array { return ;

أنواع خاصة من الوظائف: فريدة ومشفرة ومقفلة

يسمح لك Laravel بتمييز وظائف معينة على أنها فريدة من نوعها لضمان عدم وجود مثيلين متطابقين في نفس الوقت. يتحقق ذلك من خلال تنفيذ الواجهة ShouldBeUnique o ShouldBeUniqueUntilProcessingويدعم تعريف المفتاح uniqueId() ووقت uniqueFor.

وهذا مثالي لأشياء مثل:

  • إعادة حساب مؤشر البحث للمنتج: مرة واحدة فقط لكل منتج حتى تنتهي.
  • المزامنة مع الخدمات الخارجية التي لا تسمح بالطلبات المتزامنة لنفس المورد.

في الأسفل، يستخدم Laravel القفل الذري ذاكرة التخزين المؤقت (Redis، memcached، قاعدة البيانات، إلخ). يمكنك أيضًا اختيار برنامج تشغيل ذاكرة التخزين المؤقت لهذا القفل باستخدام uniqueVia().

بالإضافة إلى ذلك، هناك واجهة ShouldBeEncrypted، والتي تشير بها إلى أن الوظيفة كاملة هي أدخل الرمز الخاص بك قبل الدخول إلى قائمة الانتظارمفيد جدًا عند تمرير بيانات حساسة ولا تريد أن تنتقل في نص عادي عبر Redis أو SQS أو قاعدة البيانات.

إرسال وتأخير وتنفيذ الوظائف في أوضاع مختلفة

بمجرد تحديد وظيفتك، يمكنك تشغيلها باستخدام Job::dispatch() من وحدات التحكم، ومستمعي الأحداث، وأوامر Artisan، وحتى الإغلاقات. المعلمات التي تُمررها إلى dispatch ويذهبون مباشرة إلى باني أيوب.

اختلافات مثيرة للاهتمام:

  • dispatchIf() y dispatchUnless() لتجهيز الشحنة في سطر واحد.
  • delay() بحيث لا يمكن معالجة المهمة حتى تاريخ/وقت محدد.
  • dispatchAfterResponse() o afterResponse() en dispatch() الإغلاقات، التي تؤجل التنفيذ حتى يتم إرسال استجابة HTTP، ولكن داخل نفس عملية PHP.
  • dispatchSync() لتشغيل الوظيفة بشكل متزامن (دون المرور عبر قائمة الانتظار) ولكن إعادة استخدام نفس الفئة.
  • اتصالات خاصة مثل deferred o background لتنفيذه بعد الاستجابة، في نفس العملية أو في عملية PHP جديدة.

أخيرًا، يمكنك تحديد الاتصال والطابور باستخدام طرق متسلسلة onConnection() y onQueue()، سواء عند الإرسال أو داخل منشئ الوظيفة.

التحكم الدقيق: إعادة المحاولة، والتراجع، ومواعيد انتهاء المهلة، ومعالجة الأخطاء

جزء كبير من العمل مع قوائم الانتظار في Laravel هو تحديد عدد مرات إعادة محاولة المهمة ، ومدة الانتظار بين المحاولات، ومتى يتم اعتبارها فاشلة.

  كيفية إزالة البرامج غير الضرورية من نظام التشغيل ويندوز 11 باستخدام PowerShell

الخيارات المتاحة:

  • --tries en queue:work لتعيين الحد الأقصى لعدد المحاولات لجميع وظائف ذلك العامل (ما لم تحدد الوظيفة نفسها) $tries o tries()).
  • $tries أو طريقة tries() في فئة الوظيفة للتحكم لكل وظيفة.
  • retryUntil() أن نقول: "حاول مرة أخرى كما تشاء حتى هذه المرة، وبعد ذلك، الفشل". إذا تزامن ذلك مع tries، يأمر retryUntil.
  • $maxExceptions لقطع الاتصال عندما تكون المشكلة بسبب استثناءات متكررة غير معالجة.
  • $timeout o --timeout للإشارة إلى عدد الثواني التي يمكن أن تعمل فيها الوظيفة قبل أن يقوم العامل بقتل العملية الفرعية.
  • $failOnTimeout لتحديد المهمة على أنها فاشلة في حالة انتهاء المهلة.
  • $backoff الطريقة backoff() لتحديد المدة التي يجب الانتظارها بين المحاولات المتكررة، حتى مع القيم الأسيّة.

إذا قامت وظيفة بإلقاء استثناء غير مكتشف، فسوف يقوم Laravel بـ... يطلق مرة أخرى في الذيل حتى يتم استنفاد المحاولات المُهيأة. يمكنك التحكم في ذلك يدويًا باستخدام release($segundos) o fail($exception) عندما تريد عمدًا وضع علامة على فشل مهمة ما.

الوظائف الفاشلة، جدول الوظائف الفاشلة والتقليم

عندما يستنفد الشخص محاولاته، فإنه يعتبر عمل فاشل ويقوم Laravel بإدراجه في الجدول failed_jobs (أو في DynamoDB إذا قمت بتكوينه بهذه الطريقة). يخزن هذا الجدول المعرف الفريد العالمي (UUID)، والاتصال، والطابور، وحمولة المهمة، والاستثناء الذي تم طرحه.

أوامر مفيدة:

  • php artisan queue:failed لإدراج الفاشلين.
  • php artisan queue:retry <id|all> لتجربتهم مرة أخرى.
  • php artisan queue:forget <id> لحذف واحد.
  • php artisan queue:flush لحذف الكل (مع خيار للساعات في الإصدارات الأحدث).
  • php artisan queue:prune-failed --hours=48 لتقليم السجلات القديمة تلقائيًا.

في الوظائف يمكنك تعريف طريقة failed(Throwable $exception) للتنظيف الإضافي: إخطار المستخدم، وعكس الإجراءات الجزئية، وكتابة سجلات متخصصة، وما إلى ذلك. لاحظ أنه يتم إنشاء مثيل جديد للوظيفة للاتصال failed()لذلك، لا تعتمد على التغييرات في الممتلكات التي تم إجراؤها في handle().

تجميع الوظائف: تجميع دفعات الوظائف ودمجها مع السلاسل

عندما تحتاج إلى تشغيل مئات أو آلاف المهام ذات الصلة (على سبيل المثال، استيراد ملف CSV ضخم على أجزاء، ومعالجة الملفات على دفعات، وتنظيف البيانات، وما إلى ذلك)، يُنصح باستخدام وظيفة الدفعات في Laravel .

التدفق الأساسي:

  • إنشاء الجدول job_batches مع php artisan queue:batches-table && php artisan migrate.
  • قم بتمييز الوظائف التي ستكون جزءًا من الدفعات باستخدام السمة Batchable.
  • استخدم Bus::batch() لإرسال مجموعة من الوظائف، مع عمليات الاسترجاع then, catch y finally.
  • الوصول إلى الدفعة من كل وظيفة باستخدام $this->batch() وتحقق إذا تم إلغاؤه.
  • إمكانية إضافة المزيد من الوظائف إلى دفعة مستمرة مع $this->batch()->add().

تتكامل الدفعات بسلاسة مع السلاسل : يمكنك إنشاء سلاسل داخل دفعة واحدة أو استخدام الدفعات كعناصر في سلسلة أكبر. يُعد هذا مفيدًا بشكل خاص عندما تريد تشغيل سلاسل متعددة "بالتوازي" وتفعيل إجراء ما عند اكتمالها جميعًا.

تنفيذ العامل والأولويات والنشر

كل سحر الطوابير يحدث لأنك تمتلك عامل واحد أو أكثر تشغيل الأمر queue:work (o queue:listen(مع أن الأخير أقل كفاءة). هذه العمليات عبارة عن شياطين طويلة الأمد تستمع إلى قوائم الانتظار الخاصة بها.

الخيارات الرئيسية ل queue:work:

  • صلة: php artisan queue:work redis, queue:work database، الخ.
  • الكولا: --queue=high,default,low لتحديد الأولويات.
  • -أحد عشر: يعالج مهمة واحدة ويخرج منها.
  • –الوظائف القصوى: معالجة X وظائف وإنهائها (لإعادة تشغيل العاملين بشكل دوري وتحرير الذاكرة).
  • –أقصى وقت:تعمل لمدة N ثانية ثم تخرج.
  • -ينام:ثواني من الانتظار عندما لا تتوفر أي وظائف.
  • –توقف عند الفراغ: يقوم بتفريغ قائمة الانتظار وإغلاقها بشكل نظيف (مثالي في بيئات Docker أو الوظائف لمرة واحدة).
  • -نفذ الوقت:ثواني من مهلة الانتظار لكل مهمة، كما ذكرنا من قبل.
  • -فرض: لمعالجة الوظائف حتى لو كان التطبيق في وضع الصيانة.

نظرًا لأن هذه العمليات تستغرق وقتًا طويلاً، ففي بيئة الإنتاج، يُستخدم غالبًا نظام مراقبة العمليات مثل Supervisor (على نظام Linux) لبدء تشغيل عدد من العمال، وإعادة تشغيلهم في حال تعطلهم، وإدارة السجلات. يُعرّف نموذج تكوين Supervisor في Laravel ما يلي:

  • أمر مع php artisan queue:work ... الخرسانة.
  • نومبروكس للإشارة إلى عدد العمال الذين سيتم إطلاقهم بالتوازي.
  • مسارات السجل، المستخدم، إعادة التشغيل التلقائية، وما إلى ذلك.

إيقاف واستئناف قوائم الانتظار في Laravel

لننتقل إلى ما هو مهم في الصيانة: كيفية إيقاف عمليات قائمة الانتظار مؤقتًا دون إيقافها فجأة ودون ترك أي مهام غير مكتملة. يوفر Laravel عدة آليات، بعضها حديث وبعضها كلاسيكي، للتحكم في ذلك.

إيقاف مؤقت: قائمة انتظار: إشارات الإيقاف المؤقت والمقاطعة

في الإصدارات الحديثة، أضافت Laravel أوامر محددة لإيقاف واستئناف تنفيذ العمال:

  • php artisan queue:pause: يخبر النظام بالتوقف عن قبول وظائف جديدة، والسماح للوظائف الجارية بالانتهاء.
  • php artisan queue:continue:استئناف معالجة الوظائف الجديدة من حيث توقفت.
  جريس هوبر: رائدة برمجة الكمبيوتر

تعمل هذه الأوامر عن طريق إرسال إشارات إلى العمال من خلال آلية التخزين المؤقت التي يستخدمها Laravel داخليًا. لذلك، من المهم وجود برنامج تشغيل تخزين مؤقت مُهيأ بشكل صحيح (مثل memcached أو redis أو قاعدة بيانات أو ملف، إلخ) حتى لو كان نظام التخزين المؤقت لديك مختلفًا.

هام: إن إيقاف قائمة الانتظار أو العامل مؤقتًا لا يلغي أو يحذف المهام الموجودة بالفعل في قائمة الانتظار ؛ إنه ببساطة يمنع إزالة المزيد من المهام من قائمة الانتظار أثناء فترة الإيقاف المؤقت.

استطلاع رأي حول الاضطرابات وتأثيرها على الأداء

في كل مرة يُنهي فيها عاملٌ مهمةً، يتحقق Laravel من ذاكرة التخزين المؤقت بحثًا عن إشارات إعادة التشغيل أو الإيقاف المؤقت أو المتابعة . هذه العملية لا تُؤثر على الأداء بشكل ملحوظ، ولكنها موجودة. إذا كنت تُركز بشدة على الأداء وتعرف أنك لن تحتاج إلى إيقاف العمال مؤقتًا أو إعادة تشغيلهم من خلال الأوامر، فيمكنك تعطيل هذا الاستقصاء عن طريق استدعاء:

Queue::withoutInterruptionPolling();

أو حتى ضبط الخصائص الثابتة لـ Illuminate\Queue\Worker لتعطيل لمسات معينة (قابلة لإعادة التشغيل, قابل للإيقاف مؤقتًاومع ذلك، إذا قمت بذلك ثم حاولت استخدام queue:pause o queue:restartالعمال لن يكتشفوا ذلكإنه قرار تصميمي يجب أن يتم دراسته بعناية.

إيقاف مؤقت يدويًا باستخدام المشرف أو Docker

بالإضافة إلى أوامر Laravel الخاصة ، في بيئات الإنتاج، غالبًا ما يتم "إيقاف" العمليات بشكل غير مباشر:

  • إيقاف البرنامج في المشرف (supervisorctl stop laravel-worker:*)، مما يؤدي إلى قتل العمال أو إيقافهم.
  • باستخدام –توقف عند الفراغ في عمليات النشر للسماح للعمال بإنهاء ما هو موجود في قائمة الانتظار ثم إيقاف التشغيل.
  • في Docker، السماح للحاوية بالعمل مع --stop-when-empty ومن ثم يتم إيقاف تشغيله.

الفرق مع queue:pause من خلال إيقاف العمليات بشكل كامل، سوف تتوقف عن معالجة الوظائف حتى يتم إعادة تشغيل العمال. توقف داخلي يمكنك الاحتفاظ بالعمليات في الذاكرة، في انتظار الأمر continueيعد هذا مفيدًا لعمليات النشر السريعة أو فترات الصيانة القصيرة.

معاملات قاعدة البيانات و after_commit

خطأ شائع: إرسال المهام ضمن معاملات قاعدة البيانات . إذا لم تكن حذرًا، فقد ينفذ العامل المهمة قبل إتمام عملية الالتزام، وقد لا يكون النموذج أو البيانات التي تتوقعها موجودة في قاعدة البيانات بعد.

لتجنب هذا الرقص، لديك خياران:

  • تفعيل 'after_commit' => true في تكوين اتصال قائمة الانتظار. وبالتالي، يتم تأجيل أي مهمة يتم إرسالها ضمن معاملة داخليًا حتى يتم تأكيدها.
  • استخدم الأساليب الخاصة بكل وظيفة afterCommit() o beforeCommit() عند الإرسال، لفرض السلوك فقط في وظائف محددة.

إذا تم عكس العملية، فسيتم تجاهل المهام التي تم إرسالها أثناءها دون دخولها إلى قائمة الانتظار، وهو بالضبط ما هو مطلوب عادةً للحفاظ على الاتساق.

المراقبة وتنظيف قائمة الانتظار والاختبار

بمجرد أن تبدأ قوائم الانتظار بالعمل بجدية، لا يكفي مجرد طرح المهام ونسيانها؛ يجب عليك مراقبة واختبار كيفية عمل كل شيء.

أدوات وأوامر مفيدة:

  • queue:clear لتفريغ قائمة انتظار محددة (SQS، Redis، قاعدة البيانات).
  • queue:monitor لمراقبة عدد الوظائف في طوابير معينة وتشغيل الحدث QueueBusy إذا تجاوزوا عتبة معينة.
  • أحداث العمل كما Queue::before, Queue::after, Queue::looping y Queue::failing لربط المنطق المخصص (السجلات، والمقاييس، والتراجعات، وما إلى ذلك).
  • مزيف في الاختبار باستخدام Queue::fake() y Bus::fake() للتحقق من إرسال الوظائف أو السلاسل أو الدفعات دون تنفيذها فعليًا.

في الاختبارات يمكنك ذكر أشياء مثل "تم وضع هذه المهمة في قائمة الانتظار X مرة" ، أو "تم إرسال سلسلة مع هذه المهام بهذا الترتيب" أو "لم يتم وضع أي مهمة معينة في قائمة الانتظار"، مما يوفر الكثير من الأمان في التدفقات المعقدة.

مع هذا النظام البيئي بأكمله - برامج تشغيل مثل Redis أو SQS، ووظائف مصممة جيدًا، وبرامج وسيطة للضبط الدقيق، والدفعات، والسلاسل، وتكوين إعادة المحاولة، والعاملين الذين يديرهم المشرف، والأوامر مثل queue:pause y queue:continueيتيح لك Laravel إتقان معالجة الخلفية حتى أدق التفاصيل، بدءًا من إرسال البريد الإلكتروني النموذجي وحتى هياكل قائمة الانتظار الموزعة مع إمكانية التعافي من الفشل، مما يضمن استمرار تطبيقك في الاستجابة بسرعة على طبقة HTTP أثناء القيام بعمل ثقيل أسفلها دون حظر المستخدم.

إطار لارافيل
مقالة ذات صلة:
إطار عمل Laravel القوي