onWebSocketConnect函数触发问题

h0r1z0n

之前写了个测试 3.5.16版本测试的 打开两个websocket ,Events.php onWebSocketConnect写逻辑 测试2304端口可以进入 onWebSocketConnect函数 进行业务实现

<?php 
/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @link http://www.workerman.net/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;

// 自动加载类
require_once __DIR__ . '/../../vendor/autoload.php';

// 0.0.0.0 代表监听本机所有网卡,不需要把0.0.0.0替换成其它IP或者域名
// 这里监听8080端口,如果要监听80端口,需要root权限,并且端口没有被其它程序占用
//$webserver = new WebServer('http://0.0.0.0:2302');
// 类似nginx配置中的root选项,添加域名与网站根目录的关联,可设置多个域名多个目录
//$webserver->addRoot('gw.xxxx.cn', '/data/gw/www/');

// 设置开启多少进程
//$webserver->count = 4;

// #### http worker ####
//$http_worker = new Worker("http://0.0.0.0:2302");
//
//// 4 processes
//$http_worker->count = 4;
//
//// Emitted when data received
//$http_worker->onMessage = function($connection, $data)
//{
//    // $_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_FILES are available
//    var_dump($_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_FILES);
//    // send data to client
//    //$connection->send("hello world \n");
//
//    $connection->send(print_r(Gateway::getClientIdByUid('123456')) );
//
//
//};

// run all workers
//Worker::runAll();
$gateway = new Gateway("websocket://0.0.0.0:2302");
$gateway->name = 'Websocket Gateway';
$gateway->count = 4;
$gateway->lanIp = '127.0.0.1';
$gateway->startPort = 1920;
$gateway->registerAddress = '127.0.0.1:1238';
$gateway->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection , $http_header)
    {
        // 可以在这里判断连接来源是否合法,不合法就关掉连接
        // $_SERVER标识来自哪个站点的页面发起的websocket链接
        //if($_SERVER != 'http://kedou.workerman.net')
        //{
           // $connection->close();
        //}
        // onWebSocketConnect 里面$_GET $_SERVER是可用的
         //var_dump($_GET, $_SERVER,$http_header);
    };
}; 

$gateway = new Gateway("websocket://0.0.0.0:2304");
$gateway->name = 'Another Websocket Gateway';
$gateway->count = 4;
$gateway->lanIp = '127.0.0.1';
$gateway->startPort = 1940;
$gateway->registerAddress = '127.0.0.1:1238';

// gateway 进程,这里使用Text协议,可以用telnet测试
$gateway = new Gateway("tcp://0.0.0.0:2303");
// gateway名称,status方便查看
$gateway->name = 'Socket Gateway';
// gateway进程数
$gateway->count = 2;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口 
$gateway->startPort = 2900;
// 服务注册地址
$gateway->registerAddress = '127.0.0.1:1238';

// 心跳间隔
//$gateway->pingInterval = 10;
// 心跳数据
//$gateway->pingData = '{"type":"ping"}';

/* 
// 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调
$gateway->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection , $http_header)
    {
        // 可以在这里判断连接来源是否合法,不合法就关掉连接
        // $_SERVER标识来自哪个站点的页面发起的websocket链接
        if($_SERVER != 'http://kedou.workerman.net')
        {
            $connection->close();
        }
        // onWebSocketConnect 里面$_GET $_SERVER是可用的
        // var_dump($_GET, $_SERVER);
    };
}; 
*/

// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

然后我在老版本3.5.5上写 也是在不一个不需要的ws服务上写一个onConnect函数(此服务是个wss服务 带证书),然后我新开了一个端口ws服务(无证书), 不在 start_gateway.php 中写onConnect函数 然后在Events.php写了 onWebSocketConnect() 但是死活不进去触发 ,是为什么呢

6114 1 0
1个回答

朕震惊了

手册说Events 的 onWebSocketConnect 方法只有在GatewayWorker版本>=3.0.8时才支持。是GatewayWorker版本版本哦,不是workerman版本。
http://doc2.workerman.net/on-web-socket-connect.html
这里说的,你看看是不是版本不对吧。
我用着很好用的

  • h0r1z0n 2019-01-17

    非常感谢 查了下版本为3.0.7 更新版本再试

年代过于久远,无法发表回答
🔝