مكتبة Ratchet لـ WebSocket في PHP
في تطوير الويب الحديث، أصبح تبادل البيانات في الوقت الفعلي مطلوبًا بشكل متزايد: الدردشات، الإشعارات، الألعاب عبر الإنترنت، التحرير المشترك للمستندات. بروتوكول HTTP التقليدي غير مناسب لهذه المهام لأنه يعمل وفق نموذج "طلب-استجابة". هنا يأتي دور بروتوكول WebSocket الذي ينشئ اتصالاً ثنائي الاتجاه دائمًا بين العميل والخادم.
بالنسبة لـ PHP، واحدة من أشهر وأكثر المكتبات نضجًا للعمل مع WebSocket هي Ratchet. توفر واجهة برمجة تطبيقات (API) مريحة لإنشاء خوادم WebSocket يمكنها معالجة العديد من الاتصالات المتزامنة. في هذه المقالة، سنشرح بالتفصيل كيفية تثبيت Ratchet، وكتابة خادم وعميل بسيطين، بالإضافة إلى مراجعة سيناريوهات الاستخدام النموذجية.
ما هي Ratchet؟
Ratchet هي مكتبة لـ PHP، مبنية على أساس ReactPHP (حلقة الأحداث غير المتزامنة). تتيح لك إنشاء خوادم WebSocket تعمل في الوقت الفعلي، دون الحاجة إلى وحدات إضافية (مثل ext-sockets أو ext-event). تدعم المكتبة معيار RFC 6455 (WebSocket) وتتكامل بسهولة مع أي تطبيقات PHP.
الإمكانيات الرئيسية لـ Ratchet:
- دعم بروتوكول WebSocket (الإصدار 13 والإصدارات الأقدم).
- إمكانية إنشاء وحدات تحكم مخصصة لمعالجة الرسائل.
- دعم مدمج لـ WAMP (بروتوكول مراسلة تطبيقات WebSocket) للنشر/الاشتراك (pub/sub) واستدعاء الإجراءات عن بُعد (RPC).
- تكامل سهل مع الأطر (Laravel, Symfony) من خلال حزم منفصلة.
- أداء عالٍ بفضل البنية غير المتزامنة لـ ReactPHP.
تثبيت Ratchet
يتم التثبيت عبر Composer. للقيام بذلك، في جذر مشروعك، نفذ الأمر التالي:
composer require cboden/ratchetبعد التثبيت، سيظهر في مشروعك مجلد vendor يحتوي على المكتبة وتبعياتها (بما في ذلك ReactPHP). تأكد من أن لديك PHP الإصدار 7.1 أو أعلى.
إنشاء خادم WebSocket بسيط
لنكتب خادمًا بسيطًا يستقبل الرسائل من العملاء ويعيد إرسالها إليهم (خادم الصدى). أنشئ ملفًا باسم server.php:
<?phprequire __DIR__ . '/vendor/autoload.php';
use Ratchet\\MessageComponentInterface;use Ratchet\\ConnectionInterface;use Ratchet\\Server\\IoServer;use Ratchet\\Http\\HttpServer;use Ratchet\\WebSocket\\WsServer;
class EchoServer implements MessageComponentInterface { public function onOpen(ConnectionInterface $conn) { echo "اتصال جديد: {$conn->resourceId}"; }
public function onMessage(ConnectionInterface $from, $msg) { echo "تم استلام رسالة من {$from->resourceId}: {$msg}"; // إرسال الرسالة مرة أخرى إلى المرسل $from->send("صدى: {$msg}"); }
public function onClose(ConnectionInterface $conn) { echo "تم إغلاق الاتصال {$conn->resourceId}"; }
public function onError(ConnectionInterface $conn, \\Exception $e) { echo "خطأ: {$e->getMessage()}"; $conn->close(); }}
// تشغيل الخادم على المنفذ 8080$server = IoServer::factory( new HttpServer( new WsServer( new EchoServer() ) ), 8080);
echo "خادم WebSocket قيد التشغيل على المنفذ 8080";$server->run();قم بتشغيل الخادم باستخدام الأمر php server.php. سيقوم بالاستماع لاتصالات WebSocket الواردة على المنفذ 8080.
إنشاء عميل (JavaScript)
للاختبار، قم بإنشاء ملف HTML بسيط مع عميل JavaScript:
<!DOCTYPE html><html><head> <title>عميل WebSocket</title></head><body>