php 框架Workerman定时任务详解《一》

Workerman 是一个高性能的 PHP Socket 框架,常用于开发实时通信、长连接服务等场景。其定时任务功能基于内置的 Timer 类实现,能够方便地处理周期性或延迟任务。以下是详细解析:


1. Workerman 定时任务基础

Workerman 的定时任务依赖于 Workerman\Timer 类,支持两种模式:

  • 间隔执行:每隔指定时间执行一次。

  • 延迟执行:延迟指定时间后执行一次。

基本示例
use Workerman\Worker;
use Workerman\Timer;

require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();

$worker->onWorkerStart = function ($worker) {
    // 间隔 1 秒执行
    Timer::add(1, function () {
        echo "每秒执行的任务\n";
    });

    // 延迟 5 秒执行(仅一次)
    Timer::add(5, function () {
        echo "延迟 5 秒执行的任务\n";
    }, [], false);
};

Worker::runAll();

2. 定时任务配置

参数说明
  • Timer::add(float $interval, callable $callback, array $args = [], bool $persistent = true)

    • $interval: 时间间隔(秒),支持小数(如 0.1 表示 100 毫秒)。

    • $callback: 回调函数或闭包。

    • $args: 传递给回调函数的参数数组。

    • $persistent: 是否持久化(true 为间隔执行,false 为单次执行)。

停止定时器
$timerId = Timer::add(2, function () { /* ... */ });
// 停止指定定时器
Timer::del($timerId);

3. 高级用法

多进程任务控制

默认情况下,每个 Worker 进程都会创建自己的定时器。若需单例任务(仅一个进程执行),需结合进程 ID 判断:

$worker->onWorkerStart = function ($worker) {
    if ($worker->id === 0) { // 仅第一个 Worker 进程执行
        Timer::add(1, function () { /* ... */ });
    }
};
Cron 表达式支持

Workerman 本身不支持 Cron,但可结合第三方库(如 mtdowling/cron-expression)实现复杂调度:

use Cron\CronExpression;

$cron = CronExpression::factory('* * * * *');
Timer::add(60, function () use ($cron) {
    if ($cron->isDue()) {
        echo "每分钟执行的任务\n";
    }
});

4. 注意事项

内存管理
  • 长时间运行的定时任务需注意内存泄漏,避免在闭包中累积变量。

  • 定期手动调用 gc_collect_cycles() 触发垃圾回收。

异常处理
  • 定时任务中的异常需自行捕获,否则可能导致 Worker 进程崩溃:

Timer::add(1, function () {
    try {
        // 业务逻辑
    } catch (Exception $e) {
        echo "Error: " . $e->getMessage();
    }
});

5. 实际应用场景

数据同步
Timer::add(300, function () { // 每 5 分钟同步数据
    $data = fetchExternalData();
    saveToDatabase($data);
});
日志清理
Timer::add(86400, function () { // 每天清理日志
    $files = glob('/logs/*.log');
    foreach ($files as $file) {
        if (filemtime($file) < time() - 30 * 86400) {
            unlink($file);
        }
    }
});

6. 性能优化

  • 避免阻塞:耗时任务应异步处理(如投递到队列)。

  • 时间精度:高精度定时(如 <1 秒)需考虑系统负载。

  • 分布式扩展:多机部署时,使用 Redis 锁确保任务唯一性。


7. 对比其他方案

方案适用场景特点
Workerman Timer单机高频任务、简单调度轻量级、低延迟
Crontab系统级定时任务依赖系统环境、分钟级精度
Swoole Timer高性能应用、复杂调度支持毫秒级精度、更丰富的 API
Laravel SchedulerWeb 应用、结合 Cron 使用需要配合 Cron 触发、功能丰富

通过合理使用 Workerman 的定时任务,可以高效处理后台逻辑,尤其适合需要长连接或高实时性的场景。对于复杂调度需求,建议结合外部工具(如 Redis 或数据库)实现分布式任务管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值