WebSocket — это протокол двусторонней связи поверх TCP-соединения, позволяющий организовать постоянное соединение между клиентом (браузером) и сервером. В отличие от HTTP, где соединение разрывается после каждого запроса, WebSocket сохраняет соединение открытым, обеспечивая:
Ratchet — это библиотека PHP для работы с WebSocket.
Установка:
composer require cboden/ratchet
Серверный код:
<?php
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
class MyChat implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
$this->clients->attach($conn);
echo "New connection! ({$conn->resourceId})\n";
}
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 "Connection {$conn->resourceId} has disconnected\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close();
}
}
$server = IoServer::factory(
new HttpServer(
new WsServer(
new MyChat()
)
),
8080
);
$server->run();
Запуск сервера:
php server.php
const socket = new WebSocket('ws://ваш-сервер:8080');
socket.onopen = function(e) {
console.log('Соединение установлено');
socket.send('Привет, сервер!');
};
socket.onmessage = function(event) {
console.log(`Получены данные: ${event.data}`);
};
socket.onclose = function(event) {
console.log('Соединение закрыто');
};
socket.onerror = function(error) {
console.log(`Ошибка: ${error.message}`);
};
WebSocket в PHP имеет ограничения из-за синхронной природы языка. Для высоконагруженных систем лучше рассмотреть:
WebSocket — мощный инструмент для real-time приложений. В PHP его удобнее всего реализовывать через Ratchet, но для высоких нагрузок стоит рассмотреть альтернативные технологии. Всегда учитывайте требования к масштабируемости и отказоустойчивости при проектировании.