PHP项目Laravel任务调度Cron写法

wen PHP项目 4

本文目录导读:

PHP项目Laravel任务调度Cron写法

  1. 基础 Cron 配置
  2. 详细配置示例
  3. 任务定义示例
  4. 常用调度频率
  5. 生产环境注意事项
  6. 查看和管理调度
  7. 日志和错误处理

在 Laravel 项目中配置任务调度(Task Scheduling)的 Cron 写法如下:

基础 Cron 配置

在服务器的 crontab 中添加:

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

或者更规范的写法:

* * * * * /usr/bin/php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

详细配置示例

基本配置

# 每分钟执行一次
* * * * * cd /var/www/html/laravel-project && php artisan schedule:run >> /dev/null 2>&1
# 使用绝对路径
* * * * * /usr/local/bin/php /var/www/html/laravel-project/artisan schedule:run >> /dev/null 2>&1
# 记录日志
* * * * * /usr/local/bin/php /var/www/html/laravel-project/artisan schedule:run >> /var/log/laravel-scheduler.log 2>&1

任务定义示例

app/Console/Kernel.php 中定义任务:

protected function schedule(Schedule $schedule)
{
    // 每分钟执行
    $schedule->command('command:name')->everyMinute();
    // 每小时执行
    $schedule->command('emails:send')
        ->hourly()
        ->between('6:00', '18:00');
    // 每天凌晨执行
    $schedule->command('report:generate')->dailyAt('00:30');
    // 每周一早上执行
    $schedule->command('tasks:weekly')
        ->weekly()
        ->mondays()
        ->at('08:00');
    // 使用回调函数
    $schedule->call(function () {
        // 执行任务
    })->everyFifteenMinutes();
}

常用调度频率

// 频率方法
$schedule->command('task:name')
    ->everyMinute();          // 每分钟
    ->everyFiveMinutes();     // 每5分钟
    ->everyTenMinutes();      // 每10分钟
    ->everyFifteenMinutes();  // 每15分钟
    ->everyThirtyMinutes();   // 每30分钟
    ->hourly();               // 每小时
    ->daily();                // 每天
    ->weekly();               // 每周
    ->monthly();              // 每月
    ->yearly();               // 每年
// 特定时间
    ->dailyAt('13:00');       // 每天13:00
    ->hourlyAt(17);           // 每小时的第17分钟
    ->weeklyOn(1, '8:00');    // 每周一8:00
    ->monthlyOn(15, '10:00'); // 每月15日10:00

生产环境注意事项

单服务器配置

# 使用环境变量
* * * * * cd /path/to/project && php artisan schedule:run >> /dev/null 2>&1
# 避免输出
* * * * * cd /path/to/project && php artisan schedule:run >/dev/null 2>&1 &

多服务器配置(防止重复执行)

// Kernel.php
$schedule->command('report:generate')
    ->dailyAt('00:30')
    ->withoutOverlapping()  // 防止重复
    ->onOneServer();        // 只在主服务器运行

查看和管理调度

# 查看调度列表
php artisan schedule:list
# 测试执行
php artisan schedule:run
# 测试特定命令
php artisan schedule:test-command command:name

日志和错误处理

$schedule->command('check:something')
    ->everyFiveMinutes()
    ->before(function () {
        // 执行前
    })
    ->after(function () {
        // 执行后
    })
    ->onFailure(function () {
        // 失败时
        Log::error('Task failed');
    })
    ->onSuccess(function () {
        // 成功时
    });

Laravel 调度器每分钟运行一次,然后在 Kernel.php 中判断是否有需要执行的任务,这样可以让 cron 配置保持简单统一。

抱歉,评论功能暂时关闭!