WebSocket библиотека Ratchet: создание реального времени в PHP

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

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

Начать курс

WebSocket библиотека Ratchet для PHP: создание приложений реального времени

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

Что такое Ratchet?

Ratchet — это PHP-библиотека с открытым исходным кодом, которая позволяет разработчикам создавать приложения реального времени, такие как чаты, уведомления, онлайн-игры и системы мониторинга. Она абстрагирует сложность работы с сокетами и асинхронным вводом-выводом, предоставляя удобные классы и интерфейсы.

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

  • Поддержка WebSocket по спецификации RFC 6455
  • Интеграция с HTTP-серверами (например, через ReactPHP)
  • Возможность создавать собственные обработчики сообщений
  • Поддержка WAMP (WebSocket Application Messaging Protocol) для Pub/Sub
  • Легковесность и высокая производительность

Установка Ratchet

Установка библиотеки осуществляется через Composer. Выполните в терминале:

composer require cboden/ratchet

После установки в вашем проекте появится папка vendor с необходимыми зависимостями, включая ReactPHP.

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

Рассмотрим базовый пример: создадим сервер, который принимает соединения и отправляет обратно приветственное сообщение. Для этого создайте файл server.php:

<?php
require '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}\n";
        $conn->send("Добро пожаловать! Ваш ID: {$conn->resourceId}");
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        echo "Получено сообщение от {$from->resourceId}: {$msg}\n";
        // Отправляем всем клиентам
        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} закрыто\n";
    }

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

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new MyWebSocket()
        )
    ),
    8080
);

echo "WebSocket сервер запущен на порту 8080...\n";
$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="Введите сообщение">
    <button onclick="sendMessage()">Отправить</button>
    <div id="output"></div>

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

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

        ws.onmessage = function(event) {
            output.innerHTML += '<p>Сервер: ' + event.data + '</p>';
        };

        ws.onclose = function() {
            output.innerHTML += '<p>Соединение закрыто</p>';
        };

        function sendMessage() {
            const msg = document.getElementById('message').value;
            ws.send(msg);
            document.getElementById('message').value = '';
        }
    </script>
</body>
</html>

Расши

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