/websocket-php

WebSocket сервер на php (построен на базе Workerman)

Primary LanguagePHPMIT LicenseMIT

WebSocketPHP

WebSocket сервер на php (построен на базе Workerman)

Сервер

  1. Установка (рекомендуется устанавливать внутри проекта, чтобы иметь доступ к вашему коду для определения ID пользователя и удобной отправки сообщений клиентам)

    composer require dimns/websocket-php

    * При установке на Linux необходимы php-модули ext-posix и ext-pcntl

  2. Создаём файл /var/www/ws_server.php с содержимым:

    <?php
    use WebSocketPHP\Server;
    
    require_once __DIR__ . '/vendor/autoload.php';
    
    // Каталог для логов
    $log_folder = __DIR__ . '/logs/';
    
    // PID-файл
    $pid_file = __DIR__ . '/websocketphp.pid';
    
    // Websocket порт
    $ws_port = 8090;
    
    // TCP порт
    $tcp_port = 5020;
    
    /**
    * Функция для определения ИД пользователя (может отсутствовать)
    *
    * @param string $sid
    *
    * @return integer
    */
    $func_get_user_id = function ($sid) {
        return 0;
    };
    
    $websocket = new Server($log_folder, $pid_file, $ws_port, $tcp_port, $func_get_user_id);
    $websocket->start();
  3. Запускаем сервер /usr/bin/php /var/www/ws_server.php start

    Сервер при старте отвязывается от консоли и создаёт форк для создания pid-файла (с помощью него блокируется множественный запуск сервера, а также можно настроить автоматический запуск сервера в случае его падения)

Настройка Nginx

location /websocket {
    proxy_read_timeout 300s;
    proxy_send_timeout 120s;
    proxy_connect_timeout 75s;
    proxy_pass http://127.0.0.1:8090;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

Клиент

  1. Установка (внутри вашего проекта)

    npm i dimns-websocket-js
  2. Подключение

    <script type="text/javascript" src="dist/websocket.min.js"></script>
  3. Инициализация

    webSocketPHP.init({
        url: 'wss://' + window.location.host + '/websocket',
        sid: '<SESSIONID-OR-USERID>',
        attemptsCount: 5,
        attemptsTimeout: 10,
        debug: false,
        onConnect: null,
        onDisconnect: null,
        onMessage: function (message) {
            console.info(message);
        }
    });
    • url (string) Обязательно - URL до сервера
    • sid (string) Обязательно - ИД сессии, чтобы потом сервер определил ИД пользователя самостоятельно (рекомендуется) или сразу ИД пользователя (крайне не рекомендуется, потому что любой сможет получать сообщения ему не предназначенные)
    • attemptsCount (string) Не обязательно, по умолчанию: 5 - Количество попыток подключения к серверу
    • attemptsTimeout (string) Не обязательно, по умолчанию: 10 - Количество секунд между попытками (в секундах), каждый номер попытки умножается на это число: 1 - 10 сек, 2 - 20 сек и т.д.
    • debug (boolean) Не обязательно, по умолчанию: false - Отображать или нет в консоли информацию при успешном подключении и ошибках
    • onConnect (null|function) Не обязательно, по умолчанию: null - Функция, вызываемая при успешном подключении к серверу
    • onDisconnect (null|function) Не обязательно, по умолчанию: null - Функция, вызываемая при отключении от сервера
    • onMessage (string) Обязательно - Функция, которая получает объект с сообщением от сервера

Отправка сообщения

use WebSocketPHP\Sender;

// TCP порт
$tcp_port = 5020;

$sender = new Sender($tcp_port);

// Всем пользователям
$user_id = 0;
$type = 'test_all';
$data = [
    'variable 1' => 'value 1',
    'variable 2' => 'value 2',
];
$sender->send($user_id, $type, $data);

// Только одному конкретному пользователю
$user_id = 1;
$type = 'test_1';
$data = [
    'variable 1' => 'value 1',
    'variable 2' => 'value 2',
];
$sender->send($user_id, $type, $data);

// Только одному конкретному пользователю
$user_id = 2;
$type = 'test_2';
$sender->send($user_id, $type);

// Одинаковое сообщением нескольким пользователям
$user_id = [1, 2];
$type = 'test_12';
$sender->send($user_id, $type);
  • $user_id (integer|array) Обязательно - ИД пользователя (0 для отправки всем пользователям) или массив ИД пользователей
  • $type (string) Обязательно - Тип сообщения
  • $data (array) Не обязательно - Массив данных сообщения