php实现调度器
PHP 实现调度器的方法
使用 Cron 任务
在 Linux 系统中,可以通过配置 Cron 任务来定期执行 PHP 脚本。编辑 Cron 任务列表:
crontab -e
添加如下行,表示每分钟执行一次指定的 PHP 脚本:
* * * * * /usr/bin/php /path/to/your/script.php
使用 PHP 内置函数
通过 sleep() 和循环实现简单的调度功能。以下代码每 60 秒执行一次任务:
while (true) {
// 执行任务代码
echo "Task executed at " . date('Y-m-d H:i:s') . "\n";
sleep(60);
}
使用 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/console 和 symfony/process 可以创建更复杂的调度器。安装库:
composer require symfony/console symfony/process
示例代码:
use Symfony\Component\Console\Application;
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)
{
// 任务逻辑
$output->writeln('Task executed');
return Command::SUCCESS;
}
}
$application = new Application();
$application->add(new MyCommand());
$application->run();
使用消息队列
结合 Redis 或 RabbitMQ 实现任务调度。例如使用 php-amqplib:
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);
$msg = new AMQPMessage('Task data');
$channel->basic_publish($msg, '', 'task_queue');
$channel->close();
$connection->close();
使用数据库存储任务
创建任务表并轮询执行:
CREATE TABLE scheduled_tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
task_name VARCHAR(255),
execute_at DATETIME,
is_completed BOOLEAN DEFAULT FALSE
);
PHP 轮询代码:

$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$stmt = $pdo->query("SELECT * FROM scheduled_tasks WHERE execute_at <= NOW() AND is_completed = FALSE");
while ($task = $stmt->fetch()) {
// 执行任务
$pdo->exec("UPDATE scheduled_tasks SET is_completed = TRUE WHERE id = " . $task['id']);
}
以上方法可根据具体需求选择,从简单的 Cron 到复杂的队列系统均可实现 PHP 任务调度。






