关于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 相关文章推荐
删除数组元素实用的PHP数组函数
Aug 18 PHP
PHP 类型转换函数intval
Jun 20 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 PHP
php中HTTP_REFERER函数用法实例
Nov 21 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
解决nginx不支持thinkphp中pathinfo的问题
Jul 21 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
Jun 13 PHP
Yii安装与使用Excel扩展的方法
Jul 13 PHP
对php 判断http还是https,以及获得当前url的方法详解
Jan 15 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
php设计模式之观察者模式定义与用法经典示例
Sep 19 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
PHP文章按日期(月日)SQL归档语句
2012/11/29 PHP
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
python在linux中输出带颜色的文字的方法
2014/06/19 Python
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
python中二分查找法的实现方法
2020/12/06 Python
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
假日旅行社实习自我鉴定
2013/09/24 职场文书
会计电算化大学生职业规划书
2014/02/05 职场文书
2014年党总支工作总结
2014/12/18 职场文书
2015年暑期见闻
2015/07/14 职场文书
商务信函英语问候语
2015/11/10 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
详解非极大值抑制算法之Python实现
2021/06/28 Python
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript