一、任务调度简介
在过去,您可能为服务器上需要调度的每个任务编写了 cron 配置项。然而,这很快就会变成痛苦,因为您的任务调度不再在源代码控制中,您必须 SSH 登录到您的服务器查看现有的 cron 项或添加额外的项。 Laravel 的命令调度器提供了一种全新的方法来管理服务器上的定时任务。调度器允许您在 Laravel 应用程序本身中流畅且有表达力地定义命令调度。使用调度器时,您的服务器上只需要一个单一的 cron 条目。您的任务调度通常在应用程序的 routes/console.php 文件中定义。
二、任务调度定义方法一
您可以在应用程序的 routes/console.php 文件中定义所有的调度任务。让我们从一个示例开始,我们将安排一个闭包在每天午夜被调用。在闭包中,我们将执行一个数据库查询来清空一个表:
<?php
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schedule;
Schedule::call(function () {
DB::table('recent_users')->delete();
})->daily();
二、任务调度定义方法二
1、除了使用闭包调度,您还可以调度 可调用对象。可调用对象是包含 __invoke 方法的简单 PHP 类:
在项目下的app\Http\Schedule新建一个DeleteRecentUsers.php,编写如下代码
<?php
namespace App\Http\Schedule;
use Illuminate\Support\Facades\DB;
class DeleteRecentUsers
{
public function __invoke()
{
DB::table('recent_users')->delete();
}
}
?>
2、引入类文件:在项目根目录下的composer.json加入 “app/Http/Schedule”,代码
"autoload": {
"classmap": [
"app/Http/Schedule"
],
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
3、执行加载:执行composer dumpautoload 执行加载,使其生效
composer dumpautoload
4、调用:在routes/console.php调用
<?php
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Schedule;
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote')->hourly();
Schedule::call(new \App\Http\Schedule\DeleteRecentUsers)->everySecond();
5、执行任务调度
php artisan schedule:run
6、定时执行:服务器上设置定时执行,加入到crontab
crontab -e
添加如下执行每一分钟执行一次脚本
* * * * * cd /data/wwwroot/www.example.com && /usr/local/php8.2/bin/php artisan schedule:run >> /dev/null 2>&1 >> /home/wwwlogs/schedule.log