新建了一個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í)行了,我想肯定是添加定時器的進程和處理定時器的進程不一致導致,求解答~~~
測試成功
改變創(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ā)送信息,謝謝大大