由于widows下的php没有完善的进程控制接口,导致windows版本无法在一个启动脚本中实例化多个容器(WorkerWebServerGatewayBusinessWorker)进程。解决方法是使用多个启动脚本,每个脚本启动实例化一个容器。
假设初始化两个Worker实例,则创建两个启动文件 socket_server.php 和 websocket_server.php
例如: socket_server.php
代码语言:javascript复制...
$socket_server = new Worker("tcp://0.0.0.0:5555");
$socket_server->on....
....
websocket_server.php
代码语言:javascript复制 $websocket_server = new Worker("tcp://0.0.0.0:6666");
$websocket_server->on....
...
启动时就可以像这样,直接启动两个脚本,(在cmd命令行中运行) php socket_server.php websocket_server.php
上面示例中初始化了两个进程,一个是socket通讯进程,一个是websocket通讯进程,然而根据你的应用实际上是要一个Worker进程,同时支持两种通讯,这样才方便websocket与socket之间的通讯。所以根据你的实际情况,应该初始化一个同时支持两种通讯方法的Worker进程。方法如下:
代码语言:javascript复制<?php
use WorkermanWorker;
require_once __DIR__ . '/Workerman/Autoloader.php';
// websocket 协议的worker
$ws_worker = new Worker('Websocket://0.0.0.0:5656');
// 这里只能写1
$ws_worker->count = 1;
// websocket server 启动后在当前进程增加一个socket监听
$ws_worker->onWorkerStart = function($ws_worker)
{
// 增加一个Socket端口的监听设备发来的数据
$socket_worker = new Worker('tcp://0.0.0.0:5555');
// 当设备发来数据时如何处理
$socket_worker->onMessage = function($connection, $data)
{
// 这里处理设备发来的数据 $data
// 比如像这样给所有的WebSocket连接转发数据
global $ws_worker;
foreach($ws_worker->connections as $ws_con)
{
$ws_con->send($data);
}
};
// 给ws_worker添加一个属性保存socket_worker,方便获取
$ws_worker->socketWorker = $socket_worker;
// 执行监听
$socket_worker->listen();
};
// websocket协议也就是浏览器发来数据时
$ws_worker->onMessage = function($connection, $data)
{
// 假设需要转发给所有的设备
global $ws_worker;
foreach($ws_worker->socketWorker->connections as $socket_con)
{
$socket_con->send($data);
}
};
Worker::runAll();
上面这个例子是一个进程同时监听多协议多个端口的例子,这样socket 与 websocket之间通讯就会非常方方便,直接内存调用即可。这个例子中业务罗辑为广播,socket可以使用telnet 测试,websocket用浏览器测试,telnet与浏览器之间就可以互相通讯了