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>