EasyTask是PHP常驻内存定时器Composer包,定位与Javascript的setInterval定时器效果一致,您可以用它来完成需要重复运行的任务(如订单超时自动取消,短信邮件异步推送,队列/消费者/频道订阅者等等),甚至处理Crontab计划任务(如每天凌晨1点-3点同步DB数据,每月1号生成月度统一报表,每晚10点重启nginx服务器等等);内置任务异常上报功能,异常错误您都可以自定义处理(例如实现异常错误自动短信邮件通知);还支持任务异常退出自动重启功能,让您的任务运行更稳定 ,工具包同时支持windows、linux、mac环境运行。
运行环境
Composer安装
composer require easy-task/easy-task
【一】. 快速入门->创建任务
//初始化 $task = new Task(); // 设置非常驻内存 $task->setDaemon(false); // 设置项目名称 $task->setPrefix('EasyTask'); // 设置记录运行时目录(日志或缓存目录) $task->setRunTimePath('./Application/Runtime/'); // 1.添加闭包函数类型定时任务(开启2个进程,每隔10秒执行1次你写闭包方法中的代码) $task->addFunc(function () { $url = 'https://www.gaojiufeng.cn/?id=243'; @file_get_contents($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'; $task->addCommand($command,'orderCancel',10,1); // 4.添加闭包函数任务,不需要定时器,立即执行(开启1个进程) $task->addFunc(function () { while(true) { //todo } }, 'request', 0, 1); // 5.每晚9点半通过curl命令访问网站 $task->addCommand('curl https://www.gaojiufeng.cn', 'curl', '30 21 * * *', 1); // 启动任务 $task->start();
【二】. 快速入门->连贯操作
$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/') /** * 关闭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();
【三】. 快速入门->命令整合
// 获取命令 $force = empty($_SERVER['argv']['2']) ? '' : $_SERVER['argv']['2']; $command = empty($_SERVER['argv']['1']) ? '' : $_SERVER['argv']['1']; // 配置任务 $task = new Task(); $task->setRunTimePath('./Application/Runtime/'); $task->addFunc(function () { $url = 'https://www.gaojiufeng.cn/?id=271'; @file_get_contents($url); }, 'request', 10, 2);; // 根据命令执行 if ($command == 'start') { $task->start(); } elseif ($command == 'status') { $task->status(); } elseif ($command == 'stop') { $force = ($force == 'force'); //是否强制停止 $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
【四】. 快速入门->认识输出信息
┌─────┬──────────────┬─────────────────────┬───────┬────────┬──────┐ │ 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
【五】. 进阶了解->建议阅读
(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群反馈
【六】. 进阶了解->框架集成教程
【七】. 进阶了解->推荐操作
(1).推荐使用7.1以上版本的PHP,支持异步信号,不依赖ticks (2).推荐安装php_event扩展基于事件轮询的毫秒级定时支持
【八】. 进阶了解->时间参数支持crontab命令
(1).特殊表达式: @yearly 每年运行一次 等同于(0 0 1 1 *) @annually 每年运行一次 等同于(0 0 1 1 *) @monthly 每月运行一次 等同于(0 0 1 * *) @weekly 每周运行一次 等同于(0 0 * * 0) @daily 每日运行一次 等同于(0 0 * * *) @hourly 每小时运行一次 等同于(0 * * * *) (2).标准表达式: '30 21 * * *' 每天晚上21:30执行一次 '0 23 * * 6' 每周星期六的晚上23:00执行一次 '3,15 * * * *' 每小时的第3分钟和第15分钟执行一次 '45 4 1,10,22 * *' 每月的1/10/22日的04:45执行一次 '3,15 8-11 * * *' 每天上午8点到11点的第3分钟和第15分钟执行一次 其他指令请自己测试 使用example/build_cron_date.php生成执行时间列表来检查自己的命令是否符合预期