مكتبة WebSocket Ratchet لـ PHP: إنشاء تطبيقات الوقت الفعلي على الموقع

مدرب بايثون أونلاين للمبتدئين

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

ابدأ الدورة

ما هو WebSocket ولماذا نحتاج مكتبة Ratchet لـ PHP؟

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

لا يحتوي PHP القياسي على دعم مدمج لـ WebSocket، لكن مكتبة Ratchet (التي تستخدم مكون ReactPHP) تسد هذه الفجوة. Ratchet هي مكتبة غير متزامنة تسمح بتشغيل خادم WebSocket مباشرة من PHP، ومعالجة اتصالات متعددة في وقت واحد دون حظر.



الميزات الرئيسية لـ Ratchet

  • غير متزامن - يعتمد على ReactPHP، لا يحجب التدفق أثناء انتظار البيانات.
  • دعم البروتوكولات - WebSocket (RFC 6455)، بالإضافة إلى مكونات HTTP (للتطبيقات الهجينة).
  • البساطة - الحد الأدنى من الكود لتشغيل الخادم.
  • قابلية التوسع - يمكن دمجه مع ZeroMQ أو Redis للعمل في مجموعة.
  • التوافق - يعمل مع أي متصفح حديث عبر كائن WebSocket المدمج.


تثبيت Ratchet

يتم التثبيت عبر Composer. افتح الطرفية في جذر المشروع ونفذ:

composer require cboden/ratchet

بعد التثبيت، ستظهر جميع التبعيات في مجلد vendor بما في ذلك ReactPHP.



إنشاء خادم WebSocket بسيط باستخدام Ratchet

لننشئ ملف 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 Chat implements MessageComponentInterface { protected $clients;

public function __construct() { $this->clients = new \\SplObjectStorage; }

public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); echo "اتصال جديد: {$conn->resourceId}"; }

public function onMessage(ConnectionInterface $from, $msg) { foreach ($this->clients as $client) { if ($from !== $client) { $client->send($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 Chat() ) ), 8080);

echo "الخادم يعمل على المنفذ 8080";$server->run();


شرح الكود

  • Chat - كلاس ينفذ MessageComponentInterface. في onOpen نحفظ الاتصال، وفي onMessage نرسل الرسالة للجميع باستثناء المرسل.
  • IoServer::factory - ينشئ خادماً يعتمد على ReactPHP. نغلف المكون الخاص بنا في WsServer (لـ WebSocket) و HttpServer (للتوافق مع طلبات HTTP).
  • الخادم يستمع على المنفذ 8080. قم بتشغيله بالأمر: php server.php.


الجزء العميل (JavaScript)

أنشئ ملف HTML client.html:

<!DOCTYPE html><html><head>    <title>دردشة WebSocket</title>    <script>        const ws = new WebSocket('ws://localhost:8080');

توصيات