dimns/websocket-php

基于 Workerman 的 PHP WebSocket 服务器

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

This package is auto-updated.

Last update: 2024-09-04 13:11:19 UTC


README

基于 Workerman 的 PHP WebSocket 服务器

服务器

  1. 安装(建议在项目内部安装,以便访问您的代码以确定用户 ID 并方便向客户端发送消息)

    composer require dimns/websocket-php

    * 在 Linux 上安装时,需要 php-模块 ext-posixext-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) 必需 - 会话 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) 可选 - 消息数据数组