Swoole Timer 的應用

你好,Swoole

PHP 的協程高性能網絡通信引擎,使用 C/C++ 語言編寫,提供了多種通信協議的網絡服務器和客戶端模塊。

Swoole 可應用於互聯網、移動通信、企業軟件、網絡遊戲、物聯網、車聯網、智能家庭等領域。

學習 Swoole 之前,最好先了解下底層知識,比如,線程/進程、IO、TCP/IP協議 等。

推薦大家讀一下《Linux 高性能服務器編程》這本書。我有這本書的PDF版,需要的可以關注公衆號,回覆 “Linux 高性能服務器編程” 即可獲取。

這篇文章主要分享 Timer 毫秒精度的定時器。

本地版本:PHP 7.2.6、Swoole 4.3.1。

Timer

主要有三個方法:

swoole_timer_tick 間隔的時鐘控制器

swoole_timer_after 指定的時間後執行

swoole_timer_clear 刪除定時器

示例代碼:

//每隔3000ms觸發一次
$timer_id = swoole_timer_tick(3000, function () {
    echo "tick 3000ms - ".date('Y-m-d H:i:s')."\n";
});

//9000ms後刪除定時器
swoole_timer_after(9000, function () use ($timer_id) {
    echo "after 9000ms - ".date('Y-m-d H:i:s')."\n";
    swoole_timer_clear($timer_id);
});

運行結果:

tick 3000ms - 2019-04-07 21:36:56
tick 3000ms - 2019-04-07 21:36:59
tick 3000ms - 2019-04-07 21:37:02
after 9000ms - 2019-04-07 21:37:02

應用場景

一、比如,每天凌晨跑業務腳本,腳本中包括了請求其他業務方或第三方的接口,如果接口超時無響應或沒有數據返回,需要進行重試。

重試機制爲:每5隔分鐘再發送一次請求,最多嘗試5次,在5次內成功停止該任務,5次仍失敗也停止該任務。

示例代碼:

$api_url  = 'xxx'; //接口地址
$exec_num = 0;     //執行次數
swoole_timer_tick(5*60*1000, function($timer_id) use ($api_url, &$exec_num) {
    $exec_num ++ ;
    $result = $this->requestUrl($api_url);
    echo date('Y-m-d H:i:s'). " 執行任務中...(".$exec_num.")\n";
    if ($result) {
        //業務代碼...
        swoole_timer_clear($timer_id); // 停止定時器
        echo date('Y-m-d H:i:s'). " 第(".$exec_num.")次請求接口任務執行成功\n";
    } else {
        if ($exec_num >= 5) {
            swoole_timer_clear($timer_id); // 停止定時器
            echo date('Y-m-d H:i:s'). " 請求接口失敗,已失敗5次,停止執行\n";
        } else {
            echo date('Y-m-d H:i:s'). " 請求接口失敗,5分鐘後再次嘗試\n";
        }
    }
});

運行結果:

2019-04-07 21:40:48 執行任務中...(1)
2019-04-07 21:40:48 請求接口失敗,5分鐘後再次嘗試
2019-04-07 21:45:48 執行任務中...(2)
2019-04-07 21:45:48 請求接口失敗,5分鐘後再次嘗試
2019-04-07 21:50:48 執行任務中...(3)
2019-04-07 21:50:48 請求接口失敗,5分鐘後再次嘗試
2019-04-07 21:55:48 執行任務中...(4)
2019-04-07 21:55:48 請求接口失敗,5分鐘後再次嘗試
2019-04-07 22:00:48 執行任務中...(5)
2019-04-07 22:00:48 請求接口失敗,已失敗5次,停止執行

二、比如,設計一個用WEB界面管理管理定時任務的系統。

Linux Crontab 最小時間粒度爲分鐘。

PHP Swoole 最小時間粒度爲毫秒。

0   1   2   3   4   5
|   |   |   |   |   |
|   |   |   |   |   +------ day of week (0 - 6) (Sunday=0)
|   |   |   |   +------ month (1 - 12)
|   |   |   +-------- day of month (1 - 31)
|   |   +---------- hour (0 - 23)
|   +------------ min (0 - 59)
+-------------- sec (0-59)

WEB界面管理

  • 登錄、權限管理
  • 任務管理(增刪改查)
  • 腳本機管理(機器IP地址)
  • 任務日誌

架構圖

clipboard.png

項目地址

https://github.com/osgochina/...

三、比如,監控服務器狀況。

參考文檔

推薦閱讀

本文歡迎轉發,轉發請註明作者和出處,謝謝!

clipboard.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章