Когда-то PHP был языком для простых сайтов: форма, база данных, вывод страницы. Но сегодня пользователи хотят мгновенных обновлений: чаты, уведомления, совместное редактирование. И тут на помощь приходят вебсокеты. В этой статье я расскажу, как подружить PHP с этой технологией, какие есть подводные камни и как сделать первый шаг к real-time приложению.
Что такое вебсокеты и зачем они PHP-разработчику
Вебсокет — это постоянный канал связи между браузером и сервером. В отличие от обычных запросов, где клиент каждый раз стучится за данными, здесь соединение открыто, и сервер сам может отправлять сообщения. Представьте телефонный разговор вместо переписки — быстрее и удобнее.
PHP традиционно работает по схеме «запрос-ответ». Но с появлением асинхронных фреймворков (Swoole, ReactPHP, Workerman) он научился держать тысячи одновременных соединений. Это открывает двери для чатов, биржевых котировок, онлайн-игр и многого другого.
Как это работает: клиент-серверная магия
На клиенте мы используем JavaScript API WebSocket. Он подключается к серверу по адресу ws:// или wss:// (защищённый). Сервер на PHP слушает порт и обрабатывает события: подключение, сообщение, отключение.
Вот минимальный клиентский код:
// Подключаемся к серверу
const socket = new WebSocket('ws://localhost:8080');
// Отправляем сообщение при открытии
socket.onopen = () => {
socket.send('Привет, сервер!');
};
// Получаем сообщения
socket.onmessage = (event) => {
console.log('Ответ:', event.data);
};
На стороне сервера PHP должен уметь работать с сокетами. Классический способ — использовать расширение sockets, но это низкоуровнево и неудобно. Лучше взять готовую библиотеку.
Выбираем инструмент: Swoole, Workerman или Ratchet
Есть три популярных подхода для организации вебсокет-сервера на PHP. Сравним их в таблице.
| Инструмент | Особенности | Сложность |
|---|---|---|
| Swoole | Расширение для PHP, асинхронность, высокая производительность, требует установки | Средняя |
| Workerman | Чистый PHP, не требует расширений, простой старт | Низкая |
| Ratchet | Основан на ReactPHP, компонентный подход, хорошая документация | Средняя |
Для быстрого прототипа я советую Workerman. Он не требует установки дополнительных расширений и легко запускается.
Пишем простой чат на Workerman
Установим Workerman через Composer:
composer require workerman/workerman
Создадим файл server.php:
count = 4;
// Хранилище подключений
$connections = [];
$ws_worker->onConnect = function($connection) use (&$connections) {
echo "Новое подключение\n";
$connections[$connection->id] = $connection;
};
$ws_worker->onMessage = function($connection, $data) use (&$connections) {
// Рассылаем сообщение всем подключённым
foreach ($connections as $conn) {
$conn->send("Пользователь {$connection->id}: $data");
}
};
$ws_worker->onClose = function($connection) use (&$connections) {
unset($connections[$connection->id]);
echo "Отключение\n";
};
Worker::runAll();
Запускаем сервер в консоли:
php server.php start
Теперь создадим HTML-страницу с клиентом:
Чат
Откройте страницу в двух окнах браузера и напишите сообщение — оно появится у всех. Поздравляю, вы сделали real-time чат!
wss:// в продакшене. Для этого настройте SSL-сертификат и проксируйте трафик через Nginx или используйте встроенную поддержку TLS в Workerman.
Практические советы и подводные камни
- Не забывайте про心跳 (heartbeat). Клиенты могут отключаться незаметно. Отправляйте пинги каждые 30 секунд, чтобы поддерживать соединение.
- Храните состояние в Redis или базе. Если у вас несколько процессов, соединения не будут знать друг о друге. Используйте общий канал для обмена сообщениями.
- Обрабатывайте ошибки. Всегда добавляйте обработчики
onErrorиonCloseна клиенте, чтобы переподключаться при обрыве. - Тестируйте под нагрузкой. Инструменты вроде Apache Bench или специальные бенчмарки для вебсокетов помогут понять пределы вашего сервера.
Ещё один лайфхак: для аутентификации можно передавать токен в первом сообщении или через параметры URL при подключении. Не храните пароли в открытом виде!
Что в итоге
PHP и вебсокеты — это не фантастика, а рабочий инструмент. С помощью Workerman, Swoole или Ratchet вы можете создавать чаты, системы уведомлений, онлайн-игры и совместные редакторы. Главное — понимать, что сервер должен работать постоянно, а не по запросу. Начните с простого прототипа, а затем масштабируйте, добавляя Redis и балансировку.
Попробуйте прямо сегодня: установите Workerman, запустите пример из статьи и откройте два окна браузера. Уверен, вы удивитесь, насколько это просто.


