EasyTask简单易用的PHP常驻内存定时器

官方QQ群点击一键加入 | English document

项目介绍

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

【一】. 快速入门->创建任务

// 初始化

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

// 启动任务

$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/')

/**

* 设置关闭标准输出的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();

【三】. 快速入门->命令整合

// 获取命令

$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群反馈

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

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

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

自2.3.6版本为减少维护工作开始移除Crontab的支持,请通过PHP自带时间函数|DateTime类进行处理.

例如只需要每天晚上20点执行,判断不是20点执行Return即可.

$task->addFunc(function () {

$hour = date('H');

if ($hour != 20)

{

return;

}

//Write your code

}, 'request', 1, 1);

【九】. 特别感谢

(1).ThinkPHP(命令行输出组件基于Tp_Table组件),官方地址:http://www.thinkphp.cn/

【十】. Bug反馈

请反馈至QQ群777241713,感谢持续反馈的用户,是您的反馈让EasyTask越来越稳定!

php 常驻内存数据,EasyTask: PHP常驻内存定时任务定时器,(PHP resident memory timer, scheduled tasks)...相关推荐

  1. java内存数据被篡改,初涉Java内存模型

    Java内存模型 Java实现会带来不同的"翻译",不同CPU平台的机器指令又千差万别,无法保证并发安全的效果一致. JVM内存结构 VS Java内存模型 VS Java对象模型 ...

  2. Linux c 基于内存的进程通信—共享内存、共享队列(消息队列)

    基于内存的进程通信: 1.      内核共享内存 编程模型:     1.1.创建共享内存,得到一个ID  shmget 1.2.把ID影射成虚拟地址(挂载)  shmat 1.3.使用虚拟地址访问 ...

  3. 内存优化 · 基础论 · 初识 Android 内存优化

    [小木箱成长营]内存优化系列文章: 内存优化 · 工具论 · 常见的 Android 内存优化工具和框架 内存优化 · 方法论 · 揭开内存优化神秘面纱 内存优化 · 实战论 · 内存优化实践与应用 ...

  4. go 是常驻内存吗_图解 Go 内存分配器

    原标题:图解 Go 内存分配器 作者 | Ankur Anand 译者 | 闫亮 内存分配器一直是性能优化的重头戏,其结构复杂.内容抽象,涉及的数据结构繁多,相信很多人都曾被它搞疯了.本文将从内存的基 ...

  5. 【常驻进程内存优化】开机5分钟后常驻进程(Persistent)占用内存大小≤xxxMB,不达标

    一.测试步骤: [预置条件]手机刷机后过完开机向导,连接adb后重启手机 [操作步骤] 1.手机刷机后过完开机向导,连接adb后重启手机 2.开机等待5分钟后通过:adb shell dumpsys ...

  6. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义...

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  7. c语言文件 加载内存吗,把文件中的数据加载到内存进行查找C语言实现.docx

    把文件中的数据加载到内存进行查找C语言实现 #define _CRT_SECURE_NO_WARNINGS#include#include#includechar **pp=NULL;void ini ...

  8. solidity 汇编语言问题——内存数据mload时为什么从第32位开始

    问题:内存数据mload时为什么从第32位开始 代码出处:https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d pragma so ...

  9. [cocos2dx]防止八门神器修改内存数据

    网上的cocos2d-x教程多为知识点的讲解,但我们学习cocos2d-x的目的是为了什么?为了做出游戏来!这篇文章的前提是单机游戏,网络游戏有自己的加密方法,与单机游戏不尽相同! 游戏辛辛苦苦的做完 ...

最新文章

  1. python函数定义的要点_python基础之函数重点
  2. change from a ppt to the report
  3. tomcat7.0配置CORS(跨域资源共享)
  4. MongoDB升级导致启动失败
  5. .NET进阶系列之一:C#正则表达式整理备忘
  6. Mina Basics 04- 会话
  7. LDA主题模型原理解析与python实现
  8. SQLPROFILER计算机用户操作数据SQL记录跟踪
  9. 【J2ME笔记】关于J2ME Image图片指定颜色透明化
  10. 赞!7000 字学习笔记,MySQL 从入到放弃
  11. 数学建模系列--插值算法
  12. Android Gradle plugin requires Java 11 问题解决
  13. Hbuilder We're sorry
  14. Android11 强制所有APP 横屏显示
  15. 哪个牌子的蓝牙耳机音质好?公认音质最好的真无线耳机推荐
  16. 7.选择结构之switch结构
  17. 图像风格迁移-DSTN
  18. SOLIDWORKS知识点——异型孔增加需要的螺纹孔规格
  19. 利用外观模式来实现对子系统的访问的工程实践
  20. Turf.js——用于地理空间分析的js库,处理各种地图算法

热门文章

  1. 两种常见电商sku的设计
  2. adapt和adopt的区别_相似词辨析:adapt, adopt 与 adept
  3. 60帧/秒摄像头 视频帧数最佳选择!
  4. Jeff Dean和李飞飞在清华谈AI:非常Excited,不能一口吃成胖子
  5. 第一章:互联网和万维网的基础
  6. 树莓派21/100 - 在Windows上配置Pico开发环境
  7. UVA 1533 - Moving Pegs 状态压缩 + bfs
  8. 如何将ASIL划分为不同的等级
  9. 零基础想考HCIP(华为认证网络工程师)需要准备什么?
  10. 运算放大器使用的一些经验