最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php調(diào)用Workerman管理定時(shí)任務(wù)詳解

 更新時(shí)間:2025年04月24日 10:47:01   作者:半桶水專家  
Workerman?是一個(gè)高性能的?PHP?Socket?框架,常用于開發(fā)實(shí)時(shí)通信、長(zhǎng)連接服務(wù)等場(chǎng)景,本文主要來和大家聊聊如何使用Workerman管理定時(shí)任務(wù),感興趣的小伙伴可以參考一下

在 Workerman 中管理定時(shí)任務(wù)(啟動(dòng)、重啟、停止)需要結(jié)合 Timer 類和 Worker 進(jìn)程的生命周期。以下是詳細(xì)操作步驟:

1. 啟動(dòng)定時(shí)任務(wù)

定時(shí)任務(wù)通常在 onWorkerStart 回調(diào)中注冊(cè),Worker 進(jìn)程啟動(dòng)后自動(dòng)執(zhí)行。

代碼示例

use Workerman\Worker;
use Workerman\Timer;
 
require_once __DIR__ . '/vendor/autoload.php';
 
$worker = new Worker();
 
// Worker 進(jìn)程啟動(dòng)時(shí)注冊(cè)定時(shí)任務(wù)
$worker->onWorkerStart = function ($worker) {
    // 啟動(dòng)一個(gè)每秒執(zhí)行的定時(shí)任務(wù)
    $timerId = Timer::add(1, function () {
        echo "Running task at " . date('Y-m-d H:i:s') . "\n";
    });
    
    // 保存定時(shí)器 ID(用于后續(xù)操作)
    $worker->timerId = $timerId;
};
 
Worker::runAll();

2. 停止定時(shí)任務(wù)

通過 Timer::del() 方法停止指定定時(shí)器。

代碼示例

// 停止單個(gè)定時(shí)任務(wù)
$timerId = Timer::add(2, function () { /* ... */ });
Timer::del($timerId);
 
// 停止所有定時(shí)任務(wù)
Timer::delAll(); // 慎用!會(huì)停止當(dāng)前進(jìn)程所有定時(shí)器
動(dòng)態(tài)停止示例
$worker->onMessage = function ($connection, $data) use ($worker) {
    // 收到特定指令時(shí)停止定時(shí)任務(wù)
    if ($data === 'stop') {
        Timer::del($worker->timerId);
        $connection->send("定時(shí)任務(wù)已停止");
    }
};

3. 重啟定時(shí)任務(wù)

重啟需要先停止舊任務(wù),再重新注冊(cè)新任務(wù)。

代碼示例

// 假設(shè) $oldTimerId 是已存在的定時(shí)器 ID
$newTimerId = Timer::add(5, function () { /* 新任務(wù)邏輯 */ });
Timer::del($oldTimerId); // 停止舊任務(wù)
 
// 或通過閉包動(dòng)態(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ù)(例如修改間隔時(shí)間)
        if ($count >= 5) {
            Timer::del($worker->timerId);
            $worker->timerId = Timer::add(2, function () { 
                echo "重啟后的任務(wù)\n"; 
            });
        }
    });
};

4. 多進(jìn)程環(huán)境注意事項(xiàng)

單例任務(wù):如果只需要一個(gè)進(jìn)程運(yùn)行定時(shí)任務(wù),在 onWorkerStart 中通過進(jìn)程 ID 控制:

$worker->onWorkerStart = function ($worker) {
    if ($worker->id === 0) { // 僅第一個(gè)進(jìn)程執(zhí)行
        Timer::add(1, function () { /* ... */ });
    }
};

分布式部署:多臺(tái)服務(wù)器時(shí),使用 Redis 鎖或數(shù)據(jù)庫標(biāo)記確保任務(wù)唯一性。

5. 通過命令行管理 Worker

Workerman 的定時(shí)任務(wù)依賴于 Worker 進(jìn)程,因此可通過管理 Worker 間接控制定時(shí)任務(wù):

操作命令說明
啟動(dòng)php yourfile.php start啟動(dòng) Worker 進(jìn)程,定時(shí)任務(wù)自動(dòng)運(yùn)行
平滑重啟php yourfile.php reload重新加載業(yè)務(wù)代碼,定時(shí)任務(wù)會(huì)重新初始化
強(qiáng)制停止php yourfile.php stop停止所有 Worker 進(jìn)程(立即終止)
優(yōu)雅停止php yourfile.php stop -g等待當(dāng)前任務(wù)完成后再停止

6. 動(dòng)態(tài)控制定時(shí)任務(wù)(高級(jí))

結(jié)合 HTTP 接口或自定義信號(hào)動(dòng)態(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("定時(shí)任務(wù) ID: $timerId");
            break;
        case 'stop':
            $timerId = $request->get('timer_id');
            Timer::del($timerId);
            $connection->send("已停止任務(wù)");
            break;
    }
};

示例:通過信號(hào)控制

// 注冊(cè)自定義信號(hào)
Worker::$onMasterReload = function () {
    // 收到 SIGUSR1 信號(hào)時(shí)重啟某個(gè)任務(wù)
    Timer::del($oldTimerId);
    $newTimerId = Timer::add(3, function () { /* ... */ });
};

7. 注意事項(xiàng)

持久化存儲(chǔ):定時(shí)器 ID 保存在內(nèi)存中,進(jìn)程重啟后會(huì)丟失,需外部存儲(chǔ)(如 Redis)記錄關(guān)鍵任務(wù)狀態(tài)。

原子操作:多進(jìn)程操作時(shí),使用鎖機(jī)制避免競(jìng)爭(zhēng)條件。

異常處理:

Timer::add(1, function () {
    try {
        // 業(yè)務(wù)邏輯
    } catch (Throwable $e) {
        echo "定時(shí)任務(wù)異常: " . $e->getMessage();
    }
});

總結(jié)

操作方法場(chǎng)景
啟動(dòng)Timer::add()Worker 啟動(dòng)時(shí)自動(dòng)注冊(cè)
停止Timer::del() 或 Timer::delAll()動(dòng)態(tài)終止指定或全部任務(wù)
重啟先 del() 再 add()修改間隔時(shí)間或任務(wù)邏輯
全局控制命令行 start/stop/reload管理整個(gè) Worker 進(jìn)程生命周期

到此這篇關(guān)于php調(diào)用Workerman管理定時(shí)任務(wù)詳解的文章就介紹到這了,更多相關(guān)php Workerman定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

永济市| 盐城市| 汉沽区| 南华县| 喜德县| 宝鸡市| 县级市| 普兰县| 堆龙德庆县| 应用必备| 沙田区| 石首市| 搜索| 灵宝市| 泰宁县| 韩城市| 彭州市| 长治市| 招远市| 嘉祥县| 镇赉县| 巨野县| 北安市| 基隆市| 长宁区| 兴隆县| 兴安盟| 拉萨市| 湛江市| 亳州市| 桃江县| 镶黄旗| 姜堰市| 文登市| 扎赉特旗| 安顺市| 黄冈市| 福建省| 阿勒泰市| 元氏县| 额敏县|