用前端推送可以成功,想改成通過push.php中轉(zhuǎn)一下
?push.php推送端
<?php
/**
* 認(rèn)真編碼 快樂生活
* User: helloJiu
* Date: 2018/9/12
* Time: 18:06
*/
// 建立socket連接到內(nèi)部推送端口
$client = stream_socket_client('tcp://127.0.0.1:1234', $errno, $errmsg, 1);
$data = array('cmd'=>'add_group', 'group_id'=>'123','message'=>'oo');
fwrite($client, json_encode($data));
// 讀取推送結(jié)果
echo fread($client, 8192);
fclose($client);
前端推送
ws = new WebSocket('wss://socket.a.cn/wss');
ws.onmessage = function(data){console.log(data.data)};
ws.onopen = function() {
ws.send('{"cmd":"add_group", "group_id":"123"}');
ws.send('{"cmd":"send_to_group", "group_id":"123", "message":"哈哈哈1"}');
};
服務(wù)端start.php
<?php
require_once './Workerman/Autoloader.php';
require_once './Workerman/Lib/Timer.php';
require_once './channel/src/Server.php';
require_once './channel/src/Client.php';
use Workerman\Worker;
$channel_server = new Channel\Server('0.0.0.0', 2206);
$worker = new Worker('websocket://0.0.0.0:1234');
$worker->count = 8;
// 全局群組到連接的映射數(shù)組
$group_con_map = array();
$worker->onWorkerStart = function(){
// Channel客戶端連接到Channel服務(wù)端
Channel\Client::connect('127.0.0.1', 2206);
// 監(jiān)聽全局分組發(fā)送消息事件
Channel\Client::on('send_to_group', function($event_data){
$group_id = $event_data;
$message = $event_data;
global $group_con_map;
var_dump(array_keys($group_con_map));
if (isset($group_con_map)) {
foreach ($group_con_map as $con) {
$con->send($message);
}
}
});
};
$worker->onMessage = function($con, $data){
// 加入群組消息{"cmd":"add_group", "group_id":"123"}
// 或者 群發(fā)消息{"cmd":"send_to_group", "group_id":"123", "message":"這個是消息"}
$data = json_decode($data, true);
var_dump($data);
$cmd = $data;
$group_id = $data;
switch($cmd) {
// 連接加入群組
case "add_group":
global $group_con_map;
// 將連接加入到對應(yīng)的群組數(shù)組里
$group_con_map = $con;
// 記錄這個連接加入了哪些群組,方便在onclose的時候清理group_con_map對應(yīng)群組的數(shù)據(jù)
$con->group_id = isset($con->group_id) ? $con->group_id : array();
$con->group_id = $group_id;
break;
// 群發(fā)消息給群組
case "send_to_group":
// Channel\Client給所有服務(wù)器的所有進(jìn)程廣播分組發(fā)送消息事件
Channel\Client::publish('send_to_group', array(
'group_id'=>$group_id,
'message'=>$data
));
break;
}
};
// 這里很重要,連接關(guān)閉時把連接從全局群組數(shù)據(jù)中刪除,避免內(nèi)存泄漏
$worker->onClose = function($con){
global $group_con_map;
// 遍歷連接加入的所有群組,從group_con_map刪除對應(yīng)的數(shù)據(jù)
if (isset($con->group_id)) {
foreach ($con->group_id as $group_id) {
unset($group_con_map);
}
if (empty($group_con_map)) {
unset($group_con_map);
}
}
};
Worker::runAll();