之前写了个测试 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() 但是死活不进去触发 ,是为什么呢
手册说Events 的 onWebSocketConnect 方法只有在GatewayWorker版本>=3.0.8时才支持。是GatewayWorker版本版本哦,不是workerman版本。
http://doc2.workerman.net/on-web-socket-connect.html
这里说的,你看看是不是版本不对吧。
我用着很好用的
非常感谢 查了下版本为3.0.7 更新版本再试