طابور Stomp
Stomp هو بروتوكول رسائل نصية بسيط (تدفقي) يوفر صيغة اتصال قابلة للتشغيل البيني، مما يسمح لعملاء STOMP بالتفاعل مع أي وسيط رسائل STOMP (Broker). workerman/stomp ينفذ عميل Stomp، ويُستخدم بشكل أساسي في سيناريوهات طوابير الرسائل مثل RabbitMQ وApollo وActiveMQ وغيرها.
التثبيت
composer require webman/stomp
التكوين
ملف التكوين موجود في config/plugin/webman/stomp
إرسال الرسائل
<?php
namespace app\controller;
use support\Request;
use Webman\Stomp\Client;
class Index
{
public function queue(Request $request)
{
// الطابور
$queue = 'examples';
// البيانات (عند تمرير مصفوفة، يجب التسلسل يدوياً، مثل استخدام json_encode أو serialize)
$data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
// تنفيذ الإرسال
Client::send($queue, $data);
return response('redis queue test');
}
}
لضمان التوافق مع المشاريع الأخرى، لا يوفر مكون Stomp التسلسل وإلغاء التسلسل التلقائي. إذا كانت البيانات المرسلة مصفوفة، يجب التسلسل يدوياً وإلغاء التسلسل عند الاستهلاك.
استهلاك الرسائل
أنشئ ملفاً جديداً app/queue/stomp/MyMailSend.php (اسم الفئة يمكن أن يكون أي شيء طالما يلتزم بمعيار PSR-4).
<?php
namespace app\queue\stomp;
use Workerman\Stomp\AckResolver;
use Webman\Stomp\Consumer;
class MyMailSend implements Consumer
{
// اسم الطابور
public $queue = 'examples';
// اسم الاتصال، يقابل الاتصال في stomp.php
public $connection = 'default';
// عندما تكون القيمة client، يجب استدعاء $ack_resolver->ack() لإبلاغ الخادم بالاستهلاك الناجح
// عندما تكون القيمة auto، لا حاجة لاستدعاء $ack_resolver->ack()
public $ack = 'auto';
// الاستهلاك
public function consume($data, AckResolver $ack_resolver = null)
{
// إذا كانت البيانات مصفوفة، يجب إلغاء التسلسل يدوياً
var_export(json_decode($data, true)); // يخرج ['to' => 'tom@gmail.com', 'content' => 'hello']
// إبلاغ الخادم بالاستهلاك الناجح
$ack_resolver->ack(); // يمكن حذف هذا الاستدعاء عندما يكون ack هو auto
}
}
تفعيل بروتوكول Stomp في RabbitMQ
RabbitMQ لا يفعل بروتوكول Stomp افتراضياً. نفّذ الأمر التالي للتفعيل:
rabbitmq-plugins enable rabbitmq_stomp
بعد التفعيل، المنفذ الافتراضي لـ Stomp هو 61613.