thinkphp5.0定时任务_小冥羽的博客-程序员宝宝_thinkphp5.0 定时任务

技术标签: at命令  thinkphp5  php  thinkphp  定时任务  

php定时任务

系统环境要求

  • linux环境
  • 装有at命令
  • thinkphp5.0框架

开发人员必须会的

  1. 必须知道使用linux命令
  2. 必须了解at命令
  3. 必须知道thinkphp5.0框架的命令行开发
  4. 可以自己搭建php环境

在ThinkPHP5.0框架中の根目录下存在如下文件

  1. think.php
  2. composer.json
  3. composer.lock

其中think.php就是我们需要使用到的文件。


具体实现

执行任务代码实现

1、打开终端
2、使用cd命令进入到项目根目录
3、进入到项目根目录后,输入命令行:

$ php think make:controller command/Task

4、然后可以看到application文件夹中多出了command文件夹,进入后可以看到Task.php文件

<?php
namespace app\Command;

use think\Controller;

class Task extends Controller
{
    
    //
}

5、接下来我们需要更改这个文件内容变为如下:

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\Output;

class Task extends Command
{
    
    protected function configure()
    {
    
        $this->addArgument('test1',Argument::REQUIRED);  #必须参数
        $this->addArgument('test2',Argument::OPTIONAL);  #可选参数
        $this->setName('test')->setDescription('Command Test');
    }

    protected function execute(Input $input, Output $output)
    {
    
        $test1 = $input->getArgument('test1');
        $test2 = $input->getArgument('test2');
        #逻辑代码
        //todo 

        #输出代码
        $output->writeln("TestCommand:test1=".json_encode($test1));
        $output->writeln("TestCommand:test2=".json_encode($test2));
    }
}

6、回到application目录,找到command.php文件,增加新加入的类(包含命名空间)

return [
    'app\command\Task',
];

7、保存后,重新回到终端,输入:

$ php think list
Think Console version 0.1

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -V, --version         Display this console version
  -q, --quiet           Do not output any message
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  build              Build Application Dirs
  clear              Clear runtime file
  help               Displays help for a command
  list               Lists commands
  test               Command Test
  unit               phpunit
 make
  make:controller    Create a new resource controller class
  make:model         Create a new model class
 optimize
  optimize:autoload  Optimizes PSR0 and PSR4 packages to be loaded with classmaps too, good for production.
  optimize:config    Build config and common file cache.
  optimize:route     Build route cache.
  optimize:schema    Build database schema cache.

8、可以看到Available commands:中有一个test命令,尝试键入

$ php think test

  [RuntimeException]        #运行时异常
  Not enough arguments.     #缺少参数

9、提示异常信息!

$ php think test aaa bbb
TestCommand:test1="aaa"
TestCommand:test2="bbb"

10、运行结果与预期结果一致。至此,执行任务的代码完成。


写定时任务代码实现

在application中创建工具类TimedTask

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/12/8 0008
 * Time: 上午 10:51
 * Administrator
 */

namespace app\util;

/**
 * Class TimedTask
 * @package app\util
 */
class TimedTask
{
    
    /**
     * 执行定时任务
     *
     * @param $command string think框架的command命令  例如:test
     * @param $time string 执行时间
     * 例如:①1-i表示一分钟后执行   ②11am-time  上午11点
     * 如传入具体时间 请使用格式 $time.'-time'
     * 如果是多少单位后执行 请使用  $num .'-*' 注:*代表 date方法中除秒之外的各时间格式  比如Y代表年
     * @param $argv string 执行参数  多个参数用空格隔离
     * @return string|array 执行结果
     */
    public static function timingExecution ($command,$time,$argv){
    
        list($num,$format) = explode('-',$time);
        switch ($format){
            case 'd':$execTime = 'now +'.$num.' days';break;
            case 'm':$execTime = 'now +'.$num.' months';break;
            case 'Y':$execTime = 'now +'.$num.' years';break;
            case 'H':$execTime = 'now +'.$num.' hours';break;
            case 'i':$execTime = 'now +'.$num.' minutes';break;
            case 'time':$execTime = $num;
        }
        if (strtoupper(substr(PHP_OS,0,3))==='WIN'){
            #todo windows下的定时任务改如何执行。
        }else {
            #其他系统
            $result = system("echo 'php think " . $command.time() . " " . $argv . "'|" . 'at ' . $execTime . '');
        }
        return $result;
    }
}

参考at命令可以知道

>at 时间
>任务命令
>ctrl+d <EOF>

而at的时间是两种形式

1. now+1 days    #相对时间
2. 08:00pm       #绝对时间

所以上面代码中的switch用来处理相对时间。
此代码并不支持绝对时间加相对时间的处理,有待优化。比如:

$ at 08:00am + 1 days   #表示1天后早上八点

欢迎大家讨论。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a446438443/article/details/78752482

智能推荐

Java程序中使用Kafka和ElasticSearch_蜀山小师叔的博客-程序员宝宝

xml配置文件&lt;bean id="kafkaProducerProperites" class="java.util.HashMap"&gt; &lt;constructor-arg&gt; &lt;map&gt; &lt;entry key="bootstrap.servers" value="${kafk...

