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 Scheduler | Web 应用、结合 Cron 使用 | 需要配合 Cron 触发、功能丰富 |
通过合理使用 Workerman 的定时任务,可以高效处理后台逻辑,尤其适合需要长连接或高实时性的场景。对于复杂调度需求,建议结合外部工具(如 Redis 或数据库)实现分布式任务管理。