dimns / websocket-php
基于 Workerman 的 PHP WebSocket 服务器
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
基于 Workerman 的 PHP WebSocket 服务器
服务器
-
安装(建议在项目内部安装,以便访问您的代码以确定用户 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) 必需 - 会话 ID,以便服务器能自动确定用户 ID(推荐)或直接的用户 ID(非常不推荐,因为任何人都可以接收不是发送给他们的消息)
- 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) 必需 - 用户 ID(0 用于发送给所有用户)或用户 ID 数组
- $type (string) 必需 - 消息类型
- $data (array) 可选 - 消息数据数组