SQL索引建立原则和使用_zzhongcy的博客-程序员宝宝_sql建立索引原则

之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,发现遗漏了些东西,这里自己整理一下这方面的内容。1 前言SQL索引有两种,聚集索引和非聚集索引聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续字典的拼音查询法就是聚集索引,字典的部首查询就是一个非聚集索引.聚集索引和非聚集索引的根本区别是表记录的...

智慧门禁管理系统为小区的安全提供了一份保证_waiwulianwang的博客-程序员宝宝

随着经济的蓬勃发展,人们的生活水平不断提高,对于城市中存在的管理安全问题仍待解决,小区居民对于安防的社区环境的要求也越来越高,因此,引进或升级智慧门禁管理系统已经成为社区安防配套的一个必备的系统。智慧门禁管理系统,实现一人一卡(或人脸识别)为基础的安全识别机制,通过物业管理统一配套,对于卡片的安全数据采用加密型,并联动监控系统,进入小区进行刷卡抓拍,每刷一次卡,系统会自动显示刷卡人的姓名、楼...

Linux下使用Iptraf进行网络流量的分析_weixin_34399060的博客-程序员宝宝

Linux下使用Iptraf进行网络流量的分析Posted on2011/06/15下面的教程我个人安装的时候,总是失败,在/usr/local/bin目录里没有iptraf这个文件,没有办法直接用yum -y install iptraf命令安装成功了.Iptraf是一款Linux环境下,监控网络流量的一款绝佳的免费小...

C++里面的传值传址传引用调用问题_五香花生米的博客-程序员宝宝_c++数组赋值 传值 传址

C++里面的传值传址传引用调用问题// C_TEST.cpp : Defines the entry point for the console application.////#include "stdafx.h"#include "iostream"using namespace std;//我是在VS2008里面作的调试,这里需要导入命名空间STDvo

platform_driver->suspend 和platform_driver-pm->suspend的区别分析_白鲸入海的博客-程序员宝宝_driver pm

最近在看Linux电源管理模块,发现在platform_driver下有suspend/resume函数,在platform_driver->pm-下也有suspend/resume函数。下面分析一下他们的区别。先看两段代码。static struct platform_driver atc260x_irkeypad_driver = { .driver = { .name =

随便推点

再次更新!ultraedit v29.0.0.102 简体中文版_ABC__INTI的博客-程序员宝宝

ultraedit是一个功能强大的基于磁盘的文本编辑器,程序员的编辑器和十六进制编辑器,可用于编辑HTML,PHP,JavaScript,Perl,C / C ++,Python和几乎 任何其他编码/编程语言。解.......

01-NodeJS获取MAC地址_chengjia5999的博客-程序员宝宝

一. 关于getmac node.js没有直接获取mac网卡地址的模块,此时我们需要借助于第三方模块getmac。getmac 可以帮助我们 获取当前机器上的mac地址。gatmac 下载地址为:https://github.com/bevry/getmac我们也可以使用命令:npm i...

hadoop自定义分区函数_do_what_you_can_do的博客-程序员宝宝

首先我们明确一下关于中这个分区到底是怎么样,有什么用处?回答这个问题先看看上次代码执行的结果,我们知道结果中有个文件(part-r-00000),这个文件就是所有的词的数量记录,这个时候有没什么想法比如如果我想把一些包含特殊的词放置单独的一个文件,其他我不关心的放置在另一个文件这样我就好查看方便多了,又比如如果是统计关于人的某些爱好那我是不是可以把童年的放置在一个文件,成年的放置在一个文件等等这样

关于 Juju 的十二个热点问题_学要无止尽的博客-程序员宝宝

什么是 Juju? Juju 是 Canonical 公司提供的服务编排工具。它是Ubuntu云套件的一部分,与Ubuntu 服务器、OpenStack、用于裸机配置的MAAS 、以及 用于系统管理和监控的Landscape 一起组成 Ubuntu 云套件。 什么是服务编排? 这个名词有几种不同的定义,但我们认为服务编排是要具备这些能力,快速、轻松地部署和管理服务(无论它是一...

如何提高逻辑思维能力?_猴子数据分析的博客-程序员宝宝

今天介绍一种分析方法,可以提高我们的逻辑思维能力,分为以下几部分去聊:1.什么是假设分析方法?2.如何进行假设分析?3.在生活中如何应用?4.在工作中如何应用?1.什么是假设分析方法?假设分析方法底层思想其实很简单,就是:逻辑推理。这个逻辑推理,在我们生活中无处不在。如果你看过《神探狄仁杰》、《福尔摩斯》、《白夜追凶》,还有《唐人街探案》这些破...

python解数学方程_用Python如何解数学方程_李菲安的博客-程序员宝宝

用Python如何解数学方程我们先从简单的来例题1: 这是北师大版小学六年级上册课本95页的一道解方程练习题:x+1/5x=240大家可以先口算一下,这道题里面的x的值为200接下来我们用python来实现,代码如下,每一句代码后面都写有解释语:import sympy # 引入解方程的专业模块sympyx = sympy.symbols("x") # 申明未知数"x"a = sympy.solv...

推荐文章

热门文章

相关标签