我的问题大致和下面这位的一致,就是我开启了Websocket客户端和Websocket服务端连接成功后,我想从其他程序(同服务器中的其他框架项目)将消息推送给这个Websocket客户端,从而和Websocket服务端进行交互。
https://www.workerman.net/q/9045
我是刚刚开始学习,按照其他问题的示例,我开启了一个text协议的worker,并通过global方式传入websocket客户端的worker。
<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
global $worker1;
$worker1 = new Worker();
$worker1->onWorkerStart = function($worker1){
// ssl需要访问443端口
$con = new AsyncTcpConnection('ws://im-dev.xxxx.com:443/ws/');
$con->headers = [
'Sec-WebSocket-Protocol' => 'xmpp',
];
// 设置以ssl加密方式访问,使之成为wss
$con->transport = 'ssl';
$con->onConnect = function($connection){
echo "tcp connected\n";
};
$con->onWebSocketConnect = function(AsyncTcpConnection $con) {
var_dump('onWebSocketConnect');
$con->send("<open xmlns='urn:ietf:params:xml:ns:xmpp-framing' version='1.0'/>");
};
$con->onMessage = function(AsyncTcpConnection $con, $data) {
global $worker1;
var_dump('onMessage');
var_dump($data);
$worker1->con = $con;
};
// 连接上发生错误时,一般是连接远程websocket服务器失败错误
$con->onError = function($connection, $code, $msg){
echo "error: $msg\n";
};
$con->onClose = function($connection){
echo "connection closed and try to reconnect\n";
// 如果连接断开,1秒后重连
//$connection->reConnect(1);
};
$con->connect();
};
$worker2 = new Worker();
$worker2->onWorkerStart = function($worker2){
// 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
$inner_text_worker = new Worker('Text://0.0.0.0:5678');
$inner_text_worker->onMessage = function($connection, $buffer)
{
global $worker1;
// $data数组格式,里面有uid,表示向那个uid的页面推送数据
$data = json_decode($buffer, true);
$uid = $data['uid'];
var_dump('收到数据', $data);
$worker1->con->send("<open xmlns='urn:ietf:params:xml:ns:xmpp-framing' version='1.0'/>");
var_dump('23232323');
};
$inner_text_worker->listen();
};
Worker::runAll();
然后用push.php调用。
<?php
// 建立socket连接到内部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = array('uid'=>'uid1', 'percent'=>'88%');
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);
结果显示我的global不起作用
是哪里出现了问题,请大家指教一下。
只启动一个worker1,不用启动worker2,worker2的代码合并到worker1里
放到了worker1里,但是执行push.php时阻塞了,给websocket服务端发送消息也没有成功。
代码放到了下面。请指点。
解决了,text进程的onMessage不使用global,使用use($worker1)。阻塞的问题,把echo fread($client, 8192)去除掉就可以了。谢谢。
之前有写到同一个worker里,我又试了一下,然后推送时push.php阻塞了,第62行的发送消息也没有发送成功。