你好,Swoole
這是關於 Swoole 學習的第一篇文章:Swoole Timer 的應用。
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地址)
- 任務日志
項目地址
https://github.com/osgochina/Donkey
三、比如,監控服務器狀況。
參考文檔
本文歡迎轉發,轉發請注明作者和出處,謝謝!