大神,請(qǐng)麻煩幫忙看下這個(gè)問(wèn)題,
正常用 php start.php start 這種啟動(dòng)方式時(shí) 對(duì)某個(gè)uid 發(fā)送消息是沒(méi)有問(wèn)題的,
但是用 php start.php start -d 這種守護(hù)進(jìn)程方式啟動(dòng)時(shí) 對(duì)某個(gè)uid發(fā)送信息 內(nèi)容是錯(cuò)誤的,比如正常應(yīng)該發(fā)送300 但是發(fā)送的是100或200的值。
邏輯為?workerStart里寫(xiě)個(gè)定時(shí)器 定時(shí)從redis里取uid返回狀態(tài),
uid為key, value分別為 100, 200, 300
?start_io.php
use Workerman\Worker;
use Workerman\WebServer;
use Workerman\Lib\Timer;
use PHPSocketIO\SocketIO;
include __DIR__ . '/vendor/autoload.php';
//redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 全局?jǐn)?shù)組保存uid在線(xiàn)數(shù)據(jù)
$uidConnectionMap = [];
// PHPSocketIO服務(wù)
$sender_io = new SocketIO(2120);
// 客戶(hù)端發(fā)起連接事件時(shí),設(shè)置連接socket的各種事件回調(diào)
$sender_io->on('connection', function($socket) {
// 當(dāng)客戶(hù)端發(fā)來(lái)登錄事件時(shí)觸發(fā)
$socket->on('login', function($uid) use($socket) {
global $uidConnectionMap;
//已經(jīng)登錄過(guò)了
if(isset($uidConnectionMap)) {
return;
}
// 更新對(duì)應(yīng)uid的在線(xiàn)數(shù)據(jù)
$uid = (string)$uid;
// 將這個(gè)連接加入到uid分組,方便針對(duì)uid推送數(shù)據(jù)
$socket->join($uid);
$socket->uid = $uid;
$uidConnectionMap = $uid;
});
// 當(dāng)客戶(hù)端斷開(kāi)連接是觸發(fā)(一般是關(guān)閉網(wǎng)頁(yè)或者跳轉(zhuǎn)刷新導(dǎo)致)
$socket->on('disconnect', function () use($socket) {
global $uidConnectionMap;
if(isset($socket->uid)) {
unset($uidConnectionMap);
} else {
return;
}
});
});
// 當(dāng)$sender_io啟動(dòng)后監(jiān)聽(tīng)一個(gè)http端口,通過(guò)這個(gè)端口可以給任意uid或者所有uid推送數(shù)據(jù)
$sender_io->on('workerStart', function() {
// 監(jiān)聽(tīng)一個(gè)http端口
$inner_http_worker = new Worker('http://0.0.0.0:2121');
// 執(zhí)行監(jiān)聽(tīng)
$inner_http_worker->listen();
// 一個(gè)定時(shí)器,定時(shí)向所有uid推送當(dāng)前uid在線(xiàn)數(shù)及在線(xiàn)頁(yè)面數(shù)
Timer::add(5, function() {
global $sender_io, $uidConnectionMap, $redis;
if(!empty($uidConnectionMap)) {
foreach($uidConnectionMap as $uid) {
$result = $redis->hget('workers', $uid);
$result = intval($result);
//$sender_io->to($uid)->emit('new_msg', json_encode());
// 對(duì) uid 發(fā)送 message
if($result > 0) {
$sender_io->to($uid)->emit('new_msg', json_encode());
unset($uidConnectionMap);
}
}
}
});
});
if(!defined('GLOBAL_START')) {
Worker::runAll();
}