黄p网站_在线看中文字幕_亚洲电影免费观看_成人激情视频_欧美成视频_中国av在线

Timer定時器

框架對Swoole毫秒級定時器進行了封裝,方便開發(fā)者快速上手。

注意??:定時器傳入的時間參數(shù)為毫秒,若開啟了 reload_async 配置時,請將定時器移動到自定義進程內(nèi),否則會導(dǎo)致worker進程無法reload。

循環(huán)執(zhí)行

設(shè)置一個間隔時鐘定時器,每隔一定的時間定時觸發(fā),直到進行 clear 操作才會停止,對應(yīng) Swoole 原生的定時器函數(shù)為 swoole_timer_tick

函數(shù)原型

/**
* 循環(huán)調(diào)用
* @param int      $ms 循環(huán)執(zhí)行的間隔毫秒數(shù) 傳入整數(shù)型
* @param \Closure $callback 定時器需要執(zhí)行的操作 傳入一個閉包
* @param string    $name 定時器名稱,用于取消該定時器
* @param mixed ...$params 傳入定時器的參數(shù)
* @return int 返回整數(shù)型的定時器編號 可以用該編號停止定時器
*/
public function loop(int $ms, callable $callback, $name = null, ...$params)

示例代碼

// 每隔 10 秒執(zhí)行一次
\EasySwoole\Component\Timer::getInstance()->loop(10 * 1000, function () {
    echo "this timer runs at intervals of 10 seconds\n";
});

延時執(zhí)行

設(shè)置一個延時定時器,延時指定的時間后觸發(fā)對應(yīng)的操作,只會執(zhí)行一次操作,對應(yīng)Swoole 原生的定時器函數(shù)為 swoole_timer_after

函數(shù)原型

/**
* 延時調(diào)用
* @param int      $ms 需要延遲執(zhí)行的時間
* @param \Closure $callback 定時器需要執(zhí)行的操作 傳入一個閉包
* @param mixed ...$params 傳入定時器的參數(shù)
* @return int 返回整數(shù)型的定時器編號 
*/
public function after(int $ms, callable $callback, ...$params)

示例代碼

// 10 秒后執(zhí)行一次
\EasySwoole\Component\Timer::getInstance()->after(10 * 1000, function () {
    echo "ten seconds later\n";
});

清除定時器

注意: 該操作不能用于清除其他進程的定時器,只作用于當(dāng)前進程

定時器創(chuàng)建成功時,會返回一個整數(shù)型編號,調(diào)用本函數(shù)傳入該編號,即可提前停止定時器,對應(yīng) Swoole 原生的定時器函數(shù)為 swoole_timer_clear

函數(shù)原型

/**
* 清除定時器
* @param mixed $timerIdOrName 定時器編號或名稱
* @return bool
*/
public function clear($timerIdOrName)

示例代碼

// 創(chuàng)建一個2秒定時器
$timerId = \EasySwoole\Component\Timer::getInstance()->loop(2 * 1000, function () {
    echo "timeout\n";
},'time');

// 清除該定時器
var_dump(\EasySwoole\Component\Timer::getInstance()->clear($timerId)); // bool(true)
var_dump($timerId); // int(1)

// 定時器得不到執(zhí)行 不輸出:timeout

應(yīng)用實例

注意:定時器不能在服務(wù)啟動之前使用。在服務(wù)啟動以后,添加的定時器僅在當(dāng)前進程中有效。在 WorkerStart 事件中添加定時器時,請注意判斷需要添加定時器的workerId,否則該定時器在每個進程中均會被執(zhí)行。

// 為第一個 Worker 添加定時器
if ($workerId == 0) {
    \EasySwoole\Component\Timer::getInstance()->loop(10 * 1000, function () {
        echo "timer in the worker number 0\n";
    });
}
public static function mainServerCreate(EventRegister $register)
{
    $register->add(EventRegister::onWorkerStart, function (\swoole_server $server, $workerId) {
        //如何避免定時器因為進程重啟而丟失
        //例如在第一個進程 添加一個10秒的定時器
        if ($workerId == 0) {
            \EasySwoole\Component\Timer::getInstance()->loop(10 * 1000, function () {
                // 從數(shù)據(jù)庫,或者是redis中,去獲取下個就近10秒內(nèi)需要執(zhí)行的任務(wù)
                // 例如:2秒后一個任務(wù),3秒后一個任務(wù) 代碼如下
                \EasySwoole\Component\Timer::getInstance()->after(2 * 1000, function () {
                    //為了防止因為任務(wù)阻塞,引起定時器不準(zhǔn)確,把任務(wù)給異步進程處理
                    Logger::getInstance()->console("time 2", false);
                });
                \EasySwoole\Component\Timer::getInstance()->after(3 * 1000, function () {
                    //為了防止因為任務(wù)阻塞,引起定時器不準(zhǔn)確,把任務(wù)給異步進程處理
                    Logger::getInstance()->console("time 3", false);
                });
            });
        }
    });
}

經(jīng)典案例-訂單狀態(tài)超時監(jiān)控

場景說明:在很多搶購的場景中,訂單下單完成后,需要限制其付款時間,或者是在棋牌游戲中,需要對房間狀態(tài)進行監(jiān)控。那么我們可以先把待監(jiān)控的訂單或者是房間壓入redis 隊列中。那么就可以利用 定時器 + 異步進程,去實現(xiàn)對訂單狀態(tài)的循環(huán)監(jiān)控。

主站蜘蛛池模板: 日本黄色毛片 | 欧美一区二区三区在线观看 | 国产精品久久久麻豆 | 久久51 | 国产精品美女久久久久aⅴ国产馆 | 亚洲另类视频 | 国产婷婷在线观看 | 日韩欧美国产一区二区三区 | 一区二区三区国产 | 视频在线一区 | 91精品国产综合久久久蜜臀粉嫩 | 最近中文字幕在线视频1 | 国产一区二区三区视频在线观看 | 欧美日韩中文 | 一区二区视频 | 国产成人精品免费视频大全最热 | 欧美一区二区三区电影 | 天天摸夜夜操 | 久久久久久国产免费 | 日韩欧美国产一区二区三区 | 嫩草懂你 | 午夜视频在线观看网址 | 久久一二三区 | 亚洲精品在线观看免费 | 欧美日韩一区二区视频在线观看 | 一级一片免费视频 | 毛片com| 久久这里有精品视频 | 成人福利在线观看 | 久久精品国产99国产精品 | 精品成人在线视频 | 国产丝袜一区二区三区免费视频 | 欧美成人黑人xx视频免费观看 | 国产999免费视频 | 日韩中文一区 | 一本大道综合伊人精品热热 | 中文字幕乱码亚洲精品一区 | 国产亚洲成av人片在线观看桃 | 国产一区二区三区精品久久久 | 国产网站在线 | 91亚洲国产精品 |