国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

workerman 守護(hù)進(jìn)程方式啟動(dòng)出現(xiàn)的問(wèn)題

李海峰

大神,請(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();
}
7095 1 0
1個(gè)回答

walkor 打賞

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);redis初始化放到onWorkerStart里試下,如果放在啟動(dòng)入口文件直接初始化redis連接則屬于在主進(jìn)程初始化了redis連接,每個(gè)子進(jìn)程都復(fù)用這個(gè)連接會(huì)導(dǎo)致數(shù)據(jù)混亂。onWorkerStart里初始化連接這樣屬于每個(gè)子進(jìn)程初始化連接,每個(gè)進(jìn)程擁有自己的redis連接,互相不影響
?

  • 李海峰 2018-12-10

    問(wèn)題好像解決了,我再觀察下,非常感謝,辛苦了~

年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表回答
??