Когда-то PHP был языком для простых сайтов: форма, база данных, вывод страницы. Но сегодня пользователи хотят мгновенных обновлений: чаты, уведомления, совместное редактирование. И тут на помощь приходят вебсокеты. В этой статье я расскажу, как подружить PHP с этой технологией, какие есть подводные камни и как сделать первый шаг к real-time приложению.

Digital-студия WNDER

Что такое вебсокеты и зачем они 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, запустите пример из статьи и откройте два окна браузера. Уверен, вы удивитесь, насколько это просто.

Студия WNDER