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