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

workerman 守護進程方式啟動出現(xiàn)的問題

李海峰

大神,請麻煩幫忙看下這個問題,
正常用 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();
}
7207 1 0
1個回答

walkor 打賞

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

  • 李海峰 2018-12-10

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

年代過于久遠,無法發(fā)表回答
??