看过我之前写过的博客的应该知道我一直是 laravel-mix 的死忠粉,有好几篇文章都是关于它的。每每提到 laravel-mix 时更是不吝溢美之词。然而就在大概一个月前,我却决定不再使用它,而转
顺晟科技
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用户活动最少,所以我们选择备份当时的数据。
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06