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

關于刪除Timer的問題

3p大法好

新建了一個woker專門跑定時任務

<?php
use \Workerman\Worker;
use \Workerman\Lib\BaseJson;
use \Workerman\Lib\Timer;
use \Workerman\Connection\AsyncTcpConnection;

// 自動加載類
require_once __DIR__ . '/../../Workerman/Autoloader.php';

$worker = new Worker("text://0.0.0.0:6868");
$worker->name = 'tom_timer';
$worker->count = 1;

$worker->onMessage = function($conn, $data){
    if(!$data){
        return null;
    }

    $result = BaseJson::decode($data);
    if($result=='add'){
        echo 'timer add';
    }else{
        $async = new AsyncTcpConnection('text://0.0.0.0:6868');
        $async->onMessage = function($async) use ($result){
            echo '回調';
            foreach($result as $id){
                $a = Timer::del($id);
                var_dump('刪除timer:'.$id);
            }
        };
        $async->connect();
    }
};

//$worker->$worker;

// 如果不是在根目錄啟動,則運行runAll方法
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

然后這個是Events里面的onclose事件

$worker = new AsyncTcpConnection('text://0.0.0.0:6868');
$worker->onConnect = function ($worker) use ($user_service,$redis,$client_id) {
    //信息保存30分鐘 超時將清除,已避免刷新頁面重復登錄請求
    $timer_id1 = Timer::add(10,  , ,false);
//                $worker->send(BaseJson::encode());

    echo '我是信號id:'.$timer_id1;
    //保存進redis中 如果30分鐘之內登錄  則刪除定時器
    $key = sprintf(TomConst::$const,session_id());
    $redis->sadd($key, $timer_id1);
    $redis->setTimeout($key,10);
};
$worker->connect();

然后這個是onConnect事件

//刪除退出的定時器
$key = sprintf(TomConst::$const,session_id());
$time_ids = $redis->smembers($key);
if($time_ids){
    $worker = new AsyncTcpConnection('text://0.0.0.0:6868');
    $worker->send(BaseJson::encode());
    $worker->connect();
}

邏輯是這樣的,用戶登錄后,按F5刷新頁面,這個時候websocket就斷開了,但是我又不能直接清除用戶的登錄信息,就寫了個10秒鐘后運行的程序,如果用戶在10秒鐘之內重新連接進來,就調用AsyncTcpConnection刪除這個定時器,發(fā)現(xiàn)刪除成功,但是定時器還是執(zhí)行了,我想肯定是添加定時器的進程和處理定時器的進程不一致導致,求解答~~~

5163 2 0
2個回答

walkor 打賞

是的,添加定時器和刪除定時器不是在一個進程中,刪除無效。

  • 3p大法好 2016-05-28

    大大,像我這樣的問題,該用什么解決方案好??

  • 3p大法好 2016-05-28

    我想起來了,我寫去創(chuàng)建的這個進程中。先去試試,等下來問

3p大法好

測試成功
改變創(chuàng)建woker的onMessage方法

$worker->onMessage = function($conn, $data){
    if(!$data){
        return null;
    }
    $result = BaseJson::decode($data);
    $user_service = new \Workerman\Service\UserService();
    $redis = new \Workerman\Lib\MyRedis();
    $key = sprintf(\Workerman\Lib\TomConst::$const,session_id());
    if($result == 'add'){
        echo '添加定時器';
        $timer_id = Timer::add(10,  , ,false);
        //保存進redis中 如果30分鐘之內登錄  則刪除定時器
        $redis->sadd($key, $timer_id);
        $redis->setTimeout($key,10);
    }elseif($result == 'del'){
        $timer_ids = $redis->smembers($key);
        foreach($timer_ids as $id){
            $a = Timer::del($id);
            var_dump('刪除timer:'.$id);
        }
    }
};

Events層只發(fā)送信息,謝謝大大

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