当前位置:首页 > PHP > 正文内容

thinkphp3定时任务,tp定时任务,thinkphp定时任务

高老师5年前 (2020-02-29)PHP2306

本教程使用的定时任务基于EasyTak,EasyTask官方文档:https://gitee.com/392223903/EasyTask

由于tp3.2.x官方开发未考虑命令行支持和绝对路径开发的标准,因此我编写了一个支持的类来运行。

1.在tp3.2.3根目录下安装easytask

composer require easy-task/easy-task

2.创建一个执行命令行的入口文件:console.php

<?php

class ThinkSupport
{
    /**
     * argv
     * @var mixed
     */
    private $argv;

    /**
     * argc
     * @var mixed
     */
    private $argc;

    /**
     * action
     * @var string
     */
    private $action;

    /**
     * force
     * @var string
     */
    private $force;

    /**
     * Support constructor.
     */
    public function __construct()
    {
        //重置工作目录(only_win_system)
        chdir(dirname(__FILE__));

        //保存Cli_Input
        $this->argv = $_SERVER['argv'];
        $this->argc = $_SERVER['argc'];

        //保存命令并清空Cli_Input
        $this->action = isset($_SERVER['argv']['1']) ? $_SERVER['argv']['1'] : '';
        $this->force = isset($_SERVER['argv']['2']) ? $_SERVER['argv']['2'] : '';
        $_SERVER['argv'] = [] && $_SERVER['argc'] = 0;

        //抑制Tp错误
        if (!isset($_SERVER['REMOTE_ADDR'])) $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
        if (!isset($_SERVER['REQUEST_URI'])) $_SERVER['REQUEST_URI'] = 'localhost';
    }

    /**
     * 加载Think代码
     * @param Closure $think
     * @return ThinkSupport
     */
    public function invokeThink($think)
    {
        ob_start();
        $think();
        ob_get_clean();
        return $this;
    }

    /**
     * 加载你的代码
     * @param Closure $code
     */
    public function invokeYourCode($code)
    {
        //恢复Cli_Input.(方便自己扩展)
        $_SERVER['argv'] = $this->argv;
        $_SERVER['argc'] = $this->argc;

        //执行
        $code($this->action, $this->force);
    }
}

/**
 * Demo
 */
(new ThinkSupport())
    ->invokeThink(function () {
        //加载tp的代码
        require './index.php';
    })
    ->invokeYourCode(function ($action, $force) {

        // 加载Composer
        require './vendor/autoload.php';

        // 初始化
        $task = new \EasyTask\Task();

        // 设置项目名称
        $task->setPrefix('Think');

        // 设置后台运行
        $task->setDaemon(false);

        // 设置日志保存目录
        $task->setRunTimePath('./Application/Runtime/');

        // 添加闭包任务,开2个进程10s执行1次访问网址
        $task->addFunc(function () {
            @file_get_contents('http://xingxinghan.cn/?id=6');
        }, 'RenWu1', 10, 2);

        // 添加执行tp控制器的方法,开1个进程15s执行1次访问网址
        $task->addClass('\Home\Controller\IndexController', 'curl', 'RenWu2', 15, 1);

        // 添加执行系统命令的任务,启动2个进程每隔5s执行一次
        $task->addCommand('php D:/wwwroot/thinkphp_3.2.3_core/test.php', 'RenWu3', 5, 2);

        // 根据命令执行
        if ($action == 'start')
        {
            $task->start();
        }
        if ($action == 'status')
        {
            $task->status();
        }
        if ($action == 'stop')
        {
            $force = ($force == 'force'); //是否强制关闭
            $task->stop($force);
        }
    });

3.执行定时任务命令(windows用powershell执行)

php ./console.php  start

启动成功输出任务表格

4.查询定时任务(windows用powershell执行)

php ./console.php  status

成功输出任务表格

5.关闭定时任务(windows用powershell执行)

php ./console.php  stop

6.强制关闭定时任务(windows用powershell执行)

php ./console.php  stop  force

警告: 由于tp在命令行执行必须要加载一下自己的默认方法,默认方法就是index控制器的index方法,因此此方法必须存在。或者你可以把它设置为空方法。当然如果比并不需要再任务中执行tp的控制器方法,不需要加载tp的东西,可以不执行invokeThink方法。

提示:后台执行失败可修改为前台启动查看问题或者查看日志文件,有问题可以在qq群反馈bug。记得用星星支持我们哦。

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.5b1.cn/post/124.html

分享给朋友:

“thinkphp3定时任务,tp定时任务,thinkphp定时任务” 的相关文章

PHP生成微信分享需要的signature签名

PHP生成微信分享需要的signature签名

因为一个TP项目中客户需要全部网页分享支持自定义图片和描述信息,于是自己封装了下 //share()微信分享链接 //参数1 appid //参数2 appsert //参数3 nonceStr随机码 //参数4 timestamp时间戳 public&nb...

PHP浮点数乘以整数还是浮点型

PHP浮点数乘以整数还是浮点型

<?PHP     $a=0.5*100;     if(is_int($a)){   echo'int'; } else{ echo'not int';   }    ...

 php max input vars,max input vars限制,max input vars 设置

php max input vars,max input vars限制,max input vars 设置

在一个正式项目中操作人员提交239个产品信息进行保存,但是系统却提示没有提交239个产品,于是开启错误信息,显示如下:Warning: Unknown: Input variables exceeded 1000. To incr...

php 获取当前执行文件,php 获取当前执行文件,php 获取当前文件

php 获取当前执行文件,php 获取当前执行文件,php 获取当前文件

php官方的超全局变量$_SERVER['PHP_SELF']也能直接获取,只不过如果url参数太多也会获取。下面提供一个方法获取/*  * 获取当前PHP文件名称  */ if (!function_exists('phpself&#...

php  while  true  cpu占用100%

php while true cpu占用100%

在编写多进程的实例中我在每个进程中使用如下代码://调用等待信号的处理器 while (true) {     pcntl_signal_dispatch(); }开启5个进程,cpu直接100%修正之后的代码://调用等待信号的处理器 while&...

php限制方法返回值类型

php限制方法返回值类型

php7新增的特性(1).强制限制只能返回一种类型<?php class task { } //must return an integer function add(): int {    &nb...