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
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);
    }



}

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

如下,日志文件记录:

-

-

 

taskPHP taskPHP基于php开发的定时计划任务框架,利用多进程实现任务的分配和运行,利用内存共享实现进程间通信,支持多线程模式需要安装pthreads扩展(可选),支持linux和windows。有较好的伸缩性、扩展性、健壮稳定性而被多家公司使用,同时也希望开源爱好者一起贡献。   框架概况 框架目录结构: taskPHP 根目录 |-- core 框架系统目录 | |-- lib 框架核心文件目录 | | |-- .... 众多的框架核心类库文件 | |-- guide.php 框架引导文件 | |-- distribute_listen.php 任务派发进程入口 | |-- worker_listen.php 任务执行进程入口 |-- docs 开发文档存放目录 |-- logs 日志目录 |-- tasks 用户任务目录 | |-- demo demo任务 | | |-- Lib demo任务的扩展目录 | | |-- demoTask.php demo任务类文件 | | |-- config.php demo任务配置文件 | | ... 更多任务 | |-- config.php 全局配置文件 |-- main.php 框架入口文件 |-- windows_single.cmd windows快速启动文件 框架说明 linux下子进程执行任务,修改脚本无需重启后台服务立即生效,windows下修改任务脚本后需重启后台脚本 但往系统添加执行不受影响。 框架支持多线程模式,需要安装pthreads扩展(可选)。 使用内存共享实现进程通信,堵塞式消息队列,整个框架的运行无需第三方扩展。 任务派发及具体任务执行不在同个进程[distribute_listen.php]和[worker_listen.php],windows和linux下启用入口文件[main.php],windows下可运行[windows_single.cmd]快速启动。 执行时间语法跟crontab类似,且支持秒设置。 添加任务简单,只需继承Task基类,实现任务入口run方法。 环境要求 php版本>= 5.5 开启shmop 注意事项 由于任务存在派发时间,所以任务运行的时间可能会有1-2秒的误差。 windows下执行任务在循环里,编写任务有问题或调用exit将导致后台脚本停止,linux下无此问题。 建议生产部署在linux下运行多进程模式,因为运行在多线程模式运行一段时间后报错,pthreads has detected that the core\lib\Pthread could not be started, the system lacks the necessary resources or the system-imposed limit would be exceeded in xxx 文档列表 -->数据库类使用教程 支持(Mysql,Mongo,Oracle,Pgsql,Sqlsrv,Sqllite) -->windows下安装php多线程扩展pthreads教程 -->工具类Utils使用说明 -->http请求客户端类Client使用说明 使用说明 时间配置格式说明: * * * * * * * //格式 :秒 分 时 天 月 年 周 10 * * * * * * //表示每一分钟的第10秒运行 /10 * * * * * * //表示每10秒运行 /1 * 15,16 * * * * //表示 每天的15点,16点的每一秒运行 系统命令说明: main.php [start] 启动 可不带参数 main.php close 结束 main.php reload 重新加载任务 main.php delete demo 删除任务 main.php select 查看任务列表 main.php exec demo 运行任务 主要用于任务开发调试单个任务 全局配置文件规范 标签:taskphp  计划任务
为什么使用PHP管理crontab 一般在定时任务较少的情况下,使用原生的crontab服务一般不会有什么问题,但当定时任务较多时就会产生如下问题: 文本形式的定时任务可读性很差,在没有任何注释的情况下,新人很难在不读源码的情况下了解定时任务的业务逻辑 在分布式的场景定时任务会散落到多台机器上,无法统一管理 定时任务的日志不能集化管理,对定时任务的运行分析及故障排除比较麻烦 基于以上几点原因,我们迫切的需要一个可以集化管理的、可配置的定时任务管理器 但自己开发一套分布式的定时任务系统何其复杂,所以作者采用crontab服务做辅助,使用php实现对定时任务的配置管理 使用php管理定时任务有哪些优势 定时任务可以不再是以文本方式的形式存在,可以存储在缓冲、数据库,甚至你可以开发管理功能,在后台对定时任务进行编辑 定时任务的日志是可配置的,你可以按照业务需求,对日志进行差异化配置 使用方式如下: 编写一个任务管理器,可参考test/simple.php 将上述脚本添加到crontab,一分钟执行一次 示例: <?php $crontab_config = [  'test_1' => [  'name' => '服务监控1',  'cmd' => 'php -v',  'output' => '/tmp/test.log',  'time' => '* * * * *'  ],  'single_test' => [  'name' => 'php -i',  'cmd' => 'php -i',  'output' => '/tmp/single_script.log',  'time' => [  '* * * * *',  '* * * * *',  ],  ], ];  $crontab_server = new \Jenner\Zebra\Crontab\Crontab($crontab_config); $crontab_server->start(); 工具短小,但很精悍 在分布式场景,你可以把定时任务写入数据库进行统一管理,你可以设定哪些定时任务是由哪些机器执行, 然后通过生成文本文件的方式发送到所有机器上,再由这些机器上的phpCrontab读取处理;从而实现分布式场景下的定时任务统一管理。 标签:Zebra
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值