easy-task定时任务(模仿)

添加链接描述
tp5.1 EasyTask插件做定时任务

我是高手高手高高手

于 2020-10-13 15:21:16 发布

2106
收藏 4
分类专栏: thinkphp5 php tp6
版权

thinkphp5
同时被 3 个专栏收录
248 篇文章3 订阅
订阅专栏

php
418 篇文章6 订阅
订阅专栏

tp6
87 篇文章3 订阅
订阅专栏
一、EasyTask简介
EasyTask,PHP常驻内存定时器Composer包,与Workerman定时器效果完全一致,多个定时器是同时在多个进程中运行的,您可以用它来完成需要重复运行的任务(如订单超时自动取消,短信邮件异步推送,队列/消费者/频道订阅者等等),甚至处理Crontab计划任务(如每天凌晨1点-3点同步DB数据,每月1号生成月度统一报表,每晚10点重启nginx服务器等等);内置任务异常上报功能,异常错误您都可以自定义处理(例如实现异常错误自动短信邮件通知);还支持任务异常退出自动重启功能,让您的任务运行更稳定 ,工具包同时支持windows、linux、mac环境运行。

运行环境

windows:PHP>=5.4 (依赖com_dotnet+wpc扩展)文档+安装教程
linux|mac:PHP>=5.4 (依赖pcntl+posix扩展)文档+安装教程
Composer安装

composer require easy-task/easy-task
【A】. 快速入门->创建任务

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

// 设置非常驻内存
$task->setDaemon(false);

// 设置项目名称
$task->setPrefix(‘EasyTask’);

// 设置记录运行时目录(日志或缓存目录)
$task->setRunTimePath(‘./Application/Runtime/’);

