如何使用Laravel的Cron作业

353 阅读3分钟

开始使用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个主要部分。

  1. 执行的脚本。
  2. 用来执行脚本的命令。
  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命令.