【定时/计划任务】模块发布

简介:
 
此模块可以在网站系统的后台管理定时任务,让系统自动的定时的执行SQL,Shell或者请求指定的URL。
任务计划使用与 linux 一致的的 cron 表达式进行配置,所以非常灵活。例如:0 23 ? * MON-FRI 这样配置就可以设置任务在 每周一至周五晚上11点30分 执行计划任务。至于  cron 表达式请自行百度查询!

模块大量抄袭了 FastAdmin 的设计,但 FastAdmin 不能后台查看任务的执行结果,只能在服务器上查看日志文件,而且日志记录还不完整。不过我们还是要感谢FastAdmin作者!
FastAdmin项目地址: git.oschina.net/karson/fastadmin
 
 
应用场景举例:
  1. 定时执行SQL,比如定时清理某些日志表;
  2. 定时访问某个本地路径或者远程的URL,让其做某些工作;
  3. 定时执行Shell命令,比如定时更新网站搜索引擎的索引。

  

安装流程:
 1. 安装这两个依赖包
composer require mtdowling/cron-expression

composer require guzzlehttp/guzzle

说明:
mtdowling/cron-expression 是用来解析、计算 cron 表达式的关键组件;
guzzlehttp/guzzle 用来请求远程 url 的。

2. 安装模块
把模块包解压后放到 application 目录,然后进系统后台安装本模块。
 
3. 把系统入口文件 index.php 改为下面代码
 
DolphinPHP V1.0.8 版本使用下面代码
// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');

// 定义后台入口文件
define('ADMIN_FILE', 'admin.php');

// 检查是否安装
if(!is_file(__DIR__ . '/data/install.lock')){
define('BIND_MODULE', 'install');
}

// 加载框架基础文件
require __DIR__ . '/thinkphp/base.php';

// cli 模式关闭路由
if (PHP_SAPI == 'cli'){
\think\App::route(false);
}

// 执行应用
\think\App::run()->send();

 
DolphinPHP V1.1.0 以上版本使用下面代码
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');

// 定义后台入口文件
define('ADMIN_FILE', 'admin.php');

// 检查是否安装
if(!is_file(__DIR__ . '/../data/install.lock')){
define('BIND_MODULE', 'install');
}

// 加载框架基础文件
require __DIR__ . '/../thinkphp/base.php';

// cli 模式关闭路由
if (PHP_SAPI == 'cli'){
\think\App::route(false);
}

// 执行应用
\think\App::run()->send();

 说明:
  1. 把相对路径改成绝对路径的目的是为了使定时任务可以在命令行下的任意位置执行;
  2. cli模式下必须关闭系统的路由功能,否则 ThinkPHP 在检查路由的时候会报错,这貌似是 ThinkPHP 的BUG;

 
4. 开启PHP的 shell_exec() 函数
  1. 打开 php.ini ,在里面搜索 disable_functions ,然后把等号后面的 shell_exec 删掉
  2. 执行 /etc/init.d/httpd restart 重启 Apache ,如果是 Nginx 的话执行 /etc/init.d/php-fpm restart 重启 PHP

 
5. 添加一个Linux上的crontab定时任务
执行 crontab -e ,在里面添加一条定时任务,让服务器每1分钟访问一次我们的任务执行接口
* * * * * /usr/bin/php /你网站的完整根路径(绝对路径)/index.php /crontab/autotask
(1、注意空格;2、注意 DolphinPHP V1.1.0 以上版本入口文件是在 public 目录) 

6. 到网站后台添加任务即可
 
 
截图:

QQ截图20170714082128.png

 任务列表

QQ截图20170714082222.png

 请求本地路径配置

QQ截图20170714082359.png

 配置定时执行SQL

QQ截图20170714082450.png

请求远程URL,这里故意把url写错,用来测试请求失败的效果

QQ截图20170714082525.png

 执行的任务日志列表

QQ截图20170714082608.png

 可以看到,上面请求远程URL的任务内容配置错了,这里执行失败后便记录下了错误内容

QQ截图20170714082633.png

 执行Shell命令后记录返回的结果
 

模块包:
适用于 DolphinPHP V1.0.8



适用于 DolphinPHP V1.1.0 以上版本