// 1.添加闭包函数类型定时任务(开启2个进程,每隔10秒执行1次你写闭包方法中的代码)
$task->addFunc(function () {
u r l = ′ h t t p s : / / w w w . g a o j i u f e n g . c n / ? i d = 24 3 ′ ; @ f i l e g e t c o n t e n t s ( url = 'https://www.gaojiufeng.cn/?id=243'; @file_get_contents( url=https://www.gaojiufeng.cn/?id=243;@filegetcontents(url);
}, ‘request’, 10, 2);

// 2.添加类的方法类型定时任务(同时支持静态方法)(开启1个进程,每隔20秒执行一次你设置的类的方法)
$task->addClass(Sms::class, ‘send’, ‘sendsms’, 20, 1);

// 3.添加指令类型的定时任务(开启1个进程,每隔10秒执行1次)
$command = ‘php /www/web/orderAutoCancel.php’;
t a s k − > a d d C o m m a n d ( task->addCommand( task>addCommand(command,‘orderCancel’,10,1);

// 4.添加闭包函数任务,不需要定时器,立即执行(开启1个进程)
$task->addFunc(function () {
while(true)
{
//todo
}
}, ‘request’, 0, 1);

// 启动任务
$task->start();
【B】. 快速入门->连贯操作

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

// 设置常驻内存
$task->setDaemon(true)

// 设置项目名称
->setPrefix(‘ThinkTask’)

// 设置系统时区
->setTimeZone(‘Asia/Shanghai’)

// 设置子进程挂掉自动重启
->setAutoRecover(true)

// 设置PHP运行路径,一般Window系统才需要设置,当系统无法找到才需要您手动设置
->setPhpPath(‘C:/phpEnv/php/php-7.0/php.exe’)

/**

  • 设置运行时目录(日志或缓存目录)
    */
    ->setRunTimePath(‘./Application/Runtime/’)

/**

  • 设置关闭标准输出的STD文件记录
    */
    ->setCloseStdOutLog(true);

/**

  • 关闭EasyTask的异常注册
  • EasyTask将不再监听set_error_handler/set_exception_handler/register_shutdown_function事件
    */
    ->setCloseErrorRegister(true)

/**

  • 设置接收运行中的错误或者异常(方式1)
  • 您可以自定义处理异常信息,例如将它们发送到您的邮件中,短信中,作为预警处理
  • (不推荐的写法,除非您的代码健壮)
    */
    ->setErrorRegisterNotify(function ($ex) {
    //获取错误信息|错误行|错误文件
    $message = $ex->getMessage();
    $file = $ex->getFile();
    $line = $ex->getLine();
    })

/**

  • 设置接收运行中的错误或者异常的Http地址(方式2)
  • Easy_Task会POST通知这个url并传递以下参数:
  • errStr:错误信息
  • errFile:错误文件
  • errLine:错误行
  • 您的Url收到POST请求可以编写代码发送邮件或短信通知您
  • (推荐的写法)
    */
    ->setErrorRegisterNotify(‘https://www.gaojiufeng.cn/rev.php’)

// 添加任务定时执行闭包函数
->addFunc(function () {
echo ‘Success3’ . PHP_EOL;
}, ‘fucn’, 20, 1)

// 添加任务定时执行类的方法
->addClass(Sms::class, ‘send’, ‘sendsms1’, 20, 1)

// 添加任务定时执行命令
->addCommand(‘php /www/wwwroot/learn/curl.php’,‘cmd’,6,1)

// 启动任务
->start();
【C】. 快速入门->命令整合

// 获取命令
f o r c e = e m p t y ( force = empty( force=empty(_SERVER[‘argv’][‘2’]) ? ‘’ : $_SERVER[‘argv’][‘2’];
c o m m a n d = e m p t y ( command = empty( command=empty(_SERVER[‘argv’][‘1’]) ? ‘’ : $_SERVER[‘argv’][‘1’];

// 配置任务
$task = new Task();
$task->setRunTimePath(‘./Application/Runtime/’);
$task->addFunc(function () {
u r l = ′ h t t p s : / / w w w . g a o j i u f e n g . c n / ? i d = 27 1 ′ ; @ f i l e g e t c o n t e n t s ( url = 'https://www.gaojiufeng.cn/?id=271'; @file_get_contents( url=https://www.gaojiufeng.cn/?id=271;@filegetcontents(url);
}, ‘request’, 10, 2);;

// 根据命令执行
if ($command == ‘start’)
{
KaTeX parse error: Expected 'EOF', got '}' at position 16: task->start(); }̲ elseif (command == ‘status’)
{
KaTeX parse error: Expected 'EOF', got '}' at position 17: …ask->status(); }̲ elseif (command == ‘stop’)
{
f o r c e = ( force = ( force=(force == ‘force’); //是否强制停止
t a s k − > s t o p ( task->stop( task>stop(force);
}
else
{
exit(‘Command is not exist’);
}

启动任务: php console.php start
查询任务: php console.php status
普通关闭: php console.php stop
强制关闭: php console.php stop force

【D】. 快速入门->认识输出信息

┌─────┬──────────────┬─────────────────────┬───────┬────────┬──────┐
│ pid │ name │ started │ time │ status │ ppid │
├─────┼──────────────┼─────────────────────┼───────┼────────┼──────┤
│ 32 │ Task_request │ 2020-01-10 15:55:44 │ 10 │ active │ 31 │
│ 33 │ Task_request │ 2020-01-10 15:55:44 │ 10 │ active │ 31 │
└─────┴──────────────┴─────────────────────┴───────┴────────┴──────┘
参数:
pid:任务进程id
name:任务别名
started:任务启动时间
time:任务执行时间
status:任务状态
ppid:守护进程id

【E】. 进阶了解->建议阅读

(1). 建议您使用绝对路径进行开发,是标准更是规范
(2). 禁止在任务中使用exit/die语法,否则导致整个进程退出
(3). Windows安装Wpc扩展时请关闭杀毒软件,避免误报
(4). Windows建议开启popen,pclose方法,会自动尝试帮您解决CMD输出中文乱码问题,请尽量使用CMD管理员方式运行
(5). Windows命令行不支持utf8国际标准编码,可切换git_bash来运行,解决乱码问题
(6). Windows提示Failed to create COM object `Wpc.Core’: 无效的语法,请按照文档安装Wpc扩展
(7). Windows提示com() has been disabled for security reasons,请在php.ini中删除disable_classes = com配置项目
(8). 日志文件在运行时目录的Log目录下,标出输入输出异常文件在运行时目录Std目录下
(9). 普通停止任务,任务会在执行成功后开始安全退出,强制停止任务直接退出任务,可能正在执行就强制退出
(10). 开发遵守先同步启动测试正常运行无任何报错再设置异步运行,有问题查看日志文件或者标准输入输出异常文件,或者上QQ群反馈

【F】. 进阶了解->框架集成教程

-> thinkphp3.2.x教程.

-> thinkPhp5.x.x教程.

-> thinkPhp6.x.x教程.

-> laravelPhp6.x.x教程.

【G】. 进阶了解->其他知识学习

-> 原生PHP+Redis队列学习教程.

-> EasyTask+Redis队列学习教程.

【H】. 进阶了解->CronTab支持

自2.3.6版本为减少维护工作开始移除Crontab的支持,请通过PHP自带时间函数|DateTime类进行处理.
例如只需要每天晚上20点执行,判断不是20点执行Return即可.
$task->addFunc(function () {
h o u r = d a t e ( ′ H ′ ) ; i f ( hour = date('H'); if ( hour=date(H);if(hour != 20)
{
return;
}

//Write your code

}, ‘request’, 1, 1);
二、基础入门

2.1.安装完成引入

require ‘./vendor/autoload.php’;

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

// 设置非常驻内存
$task->setDaemon(false);

// 设置项目名称
$task->setPrefix(‘EasyTask’);

// 设置记录运行时目录(日志或缓存目录)
$task->setRunTimePath(‘./Application/Runtime/’);

// 1.添加闭包函数类型定时任务(开启2个进程,每隔10秒执行1次)
$task->addFunc(function () {
u r l = ′ h t t p s : / / w w w . g a o j i u f e n g . c n / ? i d = 24 3 ′ ; @ f i l e g e t c o n t e n t s ( url = 'https://www.gaojiufeng.cn/?id=243'; @file_get_contents( url=https://www.gaojiufeng.cn/?id=243;@filegetcontents(url);
}, ‘request’, 10, 2);

// 2.添加类的方法类型定时任务(同时支持静态方法)(开启1个进程,每隔20秒执行1次)
$task->addClass(Sms::class, ‘send’, ‘sendsms’, 20, 1);

// 3.添加指令类型的定时任务(开启1个进程,每隔10秒执行1次)
$command = ‘php /www/web/orderAutoCancel.php’;
t a s k − > a d d C o m m a n d ( task->addCommand( task>addCommand(command,‘orderCancel’,10,1);

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

2.2.代码解析

(3.1).setDaemon(false)
设置非后台运行,在windows下会启动php进程执行代码,你会看到几个黑色窗口在执行代码,在linux下会在当前终端执行代码。

(3.2).setDaemon(true)
设置后台运行,在windows下让进程在后台运行你看不到执行界面,在linux会常驻在内存中就算你关闭命令行窗口依然在执行。

(3.3).setPrefix(‘项目名称’)
为当前的项目设置一个别名,推荐为英文,主要目的是为了方便区分项目,可以自定义。

(3.4).setRunTimePath(‘运行缓存或日志路径’)
设置一个EasyTask运行日志和缓存文件保存的目录。

(3.5).addFunc(闭包函数,任务名称,执行间隔时间,启动进程数)
添加一个任务,每间隔多少秒执行下您设置的闭包函数中的代码。例如上面中在闭包函数设置请求一个url,每隔10秒执行一次闭包函数,并且开启了2个进程,那么10秒后闭包函数被执行2次

(3.6).addClass(‘类名称’,‘类的方法’,‘任务名称’,执行间隔时间,启动进程数)
添加一个任务,每间隔多少秒执行下您设置的类的某个方法。例如上面的例子中每隔20秒就会执行您设置的Sms类的send方法

(3.7).addCommand(‘cmd/shell命令’,任务名称,执行间隔时间,启动进程数)
添加一个任务,每间隔多少秒执行下您设置cmd命令或者shell命令,例如上面的例子中每隔10秒执行1次“php /www/web/orderAutoCancel.php”命令

(3.8).start()
启动添加的所有任务,启动后window下任务管理器即可看到对应的进程信息,切换详情信息即可看到启动的进程id,linux下可以使用ps aux|项目名称查看已经启动的进程id;如果是windows下同步模式启动,可以直接关闭所有cmd窗口即可关闭所有任务,如果是linux同步模式启动,直接按ctrl+c即可关闭所有任务

三:例子教程: thinkphp5.x定时任务
(1).安装tp5.0或者5.1

(2).安装定时任务composer包

(3).创建命令行处理类文件application/common/command/Task.php

<?php namespace app\common\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() { //设置名称为task $this->setName('task') //增加一个命令参数 ->addArgument('action', Argument::OPTIONAL, "action") ->addArgument('force', Argument::OPTIONAL, "force"); } protected function execute(Input $input, Output $output) { //获取输入参数 $action = trim($input->getArgument('action')); $force = trim($input->getArgument('force')); // 配置任务 $task = new \EasyTask\Task(); $task->setRunTimePath('./runtime/'); $task->addFunc(function () { $url = 'https://www.gaojiufeng.cn/?id=319'; file_get_contents($url); }, 'request', 10, 2);; // 根据命令执行 if ($action == 'start') { $task->start(); } elseif ($action == 'status') { $task->status(); } elseif ($action == 'stop') { $force = ($force == 'force'); //是否强制停止 $task->stop($force); } else { exit('Command is not exist'); } } } (4).将上面创建的Task.php在配置文件application/command.php中配置一下 return [ 'app\common\command\Task', ]; (5).执行命令(windows请使用cmd): php think task start 启动命令 php think task status 查询命令 php think task stop 关闭命令 php think task stop force 强制关闭命令 上面创建的定时任务是每隔10秒访问2次网站地址。 四、window系统下的注意(按第三点例子来操作) EasyTask的Windows环境要求如下(推荐使用PHPENV集成环境): PHP版本大于或者等于 5.4 PHP开启json扩展(默认已安装) PHP开启mbstring扩展(默认已安装) PHP开启com_dotnet扩展(自己手动安装) PHP开启wpc扩展(自己手动安装) PHP正确配置环境变量 4.1 让CMD直接运行PHP命令 教程:https://blog.csdn.net/haibo0668/article/details/109080423 4.2 进行项目根目录再开php think task start 启动命令 4.3 错误 command "task" is not defined. 没有找到任务文件,请注意自己的文件路径: 4.4 错误 [error] : Failed to create COM object `Wpc.Core': 拒绝访问。 造成的原因,是安装了wpc扩展2.0版本,请安装低版本wpc1.0 wpc扩展安装方法,下载wpc扩展一键安装包,根据PHP是32/64位执行一键安装包即可,切记此处说明的是PHP的位数,不是系统的位数,下载地址:https://www.gaojiufeng.cn/static/exe/2.0/Wpc_install.zip ,如果提示权限问题,可以试试低版本的:https://www.gaojiufeng.cn/static/exe/1.0/Wpc_install.zip 成功
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值