开始使用Laravel Cron Jobs
在大多数情况下,在开发应用程序时,有一些任务我们可能需要定期执行。这些任务可能包括公司的新闻简报或促销邮件给注册用户。
手动实现这个任务可能会给公司带来资源上的损失。
简介
Laravel配备了一个非常强大的任务管理器,称为cron jobs。在本教程中, 我们将深入讨论Laravel的cron jobs, 我们的重点是cron job的创建和使用artisan命令调度任务.
目标
在本教程的最后, 你应该能够使用Laravel创建和安排任务.此外, 你应该能够创建Laravel artisan命令, 这在任务调度中起着至关重要的作用.
先决条件
- 对PHP和Laravel有基本了解.
- Linux操作系统
开始使用cron
在我们深入研究Laravel的cron作业之前, 我们必须了解什么是cron.Cron是一个基于UNIX/Linux操作系统的命令。它用于安排需要在特定时间执行的任务,或执行周期性的事件。
一个cron有3个主要部分。
- 执行的脚本。
- 用来执行脚本的命令。
- 输出。这取决于对执行脚本的操作。
Cron被配置在一个crontab中以管理任务调度过程。这个配置文件包含了每个指定任务的所有cron作业。
Laravel的cron作业
正如前面所讨论的, Laravel有一个内置的cron作业,它用来管理它的任务。有了这个调度器, 你可以管理你在服务器上的周期性任务.这个调度器提供了一个互动的环境,可以在你的Laravel应用程序中创建调度命令。
Laravel内置的调度器位于schedule() 方法中的app/Console/Kernel.php 。
创建新的Laravel项目
让我们开始创建一个新的Laravel项目,我们将用它来展示cron jobs的作用。
如果你已经下载了这个应用程序,请跳过这一步,否则请运行以下命令。
laravel new cron
cd cron
调度任务
Laravel中的任务是在app/Console/Kernel.php ,并在schedule() 方法中定义的。
让我们来看看一个例子:
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Illuminate\Support\Facades\DB;
class Kernel extends ConsoleKernel
{
protected $commands = [];
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
DB::table('inactive_users')->delete();
})->hourly();
}
}
在上面的例子中, 我们有一个任务,每小时执行一次,删除应用程序中不活跃的用户。在schedule() 方法中,我们有一个删除非活动用户的数据库查询。这被称为scheduling task using closures 。
你可以通过运行以下命令来查看你所有的计划任务。
php artisan schedule: list
输出。
+---------+----------+-------------+----------+
| Command | Interval | Description | Next Due |
+---------+----------+-------------+----------+
计划中的artisan命令
Laravel有多种实现cron作业的方法, 到目前为止我们已经看到如何使用closures 来调度这些任务.
另一种方法是使用artisan命令来管理一个应用程序中的任务.Laravel提供了一个交互式的命令行工具来创建命令,供我们使用。
让我们创建一个命令并使用它来安排任务。
在这里,我们将创建一个命令,通过运行以下命令来发送促销邮件。
php artisan make: command PromotionalEmails
输出。
Console command created successfully.
这将在app/Console/Commands 文件夹中创建PromotionalEmails.php 文件。
<?php
---------------------------------------------------
class PromotionalEmails extends Command
{
protected $signature = 'command:name';
protected $description = 'Command description';
public function __construct()
{
parent::__construct();
}
public function handle()
{
return 0;
}
}
接下来,让我们来讨论这个类中的每个方法和属性。
protected $signature = 'command:name';- 这个变量包含命令名称,我们用我们自己的命令名称替换,如下所示。
protected $signature = 'promotional:email';
protected $description = 'Command description';这指的是我们所创建的命令的描述。在这种情况下,我们有一个促销邮件,因此我们可以改变这个变量,如下图所示。
protected $description = 'Sending out promotional emails to application users';
public function handle()- 每当我们的命令被执行时,这个处理程序就会被调用。
现在,我们的最终代码应该如下所示。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class PromotionalEmails extends Command
{
protected $signature = 'promotional:email';
protected $description = 'Sending out promotional emails to application users';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$message = [
'message' => 'Hello, did you know that moving services to the Edge is complicated but Section makes it easy. ',
];
$key = array_rand($message);
$value = $message[$key];
$users = User::all();
foreach ($users as $user) {
Mail::raw("{$key} -> {$value}", function ($mail) use ($user) {
$mail->from('info@section.io');
$mail->to($user->email)
->subject('Section Edge');
});
}
$this->info('Moving Services to the Edge');
}
}
注册我们的命令
让我们在app/Console/Kernel.php 中注册我们的PromotionalEmails ,如下图所示。
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected $commands = [
Commands\PromotionalEmails::class,
];
protected function schedule(Schedule $schedule)
{
$schedule->command('promotional:email')->weekly();
}
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
现在,在命令行中运行php artisan list ,看看这个命令是否存在。
php artisan list
输出。
Laravel Framework 8.46.0
Usage:
--------------------------------
Options:
--------------------------------------------
Available commands:
-------------------------------------------------------------
promotional
promotional:email Sending out promotional emails to application users
-------------------------------------------------------------
结论
在本教程中, 我们已经讨论了Laravel cron jobs.我们看了两种不同的调度任务的方式, 使用闭包和Laravel artisan命令.
我们看了一个例子,调度一个cron job,每周向用户发送SectionEdge的服务。我们还讨论了如何在kernel.php 脚本中注册artisan命令.