php調用Workerman管理定時任務詳解
在 Workerman 中管理定時任務(啟動、重啟、停止)需要結合 Timer 類和 Worker 進程的生命周期。以下是詳細操作步驟:
1. 啟動定時任務
定時任務通常在 onWorkerStart 回調中注冊,Worker 進程啟動后自動執(zhí)行。
代碼示例
use Workerman\Worker; use Workerman\Timer; require_once __DIR__ . '/vendor/autoload.php'; $worker = new Worker(); // Worker 進程啟動時注冊定時任務 $worker->onWorkerStart = function ($worker) { // 啟動一個每秒執(zhí)行的定時任務 $timerId = Timer::add(1, function () { echo "Running task at " . date('Y-m-d H:i:s') . "\n"; }); // 保存定時器 ID(用于后續(xù)操作) $worker->timerId = $timerId; }; Worker::runAll();
2. 停止定時任務
通過 Timer::del() 方法停止指定定時器。
代碼示例
// 停止單個定時任務 $timerId = Timer::add(2, function () { /* ... */ }); Timer::del($timerId); // 停止所有定時任務 Timer::delAll(); // 慎用!會停止當前進程所有定時器 動態(tài)停止示例 $worker->onMessage = function ($connection, $data) use ($worker) { // 收到特定指令時停止定時任務 if ($data === 'stop') { Timer::del($worker->timerId); $connection->send("定時任務已停止"); } };
3. 重啟定時任務
重啟需要先停止舊任務,再重新注冊新任務。
代碼示例
// 假設 $oldTimerId 是已存在的定時器 ID $newTimerId = Timer::add(5, function () { /* 新任務邏輯 */ }); Timer::del($oldTimerId); // 停止舊任務 // 或通過閉包動態(tài)更新 $worker->onWorkerStart = function ($worker) { $worker->timerId = Timer::add(1, function () use ($worker) { static $count = 0; $count++; echo "執(zhí)行次數(shù): $count\n"; // 達到條件后重啟任務(例如修改間隔時間) if ($count >= 5) { Timer::del($worker->timerId); $worker->timerId = Timer::add(2, function () { echo "重啟后的任務\n"; }); } }); };
4. 多進程環(huán)境注意事項
單例任務:如果只需要一個進程運行定時任務,在 onWorkerStart 中通過進程 ID 控制:
$worker->onWorkerStart = function ($worker) { if ($worker->id === 0) { // 僅第一個進程執(zhí)行 Timer::add(1, function () { /* ... */ }); } };
分布式部署:多臺服務器時,使用 Redis 鎖或數(shù)據(jù)庫標記確保任務唯一性。
5. 通過命令行管理 Worker
Workerman 的定時任務依賴于 Worker 進程,因此可通過管理 Worker 間接控制定時任務:
操作 | 命令 | 說明 |
---|---|---|
啟動 | php yourfile.php start | 啟動 Worker 進程,定時任務自動運行 |
平滑重啟 | php yourfile.php reload | 重新加載業(yè)務代碼,定時任務會重新初始化 |
強制停止 | php yourfile.php stop | 停止所有 Worker 進程(立即終止) |
優(yōu)雅停止 | php yourfile.php stop -g | 等待當前任務完成后再停止 |
6. 動態(tài)控制定時任務(高級)
結合 HTTP 接口或自定義信號動態(tài)管理:
示例:通過 HTTP 接口控制
$httpWorker = new Worker('http://0.0.0.0:8080'); $httpWorker->onMessage = function ($connection, $request) { $action = $request->get('action'); switch ($action) { case 'start': $timerId = Timer::add(1, function () { /* ... */ }); $connection->send("定時任務 ID: $timerId"); break; case 'stop': $timerId = $request->get('timer_id'); Timer::del($timerId); $connection->send("已停止任務"); break; } };
示例:通過信號控制
// 注冊自定義信號 Worker::$onMasterReload = function () { // 收到 SIGUSR1 信號時重啟某個任務 Timer::del($oldTimerId); $newTimerId = Timer::add(3, function () { /* ... */ }); };
7. 注意事項
持久化存儲:定時器 ID 保存在內存中,進程重啟后會丟失,需外部存儲(如 Redis)記錄關鍵任務狀態(tài)。
原子操作:多進程操作時,使用鎖機制避免競爭條件。
異常處理:
Timer::add(1, function () { try { // 業(yè)務邏輯 } catch (Throwable $e) { echo "定時任務異常: " . $e->getMessage(); } });
總結
操作 | 方法 | 場景 |
---|---|---|
啟動 | Timer::add() | Worker 啟動時自動注冊 |
停止 | Timer::del() 或 Timer::delAll() | 動態(tài)終止指定或全部任務 |
重啟 | 先 del() 再 add() | 修改間隔時間或任務邏輯 |
全局控制 | 命令行 start/stop/reload | 管理整個 Worker 進程生命周期 |
到此這篇關于php調用Workerman管理定時任務詳解的文章就介紹到這了,更多相關php Workerman定時任務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺談PHP的排列組合(如輸入a,b,c 輸出他們的全部組合)
下面小編就為大家?guī)硪黄獪\談PHP的排列組合(如輸入a,b,c 輸出他們的全部組合)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03微信自定義菜單的創(chuàng)建/查詢/取消php示例代碼
這篇文章主要為大家詳細介紹了微信自定義菜單的創(chuàng)建/查詢/取消php示例代碼,感興趣的小伙伴們可以參考一下2016-08-08