مكتبة WebSocket Ratchet لـ PHP: إنشاء تطبيقات الوقت الفعلي
WebSocket هو بروتوكول يوفر اتصالاً ثنائي الاتجاه بين العميل والخادم عبر اتصال دائم واحد. على عكس HTTP التقليدي، حيث يفتح كل طلب اتصالاً جديداً، يسمح WebSocket بنقل البيانات في الوقت الفعلي دون تأخير. بالنسبة لـ PHP، واحدة من أشهر المكتبات للعمل مع WebSocket هي Ratchet. هذه المكتبة مبنية على أساس ReactPHP وتوفر واجهة برمجة تطبيقات بسيطة وقوية لإنشاء خوادم WebSocket.
ما هي Ratchet؟
Ratchet هي مكتبة PHP مفتوحة المصدر تتيح للمطورين إنشاء تطبيقات الوقت الفعلي مثل الدردشات والإشعارات والألعاب عبر الإنترنت وأنظمة المراقبة. تقوم بتجريد تعقيد العمل مع المقابس (sockets) والإدخال/الإخراج غير المتزامن، وتوفير فئات وواجهات مريحة.
الإمكانيات الرئيسية لـ Ratchet:
- دعم WebSocket وفقاً لمواصفات RFC 6455
- التكامل مع خوادم HTTP (على سبيل المثال، عبر ReactPHP)
- إمكانية إنشاء معالجات رسائل مخصصة
- دعم WAMP (بروتوكول مراسلة تطبيقات WebSocket) للنشر/الاشتراك (Pub/Sub)
- خفيفة الوزن وأداء عالي
تثبيت Ratchet
يتم تثبيت المكتبة عبر Composer. نفذ في الطرفية:
composer require cboden/ratchetبعد التثبيت، سيظهر في مشروعك مجلد vendor مع التبعيات الضرورية، بما في ذلك ReactPHP.
إنشاء خادم WebSocket بسيط
لننظر إلى مثال أساسي: سننشئ خادماً يقبل الاتصالات ويرسل رسالة ترحيبية مرة أخرى. لهذا، أنشئ ملفاً باسم server.php:
<?phprequire 'vendor/autoload.php';
use Ratchet\\MessageComponentInterface;use Ratchet\\ConnectionInterface;use Ratchet\\Server\\IoServer;use Ratchet\\Http\\HttpServer;use Ratchet\\WebSocket\\WsServer;
class MyWebSocket implements MessageComponentInterface { protected $clients;
public function __construct() { $this->clients = new \\SplObjectStorage; }
public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); echo "اتصال جديد: {$conn->resourceId}"; $conn->send("مرحباً بك! معرفك: {$conn->resourceId}"); }
public function onMessage(ConnectionInterface $from, $msg) { echo "تم استلام رسالة من {$from->resourceId}: {$msg}"; // إرسال لجميع العملاء foreach ($this->clients as $client) { if ($from !== $client) { $client->send("رسالة من {$from->resourceId}: {$msg}"); } } }
public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); echo "تم إغلاق الاتصال {$conn->resourceId}"; }
public function onError(ConnectionInterface $conn, \\Exception $e) { echo "خطأ: {$e->getMessage()}"; $conn->close(); }}
$server = IoServer::factory( new HttpServer( new WsServer( new MyWebSocket() ) ), 8080);
echo "خادم WebSocket قيد التشغيل على المنفذ 8080...";$server->run();قم بتشغيل الخادم بالأمر:
php server.phpالآن الخادم يستمع على المنفذ 8080. للاختبار، يمكنك استخدام أي عميل WebSocket، مثل إضافة للمتصفح أو كود JavaScript بسيط.
الجزء العميل بلغة JavaScript
أنشئ ملف HTML باسم client.html:
<!DOCTYPE html><html><head> <title>عميل WebSocket</title></head><body> <input type="text" id="message" placeholder="أدخل