dimns / websocket-php
WebSocket сервер на php (построен на базе Workerman)
v1.4.0
2022-12-28 05:59 UTC
Requires
- php: >=7.0.0
- ext-json: *
- monolog/monolog: ~2.3
- workerman/workerman: ~3.5
Suggests
- ext-pcntl: Needed on Linux to access function: pcntl_fork()
- ext-posix: Needed on Linux to access functions: posix_kill() and posix_getpid()
README
WebSocket сервер на php (построен на базе Workerman)
Сервер
-
Установка (рекомендуется устанавливать внутри проекта, чтобы иметь доступ к вашему коду для определения ID пользователя и удобной отправки сообщений клиентам)
composer require dimns/websocket-php
* При установке на
Linux
необходимы php-модулиext-posix
иext-pcntl
-
Создаём файл
/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();
-
Запускаем сервер
/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; }
Клиент
-
Установка (внутри вашего проекта)
npm i dimns-websocket-js
-
Подключение
<script type="text/javascript" src="dist/websocket.min.js"></script>
-
Инициализация
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) Не обязательно - Массив данных сообщения