فقط الإصدار الأحدث سيحصل على ميزات جديدة. سيتم توفير إصلاحات الأخطاء باستخدام المخطط التالي:
إصدار الحزمة | نسخة لارافيل | إصلاحات الشوائب حتى | |
---|---|---|---|
13 | 9 | 8 أغسطس 2023 | التوثيق |
يمكنك تثبيت هذه الحزمة عبر الملحن باستخدام هذا الأمر:
composer require vladimir-yuldashev/laravel-queue-rabbitmq
ستقوم الحزمة بتسجيل نفسها تلقائيًا.
إضافة اتصال إلى config/queue.php
:
هذا هو الحد الأدنى من التكوين لكي يعمل اتصال/برنامج تشغيل RabbitMQ.
' connections ' => [
// ...
' rabbitmq ' => [
' driver ' => ' rabbitmq ' ,
' hosts ' => [
[
' host ' => env ( ' RABBITMQ_HOST ' , ' 127.0.0.1 ' ),
' port ' => env ( ' RABBITMQ_PORT ' , 5672 ),
' user ' => env ( ' RABBITMQ_USER ' , ' guest ' ),
' password ' => env ( ' RABBITMQ_PASSWORD ' , ' guest ' ),
' vhost ' => env ( ' RABBITMQ_VHOST ' , ' / ' ),
],
// ...
],
// ...
],
// ...
],
يمكنك اختياريًا إضافة خيارات قائمة الانتظار إلى تكوين الاتصال. تحصل كل قائمة انتظار تم إنشاؤها لهذا الاتصال على الخصائص.
عندما تريد تحديد أولويات الرسائل عند تأخيرها، فهذا ممكن عن طريق إضافة خيارات إضافية.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' prioritize_delayed ' => false ,
' queue_max_priority ' => 10 ,
],
],
],
// ...
],
عندما تريد نشر رسائل مقابل تبادل باستخدام مفاتيح التوجيه، يكون ذلك ممكنًا عن طريق إضافة خيارات إضافية.
amq.direct
لمفتاح التوجيهqueue
بشكل افتراضي.%s
في مفتاح التوجيه، سيتم استبدال queue_name.ملحوظة: عند استخدام التبادل مع مفتاح التوجيه، فمن المحتمل أنك تقوم بإنشاء قوائم الانتظار الخاصة بك مع الارتباطات بنفسك.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' exchange ' => ' application-x ' ,
' exchange_type ' => ' topic ' ,
' exchange_routing_key ' => '' ,
],
],
],
// ...
],
في Laravel يتم تخزين المهام الفاشلة في قاعدة البيانات. ولكن ربما تريد توجيه عملية أخرى للقيام بشيء ما بالرسالة أيضًا. عندما تريد توجيه RabbitMQ لإعادة توجيه الرسائل الفاشلة إلى تبادل أو قائمة انتظار محددة، يكون ذلك ممكنًا عن طريق إضافة خيارات إضافية.
amq.direct
لمفتاح التوجيهqueue
افتراضيًا بمفتاح التوجيه '.failed'
.%s
في مفتاح التوجيه، سيتم استبدال queue_name.ملحوظة: عند استخدام Fail_job Exchange مع مفتاح التوجيه، ربما تحتاج إلى إنشاء التبادل/قائمة الانتظار الخاصة بك مع الارتباطات بنفسك.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' reroute_failed ' => true ,
' failed_exchange ' => ' failed-exchange ' ,
' failed_routing_key ' => ' application-x.%s ' ,
],
],
],
// ...
],
بدءًا من الإصدار 8.0، تدعم هذه الحزمة Laravel Horizon خارج الصندوق. أولاً، قم بتثبيت Horizon ثم قم بتعيين RABBITMQ_WORKER
على horizon
.
الأفق يعتمد على الأحداث التي يرسلها العامل. تُعلم هذه الأحداث Horizon بما تم فعله بالرسالة/الوظيفة.
تدعم هذه المكتبة Horizon، ولكن في التكوين يجب عليك إبلاغ Laravel باستخدام QueueApi المتوافق مع Horizon.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
/* Set to "horizon" if you wish to use Laravel Horizon. */
' worker ' => env ( ' RABBITMQ_WORKER ' , ' default ' ),
],
// ...
],
في بعض الأحيان يتعين عليك العمل مع الرسائل التي ينشرها تطبيق آخر.
ربما لن تحترم هذه الرسائل مخطط الحمولة النافعة لوظيفة Laravel. المشكلة في هذه الرسائل هي أن عمال Laravel لن يتمكنوا من تحديد المهمة أو الفئة الفعلية المطلوب تنفيذها.
يمكنك توسيع فئة RabbitMQJob::class
المضمنة، ومن خلال تكوين اتصال قائمة الانتظار، يمكنك تحديد فئتك الخاصة. عندما تحدد مفتاح job
في التكوين، باستخدام اسم الفصل الخاص بك، سيتم تغليف كل رسالة يتم استردادها من الوسيط بواسطة الفصل الخاص بك.
مثال للتكوين:
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
' queue ' => [
// ...
' job ' => App Queue Jobs RabbitMQJob::class,
],
],
],
// ...
],
مثال على فئة عملك الخاصة:
<?php
namespace App Queue Jobs ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue Jobs RabbitMQJob as BaseJob ;
class RabbitMQJob extends BaseJob
{
/**
* Fire the job.
*
* @return void
*/
public function fire ()
{
$ payload = $ this -> payload ();
$ class = WhatheverClassNameToExecute::class;
$ method = ' handle ' ;
( $ this -> instance = $ this -> resolve ( $ class ))->{ $ method }( $ this , $ payload );
$ this -> delete ();
}
}
أو ربما تريد إضافة خصائص إضافية إلى الحمولة:
<?php
namespace App Queue Jobs ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue Jobs RabbitMQJob as BaseJob ;
class RabbitMQJob extends BaseJob
{
/**
* Get the decoded body of the job.
*
* @return array
*/
public function payload ()
{
return [
' job ' => ' WhatheverFullyQualifiedClassNameToExecute@handle ' ,
' data ' => json_decode ( $ this -> getRawBody (), true )
];
}
}
إذا كنت تريد التعامل مع رسالة أولية، ليست بتنسيق JSON أو بدون مفتاح "الوظيفة" في JSON، فيجب عليك إضافة كعب روتين لأسلوب getName
:
<?php
namespace App Queue Jobs ;
use Illuminate Support Facades Log ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue Jobs RabbitMQJob as BaseJob ;
class RabbitMQJob extends BaseJob
{
public function fire ()
{
$ anyMessage = $ this -> getRawBody ();
Log:: info ( $ anyMessage );
$ this -> delete ();
}
public function getName ()
{
return '' ;
}
}
يمكنك توسيع PhpAmqpLibConnectionAMQPStreamConnection::class
المضمن أو PhpAmqpLibConnectionAMQPSLLConnection::class
وضمن تكوين الاتصال، يمكنك تحديد فئتك الخاصة. عندما تحدد مفتاح connection
في التكوين، باستخدام اسم الفصل الخاص بك، فإن كل اتصال سيستخدم الفصل الخاص بك.
مثال للتكوين:
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' connection ' = > App Queue Connection MyRabbitMQConnection::class,
],
// ...
],
إذا كنت ترغب في استخدام RabbitMQQueue::class
الخاص بك، فهذا ممكن عن طريق توسيع VladimirYuldashevLaravelQueueRabbitMQQueueRabbitMQQueue
. وأبلغ laravel باستخدام فصلك عن طريق تعيين RABBITMQ_WORKER
على AppQueueRabbitMQQueue::class
.
ملاحظة: يجب أن تمتد فئات العمال إلى
VladimirYuldashevLaravelQueueRabbitMQQueueRabbitMQQueue
' connections ' => [
// ...
' rabbitmq ' => [
// ...
/* Set to a class if you wish to use your own. */
' worker ' => App Queue RabbitMQQueue::class,
],
// ...
],
<?php
namespace App Queue ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue RabbitMQQueue as BaseRabbitMQQueue ;
class RabbitMQQueue extends BaseRabbitMQQueue
{
// ...
}
على سبيل المثال: تنفيذ إعادة الاتصال.
إذا كنت تريد إعادة الاتصال بـ RabbitMQ، إذا كان الاتصال ميتًا. يمكنك تجاوز أساليب النشر و createChannel.
ملاحظة: هذه ليست أفضل الممارسات، بل هي مثال.
<?php
namespace App Queue ;
use PhpAmqpLib Exception AMQPChannelClosedException ;
use PhpAmqpLib Exception AMQPConnectionClosedException ;
use VladimirYuldashev LaravelQueueRabbitMQ Queue RabbitMQQueue as BaseRabbitMQQueue ;
class RabbitMQQueue extends BaseRabbitMQQueue
{
protected function publishBasic ( $ msg , $ exchange = '' , $ destination = '' , $ mandatory = false , $ immediate = false , $ ticket = null ): void
{
try {
parent :: publishBasic ( $ msg , $ exchange , $ destination , $ mandatory , $ immediate , $ ticket );
} catch ( AMQPConnectionClosedException | AMQPChannelClosedException ) {
$ this -> reconnect ();
parent :: publishBasic ( $ msg , $ exchange , $ destination , $ mandatory , $ immediate , $ ticket );
}
}
protected function publishBatch ( $ jobs , $ data = '' , $ queue = null ): void
{
try {
parent :: publishBatch ( $ jobs , $ data , $ queue );
} catch ( AMQPConnectionClosedException | AMQPChannelClosedException ) {
$ this -> reconnect ();
parent :: publishBatch ( $ jobs , $ data , $ queue );
}
}
protected function createChannel (): AMQPChannel
{
try {
return parent :: createChannel ();
} catch ( AMQPConnectionClosedException ) {
$ this -> reconnect ();
return parent :: createChannel ();
}
}
}
يستخدم الاتصال قائمة انتظار افتراضية بقيمة "افتراضية"، عندما لا يتم توفير قائمة انتظار بواسطة laravel. من الممكن تغيير قائمة الانتظار الافتراضية عن طريق إضافة معلمة إضافية في تكوين الاتصال.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' queue ' => env ( ' RABBITMQ_QUEUE ' , ' default ' ),
],
// ...
],
افتراضيًا، سيتم إنشاء اتصالك بإعداد نبضات القلب على 0
. يمكنك تغيير إعدادات نبضات القلب عن طريق تغيير التكوين.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' options ' => [
// ...
' heartbeat ' => 10 ,
],
],
// ...
],
إذا كنت بحاجة إلى اتصال آمن بخادم (خوادم) RabbitMQ، فستحتاج إلى إضافة خيارات التكوين الإضافية هذه.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' secure ' = > true ,
' options ' => [
// ...
' ssl_options ' => [
' cafile ' => env ( ' RABBITMQ_SSL_CAFILE ' , null ),
' local_cert ' => env ( ' RABBITMQ_SSL_LOCALCERT ' , null ),
' local_key ' => env ( ' RABBITMQ_SSL_LOCALKEY ' , null ),
' verify_peer ' => env ( ' RABBITMQ_SSL_VERIFY_PEER ' , true ),
' passphrase ' => env ( ' RABBITMQ_SSL_PASSPHRASE ' , null ),
],
],
],
// ...
],
لتوجيه العاملين في Laravel لإرسال الأحداث بعد اكتمال جميع التزامات قاعدة البيانات.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' after_commit ' => true ,
],
// ...
],
افتراضيًا، سيتم إنشاء اتصالك كاتصال بطيء. إذا كنت لا تريد أن يكون الاتصال بطيئًا لسبب ما، فيمكنك إيقاف تشغيله عن طريق ضبط التكوين التالي.
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' lazy ' = > false ,
],
// ...
],
بشكل افتراضي، بروتوكول الشبكة المستخدم للاتصال هو tcp. إذا كنت تريد استخدام بروتوكول شبكة آخر لسبب ما، فيمكنك إضافة القيمة الإضافية في خيارات التكوين الخاصة بك. البروتوكولات المتاحة: tcp
، ssl
، tls
' connections ' => [
// ...
' rabbitmq ' => [
// ...
' network_protocol ' => ' tcp ' ,
],
// ...
],
بدءًا من الإصدار 13.3.0، تدعم هذه الحزمة Laravel Octane خارج الصندوق. أولاً، قم بتثبيت الأوكتان ولا تنس تسخين اتصال "rabbitmq" في تكوين الأوكتان.
انظر: رقم 460 (تعليق)
بمجرد الانتهاء من التكوين، يمكنك استخدام Laravel Queue API. إذا استخدمت برامج تشغيل أخرى لقائمة الانتظار، فلن تحتاج إلى تغيير أي شيء آخر. إذا كنت لا تعرف كيفية استخدام Queue API، فيرجى الرجوع إلى وثائق Laravel الرسمية: http://laravel.com/docs/queues
لاستخدام Lumen، يجب تسجيل مزود الخدمة يدويًا كما يلي في bootstrap/app.php
:
$ app -> register ( VladimirYuldashev LaravelQueueRabbitMQ LaravelQueueRabbitMQServiceProvider::class);
هناك طريقتان لاستهلاك الرسائل.
queue:work
وهو الأمر المدمج في Laravel. يستخدم هذا الأمر basic_get
. استخدم هذا إذا كنت تريد استهلاك قوائم انتظار متعددة.
rabbitmq:consume
الذي توفره هذه الحزمة. يستخدم هذا الأمر basic_consume
وهو أكثر أداء من basic_get
بحوالي 2x، لكنه لا يدعم قوائم الانتظار المتعددة.
قم بإعداد RabbitMQ باستخدام docker-compose
:
docker compose up -d
لتشغيل مجموعة الاختبار، يمكنك استخدام الأوامر التالية:
# To run both style and unit tests.
composer test
# To run only style tests.
composer test:style
# To run only unit tests.
composer test:unit
إذا تلقيت أي أخطاء من اختبارات النمط، فيمكنك إصلاح معظم المشكلات تلقائيًا، إن لم يكن جميعها، باستخدام الأمر التالي:
composer fix:style
يمكنك المساهمة في هذه الحزمة من خلال اكتشاف الأخطاء وفتح المشكلات. من فضلك، أضف إلى أي إصدار من الحزمة تقوم بإنشاء طلب سحب أو مشكلة. (على سبيل المثال [5.2] خطأ فادح في مهمة متأخرة)