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