从 DolphinPHP 1.0.8 升级到 1.1.0
1、升级时如果用升级包里的 vendor 替换了原系统的 vendor,请检查模块需要的那两个依赖包是否存在,如果被替换或删除了,请重新安装;
2、升级后如果覆盖了 index.php 入口文件,请照文中方法修改;
3、重新下载文中适用于 DolphinPHP V1.1.0 以上版本的模块包进行覆盖(实际上是需要覆盖 /crontab/view/admin/index/add.html 文件和 /crontab/home/Autotask.php 即可)
4、执行 crontab -e 命令,修改 Linux 定时任务中网站系统入口文件的绝对路径,因为 1.1.0 把入口调整到了 public 目录,这里也需要在 index.php 前面加上 public
  
更新日志:
2018-02-21:
1. 修复升级到 Dolphinphp v1.1.0 后本地 URL 任务执行错误问题;
 
2018-01-24:
1. 修改模板文件以支持 DolphinPHP V1.1.0 以上版本;
2. 上文中的安装说明新增 DolphinPHP V1.1.0 以上版本注意事项;

 2017-10-27:
1. 支持 DolphinPHP V1.0.8(V1.0.8以下版本需要删除表格构建器的raw()方法,V1.0.7系统有BUG,所以不支持);
2. 把 rmccue/requests 组件换成 guzzlehttp/guzzle;

 2017-07-15:
1. 更换掉后台任务管理模板的那种蛋疼的写法;
2. 修改任务执行接口上的一个小bug;
 

注意:
 
不支持windows环境

30 个评论

很好 感谢楼主 这就试试
好东西,感谢楼主
测试下先
windows下执行不了
没在windows上测试过,你安装那两个库了吗?
刚才想了下确实不支持windows
@流风回雪 您好 我这里任务正常 但没有日志,还有您更新了 我覆盖后 感觉没什么变化呢
界面还是第一版的 样子。。
改的是代码,界面没改
没日志那任务实际执行了吗?如果任务没执行,是不是没有添加Linux上的crontab定时任务,就是上面的第五步
直接服务器上执行脚本 提示。。[think\exception\HttpException]
controller not exists:Crontab
定时任务加了,刚发现是脚本直接执行 提示错误。。
1 请求URL 订单统计 0 0 2017-07-14 00:00 2023-07-16 00:00 2017-07-18 03:00 正常
没有哪个控制叫“Crontab”啊
composer require mtdowling/cron-expression
composer require rmccue/requests
这两个类库能发下么
index.php /crontab 你是不是这里没加空格?
用这两条命令安装,如果不清楚可以百度学习一下composer 的安装和使用,现在tp5已经使用composer 来添加组件了
没用过composer 尴尬
既然选择了 ThinkPHP5 这个开发框架,那将来必定会用到 composer ,还是大致学一下吧。
是的,WINDOWS下建议用TP的命令行模式,这个模式也不错的
我不考虑在win上的情况,现在生产环境都是Linux,感觉没必要去考虑那个
直接运行/usr/bin/php /你网站的完整根路径(绝对路径)/index.php /crontab/autotask 没有问题
但是cron自己运行就会出现问题,输出记录日志也没有任何信息。 楼主求解。
我也不清楚,看看是不是权限问题吧
这问题我在一个新项目上遇到了,原因是那个新项目我忘记修改 index.php 入口文件了
这个未必啊,用MSSQL的ERP还是很多的,那些大多是WINDOWS系统
更新了一下,支持v1.0.8
请问一下1.1.0版本那里提示Class 'Cron/CronExpression'不存在,这个要怎么处理,那些文件还是在原来的位置,只是index.php丢在public里面了
我的系统还没有升级到1.1.0,没在上面测试过
从 1.0.8 升级到 1.1.0需要做如下操作
1、升级时如果用升级包里的 vendor 替换了原系统的 vendor,请检查模块需要的那两个依赖包是否存在,如果被替换或删除了,请重新安装;
2、升级后如果覆盖了 index.php 入口文件,请照文中方法修改;
3、重新下载文中适用于 DolphinPHP V1.1.0 以上版本的模块包进行覆盖(实际上是需要覆盖 /crontab/view/admin/index/add.html 文件即可)
4、执行 crontab -e 命令,修改 Linux 定时任务中网站系统入口文件的绝对路径,因为 1.1.0 把入口调整到了 public 目录,这里也需要在 index.php 前面加上 public
1.1. 3 Class 'Cron\CronExpression' not found $cron = CronExpression::factory($schedule);


Class 'Cron/CronExpression'不存在

要回复文章请先登录注册