18910140161

Laravel 5.6 中优雅地使用任务调度

顺晟科技

2021-06-16 10:32:38

333

以前我用Linux自带的crontab来完成预定任务的功能。最近在Larave的项目中遇到了与调度任务相关的功能,所以研究了Larave自带的任务调度,也是基于crontab的。

与直接用crontab运行脚本相比,降低了代码与外界的耦合度,使我们更容易完成框架内的定时任务。因此,本文记录了我在Laravel 5.6中是如何使用定时任务的。

Laravel 5.6任务调度文档

调度模式

要调度的任务在app/console/kernel.php中的schedule方法中完成,Laravel提供了四种完成调度任务的方法:

结束呼叫(结束)

指挥(工匠指挥)

作业(队列)

外壳(脚本)

定义时间表

在任务很少的情况下,可以通过closecall的方式直接完成,逻辑直接写在回调函数中,传递给调用方法。用法如下:

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

命名空间应用\控制台;

使用数据库;

使用照明\控制台\日程安排\日程安排;

使用照明\基础\控制台\内核作为控制台内核;

类内核扩展了ConsoleKernel

{

/**

*应用提供的Artisan命令

*

* @var数组

*/

受保护的$commands=[

//

];

/**

*定义命令调度的应用

*

* @参数\照明\控制台\调度\调度$调度

* @返回void

*/

受保护功能一览表(一览表$一览表)

{

$schedule-call(function () {

db : table(' recent _ users ')-delete();

})-daily();

}

}

工匠指挥调度

当任务较多时,建议使用Command。例如,我的项目有许多预定的任务,如定期发布视频和删除用户浏览记录,所以我使用命令来完成它们。

定义工匠命令

使用此方法时,首先需要定义Artisan命令

工匠命令使用文档

打开编辑器的控制台,或者Windows打开CMD命令行,输入项目的根目录,运行命令:

PHP artisan make : command PublishVideo

如上所述,我创建了一个名为publishVideo的命令。与该命令同名的PHP文件放在应用程序/控制台/命令目录中。该文件的内容如下:

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

命名空间应用程序\控制台\命令;

使用应用程序\服务\视频服务;

使用照明\控制台\命令;

类发布视频扩展命令

{

/**

*控制台命令的名称和签名。

*

* @var字符串

*/

受保护的$ signature=' video : publish ';

/**

*控制台命令描述。

*

* @var字符串

*/

受保护$description='定时发布视频';

/**

*创建新的命令实例。

*

* @返回void

*/

public function __construct()

{

parent : _ _ construct();

}

公共函数句柄()

{

video service : timegppublish();

}

}

您可以看到这个PublishVideo类有两个属性:$signature和$description,以及一个句柄方法。

顾名思义,$signature属性是命令的签名和标识。我把它定义为video:publish。您可以使用php artisan list来查看当前Laraval项目的所有命令标识。

$description是命令的描述,可以随意定义。

最后是句柄方法。我们可以把需要运行的逻辑代码放在这个方法里。如果有更多的逻辑,我们可以将逻辑放在服务类中。在这个方法中,我们可以看到我调用了VideoService的timingPublish方法。

调度Artisan命令

创建Artisan命令后,Artisan命令可以以与闭包调用相同的方式进行调度。在app/Console/Kernel.php中的调度方法中:

受保护功能一览表(一览表$一览表)

{

$ schedule-command(' video : publish ')-WitOverlapping();

$ schedule-command(' video : updatesrc ')-withoutOverlapping();

$ schedule-command(' video : storeviews ')-daily();

$ schedule-command(' user : destroybrows ')-dailyAt(' 04:00 ');

}

如上,我已经调度了4个Artisan命令,执行频率是:每分钟,每分钟,每天早上00:00,每天早上04:00。

调度频率设置

除了我的示例中的设置,Laravel还提供了以下频率设置:

方法描述

-cron(' * * * * * ');根据定制的Cron计划执行此任务

-every minute();每分钟执行一项任务

-every five MINUTES();每五分钟执行一项任务

-EveryteMinutes();每十分钟执行一项任务

-每十五分钟();每十五分钟执行一项任务

-everyThirtyMinutes();每半小时执行一项任务

-hour();每小时执行任务

-hourlyAt(17);每小时每17分钟执行一项任务

-daily();每天午夜执行一项任务

-DaiLyat(' 13:00 ');每天13:00小时执行一项任务

-twisedayly(1,13);每天分别在1:00和1:00执行一次任务

-weekly();每周执行一次任务

-monthly();每月执行一次任务

-monthlyOn(4,' 15:00 ');每月第四天15:00执行任务

-quarterly();每季度执行一次任务

-yearly();每年执行一次任务

-时区('美洲/纽约');设置时区

更多频率设置请参考官方文件。

开始计划

进入shell,运行crontab -e命令,按I键进入编辑模式,添加如下配置:

* * * */usr/local/PHP/bin/PHP/home/API/admin/artisan schedule : run/dev/null 21

其中/usr/local/php/bin/php是php命令所在的目录,/home/api/admin是Laravel项目的根目录

添加完毕后按ESC,退出编辑模式,进入wq并按enter,保存crontab任务,Laravel的任务调度开始。

数据库定时备份功能

对于每个项目来说,定期备份数据库中的数据是非常必要的,可以有效避免删除数据库和逃跑的操作。

2 fdda 3 cc 7 CD 98d 10 FB 604 a 2 F2 C3 FB 80 e 7 bec 907 c . gif

我仍然使用调度命令的方法来完成这个功能,首先在项目的根目录下运行命令:

PHP artisan make : command backup database

该命令创建一个同名的PHP文件,放在应用程序/控制台/命令目录中

BackupDatabase.php的内容如下:

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

命名空间应用程序\控制台\命令;

使用照明\控制台\命令;

使用符号\组件\进程\进程;

使用符号\组件\进程\异常\进程失败异常;

类备份数据库扩展命令

{

受保护的$ signature=' db:backup

受保护的$description=“备份数据库”;

受保护的$ process

public function __construct()

{

parent : _ _ construct();

$ this-Process=new Process(sprintf(

mysqldump -u%s -p%s %s %s ',

config(' database . connections . MySQL . username '),

config(' database . connections . MySQL . password '),

config(' database . connections . MySQL . database '),

storage _ path(' backups/backup . SQL ')

));

}

公共函数句柄()

{

尝试{

$ this-process-MustRun();

$this-info('备份已成功进行。');

} catch(processfailed exception $ exception){

$ this-错误('备份过程失败。');

}

}

}

在上面的构造函数中,我使用了Symfony框架的Process组件,这是一个非常强大的组件,功能类似于shell_exec函数,可以执行shell命令。

流程组件使用的文档

我使用进程组件来执行mysqldump命令。mysqldump命令的使用格式如下:

MySQL dump[选项] [db_name [tbl_name.]]

BackupDatabase.php运行后,它将备份backup/backup . SQL中的数据,并在任务出错时记录错误。

最后一步,像前面一样,在app/Console/Kernel.php中的schedule方法中调度db:backup命令:

受保护功能一览表(一览表$一览表)

{

$ schedule-command(' db : backup ')-DaiLyat(' 0:30 ');

}

因为每天早上0:30用户活动最少,所以我们选择备份当时的数据。

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航