WebSocket библиотека Ratchet для PHP: полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Библиотека Ratchet для WebSocket в PHP

В современной веб-разработке всё чаще требуется обмен данными в реальном времени: чаты, уведомления, онлайн-игры, совместное редактирование документов. Традиционный HTTP не подходит для таких задач, так как он работает по схеме «запрос-ответ». На помощь приходит протокол WebSocket, который устанавливает постоянное двустороннее соединение между клиентом и сервером.

Для PHP одной из самых популярных и зрелых библиотек для работы с WebSocket является Ratchet. Она предоставляет удобный API для создания WebSocket-серверов, которые могут обрабатывать множество одновременных подключений. В этой статье мы подробно разберём, как установить Ratchet, написать простой сервер и клиент, а также рассмотрим типичные сценарии использования.

Что такое Ratchet?

Ratchet — это библиотека для PHP, написанная на основе ReactPHP (асинхронного event-loop). Она позволяет создавать WebSocket-серверы, которые работают в реальном времени, без необходимости в дополнительных модулях (вроде ext-sockets или ext-event). Библиотека поддерживает стандарт RFC 6455 (WebSocket) и легко интегрируется с любыми PHP-приложениями.

Основные возможности Ratchet:

  • Поддержка протокола WebSocket (версии 13 и ниже).
  • Возможность создания собственных контроллеров для обработки сообщений.
  • Встроенная поддержка WAMP (WebSocket Application Messaging Protocol) для pub/sub (издатель-подписчик) и RPC (удалённый вызов процедур).
  • Лёгкая интеграция с фреймворками (Laravel, Symfony) через отдельные пакеты.
  • Высокая производительность благодаря асинхронной архитектуре ReactPHP.

Установка Ratchet

Установка производится через Composer. Для этого в корне вашего проекта выполните команду:

composer require cboden/ratchet

После установки в вашем проекте появится директория vendor с библиотекой и её зависимостями (включая ReactPHP). Убедитесь, что у вас установлен PHP версии 7.1 или выше.

Создание простого WebSocket-сервера

Напишем простой сервер, который принимает сообщения от клиентов и отправляет их обратно (эхо-сервер). Создайте файл server.php:

<?php
require __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}\n";
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        echo "Получено сообщение от {$from->resourceId}: {$msg}\n";
        // Отправляем сообщение обратно отправителю
        $from->send("Эхо: {$msg}");
    }

    public function onClose(ConnectionInterface $conn) {
        echo "Подключение {$conn->resourceId} закрыто\n";
    }

    public function onError(ConnectionInterface $conn, \Exception $e) {
        echo "Ошибка: {$e->getMessage()}\n";
        $conn->close();
    }
}

// Запускаем сервер на порту 8080
$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new EchoServer()
        )
    ),
    8080
);

echo "WebSocket сервер запущен на порту 8080\n";
$server->run();

Запустите сервер командой php server.php. Он будет слушать входящие WebSocket-соединения на порту 8080.

Создание клиента (JavaScript)

Для тестирования создайте простой HTML-файл с JavaScript-клиентом:

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket клиент</title>
</head>
<body>
    <input type="text" id="messageInput" placeholder="Введите сообщение" />
    <button onclick="sendMessage()">Отправить</button>
    <div id="messages"></div>

    <script>
        const ws = new WebSocket('ws://localhost:8080');

        ws.onopen = function() {
            document.getElementById('messages').innerHTML += '<p>Соединение установлено</p>';
        };

        ws.onmessage = function(event) {
            document.getElementById('messages').innerHTML += '<p>Получено: ' + event.data + '</p>';
        };

        ws.onerror = function(error) {
            console.error('Ошибка WebSocket:', error);
        };

        function sendMessage() {
            const input = document.getElementById('messageInput');
            ws.send(input.value);
            input.value = '';
        }
    </script>                    

Рекомендаций