php实现调度器
PHP 实现调度器的方法
使用 Cron 任务
在 Linux 系统中,可以通过 Cron 任务定时执行 PHP 脚本。编辑 Cron 任务列表:
crontab -e
添加以下行,表示每分钟执行一次 script.php:
* * * * * /usr/bin/php /path/to/script.php
使用 Laravel 的任务调度
Laravel 提供了内置的任务调度功能。在 app/Console/Kernel.php 中定义调度任务:
protected function schedule(Schedule $schedule) {
$schedule->call(function () {
// 执行任务逻辑
})->everyMinute();
}
通过 Cron 任务触发 Laravel 调度器:
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
使用 Symfony 的组件
Symfony 的 Console 和 Process 组件可以用于构建调度器。安装组件:
composer require symfony/console symfony/process
创建自定义命令并配置调度逻辑:
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class MyCommand extends Command {
protected function execute(InputInterface $input, OutputInterface $output) {
// 任务逻辑
return Command::SUCCESS;
}
}
使用第三方库
库如 cron-expression 可以解析和计算 Cron 表达式。安装库:
composer require dragonmantank/cron-expression
使用示例:
use Cron\CronExpression;
$cron = new CronExpression('* * * * *');
if ($cron->isDue()) {
// 执行任务
}
自定义循环调度
在 PHP 脚本中使用无限循环实现简单调度:
while (true) {
// 执行任务逻辑
sleep(60); // 每分钟执行一次
}
使用消息队列
结合 Redis 或 RabbitMQ 实现任务调度。安装 Predis:
composer require predis/predis
示例代码:
$client = new Predis\Client();
while (true) {
$task = $client->brpop('task_queue', 0);
// 处理任务
}
使用数据库存储任务
在数据库中存储任务和执行时间,通过脚本定期检查并执行到期任务:
$tasks = $pdo->query("SELECT * FROM tasks WHERE next_run <= NOW()");
foreach ($tasks as $task) {
// 执行任务
$pdo->exec("UPDATE tasks SET next_run = NOW() + INTERVAL {$task['interval']} SECOND WHERE id = {$task['id']}");
}
注意事项
- 长时间运行的脚本需处理内存泄漏问题,定期重启或使用
gc_collect_cycles()。 - 对于关键任务,建议记录日志并实现监控机制。
- 在多服务器环境中,需避免任务重复执行,可通过数据库锁或分布式锁实现。







