問題:
我發(fā)送一個(gè)信息,要求在明天中午12:00點(diǎn),發(fā)給所有在線用戶,然后關(guān)閉此定時(shí)器。,
我的實(shí)現(xiàn):
$time_interval =60;
\Workerman\Lib\Timer::add($time_interval, function($info,$onlinetime)
{
if(time()>=$onlinetime)
{
$info=json_encode($info);
Gateway::sendToAll($info);
(在這里怎***_么_關(guān)閉這個(gè)定時(shí)器)
}else
{
echo '時(shí)間未到';
}
},array($info,$onlinetime));
global $timer_id;
$time_interval =60;
$timer_id = \Workerman\Lib\Timer::add($time_interval, function($info,$onlinetime)
{
if(time()>=$onlinetime)
{
$info=json_encode($info);
Gateway::sendToAll($info);
global $timer_id;
\Workerman\Lib\Timer::del($timer_id);
}
else
{
echo '時(shí)間未到';
}
},array($info,$onlinetime));
或者這樣也行
$time_interval =60;
$timer_id = \Workerman\Lib\Timer::add($time_interval, function($info,$onlinetime)use(&$timer_id)
{
if(time()>=$onlinetime)
{
$info=json_encode($info);
Gateway::sendToAll($info);
\Workerman\Lib\Timer::del($timer_id);
}
else
{
echo '時(shí)間未到';
}
},array($info,$onlinetime));
第一種方式在有多個(gè)計(jì)時(shí)器的時(shí)候會(huì)不會(huì)引起問題?
第二種方式親測不行,debug模式下會(huì)報(bào) Undefined variable 錯(cuò)誤。
我的解決方式是模擬js的寫法,每次添加一個(gè)非永久計(jì)時(shí)器,然后在內(nèi)部如果滿足某些條件則直接return,否則繼續(xù)添加這個(gè)計(jì)時(shí)器。
$timer_func = function($some_var, $timer_func) {
if (/_something_/) return;
//do something
\Workerman\Lib\Timer::add(10, $timer_func, , false);
};
\Workerman\Lib\Timer::add(10, $timer_func, , false);
大概就是這種寫法,經(jīng)過測試是沒問題的
@fdream
第一種多個(gè)定時(shí)器會(huì)有問題,全局變量timer_id會(huì)被覆蓋
第二種肯定沒問題,注意use里面$timer_id前有個(gè)引用&
定時(shí)器內(nèi)銷毀當(dāng)前定時(shí)器可以參考手冊 Timer::add 中實(shí)例7 實(shí)例8
http://doc.workerman.net/timer/add.html