关于laravel5.5的定时任务详解(demo)


Posted in PHP onOctober 23, 2019

一、准备环境

服务器:linux(debian)+nginx+mysql+php 环境

框架:laravel 5.5 (确认能跑通)

需求:每天晚上1点执行定时操作

二、定时任务的步骤

1、根据文档,创建命令

首先进入到laravel/app/console 目录下,Console 目录包含应用所有自定义的 Artisan 命令,这些命令类可以使用 make:command 命令生成。该目录下还有 Console/Kernel 类,在这里可以注册自定义的 Artisan 命令以及定义调度任务。

例如我们创建一个定时任务,名称为Test:

//这里使用laravel给定的 php artisan来生成命令,此处的Test就是我们要生成的文件
//这里的artisan代表的不仅仅是laravel自带的命令,他其实是laravel下的artisan目录,因为这个目录没有x,也就是可执行权限,所以不能使用 ./artisan 来执行,只能通过php来执行
php artisan make:command Test

2、创建完之后,打开console目录下的commands目录,我们会发现里面已经有了一个文件

大致的代码如下:

<?php

namespace App\Console\Commands;

use App\Services\CalculateDataService;
use Illuminate\Console\Command;

class Test extends Command
{
 //此处代表laravel自动生成的名称,下面执行的时候能用到
 protected $signature = 'test:data';

 //此处代表的是描述,并没有什么用的
 protected $description = 'test data';

 /**
 * 计算数据服务的 service 属性
 *这里由于要用到我们的逻辑,所以提前定义一下,方便下面使用
 * @var CalculateDataService
 */
 protected $service;

 //这个是laravel自带的构造方法。初始状态下是空的。
 //我这里由于要调用CalculateDataService 类的一个方法,所有就用依赖注入的方式引入了一下。
 public function __construct(CalculateDataService $service)
 {
 parent::__construct();

 $this->service = $service;
 }

 /**
 * Execute the console command.
 *这里就是我们执行操作的地方,里面是command要处理的业务。根据我们的需求,
 *调用类中的calculateData()方法,该方法是我们自己的需求逻辑部分。
 * @return mixed
 */
 public function handle()
 {
 try {
  $this->service->calculateData();
 } catch (\Exception $e) {
  $this->error($e->getMessage());
 }
 // line()方法是command类中自带的方法,可以输出我们自定义的信息
 $this->line('calculate Data Success!');
 }
}

3、定时命令创建好之后,我们需要修改kernel.php文件

kernel.php文件里面,主要是定义命令的调度时间,定义命令的执行先后顺序等。

这部分参考laravel官方文档:

http://laravelacademy.org/post/8484.html

4、我的kernel.php文件

<?php
//此处省略了命名空间部分
class Kernel extends ConsoleKernel
{
 /**
 * The Artisan commands provided by your application.
 *注:此处是引入我们新创建的类。由于我们此处是使用命令名来操作的,所以没用上这个类名。不过还是引入比较标准
 * 可以使用 command 方法通过命令名或类来调度一个 Artisan 命令:
 * $schedule->command('emails:send --force')->daily();
 * $schedule->command(EmailsCommand::class, ['--force'])->daily();
 *
 * @var array
 */
 protected $commands = [
 Test::class,
 CalculateData::class,
 UpdateOffset::class,
 ];

 /**
 * Define the application's command schedule.
 * 注:
 * 1、这个方法按照自己的需求,确定定时方法的执行顺序。通过after,before等关键词来控制
 * 2、此处相当于规定同意的定时执行时间,如都在0:30分执行下面的几个定时任务
 * @param \Illuminate\Console\Scheduling\Schedule $schedule
 * @return void
 */
 protected function schedule(Schedule $schedule)
 {
 // 每天凌晨 0.45 执行同步 aliyun 数据的任务,并发送邮件给 ***
  $schedule->command('iot:sync Flow')
  ->after(function() {
   //更新偏移量,after里面不能加参数
  Artisan::call('Test:data');
  })
  ->after(function () {
  // 执行同步数据命令完成后 则执行计算数据任务
  Artisan::call('calculate:data');
  });
 }

 /**
 * Register the commands for the application.
 * //这个部分是laravel自动生成的,引入我们生成的命令文件
 * @return void
 */
 protected function commands()
 {
 $this->load(__DIR__.'/Commands');

 require base_path('routes/console.php');
 }
}

关于具体的调度方法schedule(),大家可以去laravel文档看看,里面可以规定很多东西。我这边是使用的钩子函数。在同时要执行多个定时任务的时候,通过after,before等方法,可以让多个定时任务变得有序起来。

三、执行我们的定时

虽然laravel的定时任务一直都说的很强大,但本质上还是离不开服务器上的cron脚本。。

1、先查看服务器上的定时条目

crontab -l

2、新增或编辑cron 条目

crontab -e

3、在里面新增我们写好的方法路径

关于laravel5.5的定时任务详解(demo)

这里面新加上我们的定时任务。

第一是 规定定时任务的执行时间

第二是 要把项目的artisan目录路径写对

第三 schedule:run就是执行咱们之前写的任务调度,也就是kernel.php文件中的schedule方法。

如果是大家自己测试的话,可以随便写个定时任务,每分钟执行以下,这样就能准确的知道自己的定时任务是否正确了。

以上这篇关于laravel5.5的定时任务详解(demo)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
多数据表共用一个页的新闻发布
Oct 09 PHP
php不用内置函数对数组排序的两个算法代码
Feb 08 PHP
PHP删除特定数组内容并且重建数组索引的方法.
Mar 25 PHP
基于php-fpm 参数的深入理解
Jun 03 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
php中常见的sql攻击正则表达式汇总
Nov 06 PHP
php目录遍历函数opendir用法实例
Nov 20 PHP
php实现字符串翻转的方法
Mar 27 PHP
CodeIgniter钩子用法实例详解
Jan 20 PHP
php+mysql+jquery实现日历签到功能
Feb 27 PHP
统计PHP目录中的文件数方法
Mar 05 PHP
php7性能提升的原因详解
Oct 13 PHP
laravel 出现command not found问题的解决方案
Oct 23 #PHP
关于laravel框架中的常用目录路径函数
Oct 23 #PHP
laravel 实现根据字段不同值做不同查询
Oct 23 #PHP
Laravel修改验证提示信息为中文的示例
Oct 23 #PHP
php装饰者模式简单应用案例分析
Oct 23 #PHP
laravel 数据验证规则详解
Oct 23 #PHP
php适配器模式简单应用示例
Oct 23 #PHP
You might like
php下保存远程图片到本地的办法
2010/08/08 PHP
php下批量挂马和批量清马代码
2011/02/27 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
HTML上传控件取消选择
2013/03/06 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
js 本地预览的简单实现方法
2014/02/18 Javascript
alert出数组中的随即值代码
2014/09/25 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
vue用BMap百度地图实现即时搜索功能
2019/09/26 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
Python中列表和元组的使用方法和区别详解
2020/12/30 Python
python实现简单爬虫功能的示例
2016/10/24 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
技校生自我鉴定
2013/12/08 职场文书
学校安全管理责任书
2014/07/23 职场文书
观看《信仰》心得体会
2016/01/15 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
python和anaconda的区别
2022/05/06 Python