PHP定时任务,不依赖于框架种类,本次以在Laravel中使用为例

-

PHP定时任务,不依赖于框架种类,意思是可以移植到ThinkPHP和Laravel中。同时可以方便在一个定时任务中分发多个子任务,这样就可以实现一个定时来运行多个计划任务,而不再次开一个php-fpm。

1. 前言:

已知Laravel里面有自带的定时任务调度计划—— “app/Console/Kernel.php 的 schedule”。

你可以参考此博文:https://blog.csdn.net/stand_forever/article/details/89429881来实现laravel自带的任务定时计划功能。

最新版的TP里面不知道有没有自带的定时任务计划。

2. 制作:

a)安装依赖:composer require easy-task/easy-task

b)在控制器里面引入依赖:use EasyTask\Task;

具体使用方法参考文档:https://gitee.com/392223903/EasyTask

c)写一个api来启动定时函数:public/index.php/api/enhance/interval_run?secret=&task_class=

d)写一个任务分配接口+函数:public/index.php/api/enhance/interval_func?task_info=&task_class=

3. 运行和停止定时任务:

a)启动定时任务:http://192.168.131.129/xxx/public/index.php/api/enhance/interval_run?secret=&task_class=
b)停止所有定时任务(也可以重启服务器,因为设置了php-fpm进程挂掉重启,所以不能杀死单个php-fpm。总之建议重启服务器。):[root@localhost ~]# killall php-fpm
c)已设置每40s运行api_url接口一次
d)此文件会被缓存起来,若使用其他可变的函数,请移步IntervalFunc.php定义。

PHP定时任务,不依赖于框架种类,本次以在Laravel中使用为例插图

如下:定时器使用函数

<?php
namespace App\Http\Controllers\Enhance;

use App\Http\Controllers\EnhanceSafeCheck;
use Illuminate\Http\Request;
use Exception;
use Illuminate\Support\Facades\DB;
use EasyTask\Task;

final class IntervalRun Extends EnhanceSafeCheck{

    final function __construct(Request $request){
        parent::__construct($request);

    }

    // 定时执行的进程
    // 文档:https://gitee.com/392223903/EasyTask
    // 安装依赖:composer require easy-task/easy-task
    // 启动定时任务:http://192.168.131.129/xxx/public/index.php/api/enhance/interval_run?secret=&task_class=
    // 停止所有定时任务(也可以重启服务器,因为设置了php-fpm进程挂掉重启,所以不能杀死单个php-fpm。总之建议重启服务器。):[root@localhost ~]# killall php-fpm
    // 已设置每40s运行api_url接口一次
    // 此文件会被缓存起来,若使用其他可变的函数,请移步IntervalFunc.php定义
    final function interval_run(Request $request){
        $secret = $request->input('secret'); // 开启密钥
        $task_class = $request->input('task_class'); // 任务类型

        if ($secret != date('Ymd')){
            print_r([
                'class'=> $task_class,
                'key'=> $secret,
                'msg'=> '参数不全,不能开启自动任务',
            ]);
            exit();
        }else{

            $api_url = config_api_url()['api_url'].'enhance/interval_func?task_info=auto_task@xxx@'.date('YmdHis').'@easy_task&task_class='.$task_class;

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

            $task->setDaemon(false); // 设置非常驻内存
            $task->setTimeZone('Asia/Shanghai'); // 设置系统时区
            $task->setAutoRecover(true); // 设置子进程挂掉自动重启
            $task->setPrefix('EasyTask-IntervalRun'); // 设置项目名称
            $task->setRunTimePath(path_info()['storage_path']."/interval_run/"); // 设置记录运行时目录(日志或缓存目录)

            // 添加闭包函数类型定时任务(每隔x秒执行n次你写闭包方法中的代码)
            $task->addFunc(function () use ($api_url){ // use()是使用父级参数
                // 其他定时操作
                // 请求接口
                request_option($api_url, 'get', [], false);

            }, 'request', 40, 1); // time:s,used:开启N个进程

            $task->start(); // 启动任务

        }

    }



}

如下:定时分发任务的函数:

<?php
namespace App\Http\Controllers\Enhance;

use App\Http\Controllers\Enhance\Log;
use App\Http\Controllers\EnhanceSafeCheck;
use Illuminate\Http\Request;
use Exception;
use Illuminate\Support\Facades\DB;

final class IntervalFunc Extends EnhanceSafeCheck{

    final function __construct(Request $request){
        parent::__construct($request);

    }


    // test
    public function func_test($task_class){
        $log = new Log();
        $info = [
            'func_test'=> '测试定期器任务分发',
            'task_class'=> $task_class,
        ];
        $log->write_log('WebSafeCheck debug_key', $info);
    }


    // 定时器启动后执行其他操作
    final function interval_func(Request $request){
        $task_info = $request->input('task_info');
        $task_class = $request->input('task_class');

        // 分发任务
        if ($task_class == 'test'){
            $this->func_test($task_class);
        }else {
            $task_info = 'Msg-task_class-unknown';
        }

        // 记录运行日志
        $data = [
            'api'=> 'interval_func',
            'param'=> $task_info,
            'create_time'=> date('YmdHis'),
            'remark'=> '定记-'.$task_class,
        ];
        $interval_run_id = DB::table('interval_run')->insertGetId($data);

        // 删除老数据
        $now_time = date('YmdHis');
        $last_time = $now_time - 8*60*60; // s。设置日志保存8天
        $res_del = DB::table('interval_run')
            ->where('create_time', '<', $last_time)
            ->delete();

        $back = [
            'state'=> 1, // 只能取值0或1
            'msg'=> '运行完成',
            'content'=> [$task_info, $task_class, $interval_run_id, $res_del],
        ];
        return array_to_json($back);
    }



}

如下,数据库记录运行的记录:

PHP定时任务,不依赖于框架种类,本次以在Laravel中使用为例插图(1)

如下,日志文件记录:

PHP定时任务,不依赖于框架种类,本次以在Laravel中使用为例插图(2)

-

-

 

没有账号? 忘记密码?

社交账号快速登录