我的問(wèn)題大致和下面這位的一致,就是我開(kāi)啟了Websocket客戶(hù)端和Websocket服務(wù)端連接成功后,我想從其他程序(同服務(wù)器中的其他框架項(xiàng)目)將消息推送給這個(gè)Websocket客戶(hù)端,從而和Websocket服務(wù)端進(jìn)行交互。
http://wtbis.cn/q/9045
我是剛剛開(kāi)始學(xué)習(xí),按照其他問(wèn)題的示例,我開(kāi)啟了一個(gè)text協(xié)議的worker,并通過(guò)global方式傳入websocket客戶(hù)端的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需要訪問(wèn)443端口
$con = new AsyncTcpConnection('ws://im-dev.xxxx.com:443/ws/');
$con->headers = [
'Sec-WebSocket-Protocol' => 'xmpp',
];
// 設(shè)置以ssl加密方式訪問(wèn),使之成為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ā)生錯(cuò)誤時(shí),一般是連接遠(yuǎn)程websocket服務(wù)器失敗錯(cuò)誤
$con->onError = function($connection, $code, $msg){
echo "error: $msg\n";
};
$con->onClose = function($connection){
echo "connection closed and try to reconnect\n";
// 如果連接斷開(kāi),1秒后重連
//$connection->reConnect(1);
};
$con->connect();
};
$worker2 = new Worker();
$worker2->onWorkerStart = function($worker2){
// 開(kāi)啟一個(gè)內(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,表示向那個(gè)uid的頁(yè)面推送數(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字段,表示是給這個(gè)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)了問(wèn)題,請(qǐng)大家指教一下。
之前有寫(xiě)到同一個(gè)worker里,我又試了一下,然后推送時(shí)push.php阻塞了,第62行的發(fā)送消息也沒(méi)有發(fā)送成功。
<?php
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
global $worker1;
// 建立與websocket服務(wù)端連接
$worker1 = new Worker();
$worker1->onWorkerStart = function($worker1){
// ssl需要訪問(wèn)443端口
$con = new AsyncTcpConnection('ws://im-dev.gooyee.com:443/ws/');
$con->headers = [
'Sec-WebSocket-Protocol' => 'xmpp',
];
// 設(shè)置以ssl加密方式訪問(wèn),使之成為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ā)生錯(cuò)誤時(shí),一般是連接遠(yuǎn)程websocket服務(wù)器失敗錯(cuò)誤
$con->onError = function($connection, $code, $msg){
echo "error: $msg\n";
};
$con->onClose = function($connection){
echo "connection closed and try to reconnect\n";
// 如果連接斷開(kāi),1秒后重連
//$connection->reConnect(1);
};
$con->connect();
// 開(kāi)啟一個(gè)內(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,表示向那個(gè)uid的頁(yè)面推送數(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();