亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

php調用Workerman管理定時任務詳解

 更新時間:2025年04月24日 10:47:01   作者:半桶水專家  
Workerman?是一個高性能的?PHP?Socket?框架,常用于開發(fā)實時通信、長連接服務等場景,本文主要來和大家聊聊如何使用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 輸出他們的全部組合)

    淺談PHP的排列組合(如輸入a,b,c 輸出他們的全部組合)

    下面小編就為大家?guī)硪黄獪\談PHP的排列組合(如輸入a,b,c 輸出他們的全部組合)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • php設置編碼格式的方法

    php設置編碼格式的方法

    最近需要用到iconv函數(shù)把抓取來過的utf-8編碼的頁面轉成gb2312, 發(fā)現(xiàn)只有用iconv函數(shù)把抓取過來的數(shù)據(jù)一轉碼數(shù)據(jù)就會無緣無故的少一些。
    2013-03-03
  • php $_SESSION會員登錄實例分享

    php $_SESSION會員登錄實例分享

    這篇文章主要為大家詳細介紹了php $_SESSION會員登錄實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 學習php開源項目的源碼指南

    學習php開源項目的源碼指南

    這篇文章主要介紹了學習php開源項目的源碼指南,需要的朋友可以參考下
    2014-12-12
  • PHP實現(xiàn)多維數(shù)組多字段自定義排序

    PHP實現(xiàn)多維數(shù)組多字段自定義排序

    這篇文章主要介紹了PHP實現(xiàn)多維數(shù)組多字段自定義排序,通過將待排序數(shù)組的各個數(shù)組的$field保存在一維數(shù)組fieldArr中,在傳入array_multisort中參與排序,相當于對$field一維數(shù)組的排序,而后根據(jù)排序后的key重新構建傳入的待排序數(shù)組,需要的朋友可以參考下
    2023-10-10
  • php使用PDO操作MySQL數(shù)據(jù)庫實例

    php使用PDO操作MySQL數(shù)據(jù)庫實例

    這篇文章主要介紹了php使用PDO操作MySQL數(shù)據(jù)庫,實例分析了PDO的開啟與針對MySQL數(shù)據(jù)庫的增刪改查等基本操作方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • 詳解PHP Swoole與TCP三次握手

    詳解PHP Swoole與TCP三次握手

    TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接(連接導向)的、可靠的、 基于IP的傳輸層協(xié)議。TCP在IP報文的協(xié)議號是6。TCP是一個超級麻煩的協(xié)議,而它又是互聯(lián)網(wǎng)的基礎,也是每個程序員必備的基本功。本文將詳細介紹PHP Swoole與TCP三次握手。
    2021-05-05
  • PHP面向對象五大原則之單一職責原則(SRP)詳解

    PHP面向對象五大原則之單一職責原則(SRP)詳解

    這篇文章主要介紹了PHP面向對象五大原則之單一職責原則(SRP),結合實例形式詳細分析了單一職責原則(SRP)的概念、原理、定于與使用方法,需要的朋友可以參考下
    2018-04-04
  • 微信自定義菜單的創(chuàng)建/查詢/取消php示例代碼

    微信自定義菜單的創(chuàng)建/查詢/取消php示例代碼

    這篇文章主要為大家詳細介紹了微信自定義菜單的創(chuàng)建/查詢/取消php示例代碼,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評論