我的問題大致和下面這位的一致,就是我開啟了Websocket客戶端和Websocket服務端連接成功后,我想從其他程序(同服務器中的其他框架項目)將消息推送給這個Websocket客戶端,從而和Websocket服務端進行交互。
http://m.wtbis.cn/q/9045
我是剛剛開始學習,按照其他問題的示例,我開啟了一個text協(xié)議的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',
];
// 設(shè)置以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;
};
// 連接上發(fā)生錯誤時,一般是連接遠程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){
// 開啟一個內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù),Text協(xié)議格式 文本+換行符
$inner_text_worker = new Worker('Text://0.0.0.0:5678');
$inner_text_worker->onMessage = function($connection, $buffer)
{
global $worker1;
// $data數(shù)組格式,里面有uid,表示向那個uid的頁面推送數(shù)據(jù)
$data = json_decode($buffer, true);
$uid = $data['uid'];
var_dump('收到數(shù)據(jù)', $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調(diào)用。
<?php
// 建立socket連接到內(nèi)部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
// 推送的數(shù)據(jù),包含uid字段,表示是給這個uid推送
$data = array('uid'=>'uid1', 'percent'=>'88%');
// 發(fā)送數(shù)據(jù),注意5678端口是Text協(xié)議的端口,Text協(xié)議需要在數(shù)據(jù)末尾加上換行符
fwrite($client, json_encode($data)."\n");
// 讀取推送結(jié)果
echo fread($client, 8192);
結(jié)果顯示我的global不起作用
是哪里出現(xiàn)了問題,請大家指教一下。
之前有寫到同一個worker里,我又試了一下,然后推送時push.php阻塞了,第62行的發(fā)送消息也沒有發(fā)送成功。
<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
global $worker1;
// 建立與websocket服務端連接
$worker1 = new Worker();
$worker1->onWorkerStart = function($worker1){
// ssl需要訪問443端口
$con = new AsyncTcpConnection('ws://im-dev.gooyee.com:443/ws/');
$con->headers = [
'Sec-WebSocket-Protocol' => 'xmpp',
];
// 設(shè)置以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)use($worker1) {
global $worker1;
var_dump('onMessage');
var_dump($data);
$worker1->con = $con;
};
// 連接上發(fā)生錯誤時,一般是連接遠程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();
// 開啟一個內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù),Text協(xié)議格式 文本+換行符
$inner_text_worker = new Worker('Text://0.0.0.0:5678');
$inner_text_worker->onMessage = function($connection, $buffer)
{
global $worker1;
// $data數(shù)組格式,里面有uid,表示向那個uid的頁面推送數(shù)據(jù)
$data = json_decode($buffer, true);
$uid = $data['uid'];
var_dump('收到數(shù)據(jù)', $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();