dimns/websocket-php

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

v1.4.0 2022-12-28 05:59 UTC

This package is auto-updated.

Last update: 2024-04-04 12:23:48 UTC


README

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) Не обязательно - Массив данных сообщения