qiangcxq / console-task-management

后台任务管理系统

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

================================

console-task-management (Yii2后台脚本管理)

##设计思路: 后台启动主进程,主进程负责监控及调用任务列表。 任务类型暂时分为3种,单次,重复间隔,每日固定时间 单次任务不管成功失败,只执行一次 重复间隔任务,按设定的间隔时间调用,如果任务仍在执行,则忽略。 每日固定时间任务,每日按指定的时间执行,如果执行失败,将重试。 所有的任务在执行时都会检测是否该任务仍然在执行(进程仍然存在), 如果是,则不会执行。确保单任务,单进程。 任务如果执行时间过长,则会启动超时机制,立即杀掉该任务进程。

##使用方法: 主进程配置在Crontab中,每隔1分钟执行一次。(主进程会自己先检查是否已在调用,如果没有才会启动) 在console/controllers里编写Controller,并继承BaseController. 在actionXXX里编写业务逻辑,注意在关键业务的地方使用$this->log()写入日志. 并在最后返回true/false 标明任务成功或失败。(如果不返回true,则会默认任务完成状态为失败) 在界面里新建一个任务,填写名称,执行程序(使用在console里执行的名称eg, controller/action), 选择任务类型以及开始时间。保存。一个执行程序只能在一个任务里,如果两个任务填写了同一个任务则会报错。

##考虑到的一些情况:

  1. 主进程被意外关闭,或者意外关机。 解决方法: 把主进程放到crontab里,隔一段时间调用一次(根据脚本的重要性设置时间长短)。这样即使进程突然挂了,过一段时间也会自动重启。机器挂了,在重启时也会自动启动。(当然,如果服务器挂了还没立即检测到并重启,那就该找运维同学谈谈心了.)
  2. 同一脚本被同时(并发)调用,或者脚本在执行时,又有另一个进程来调用。 解决方法: 在启动脚本的时候,检查内存中是否有该脚本的进程,如有就不调用,避免并发引起问题。 当然,如果希望并发,可以考虑使用多线程的方法。不过不太建议使用PHP做多线程。
  3. 一个脚本执行时间过长,有可能造成资源死锁 解决方法:设置脚本最大执行时间,如果主进程扫描到某脚本执行超时,则强制杀掉该进程。
  4. 如何知道脚本的执行情况,是成功还是失败。 解决方法:在控制器里封装了公共的日志记录方法,脚本里可以打印一些关键信息到该日志里,然后脚本在执行完成后应该返回true/false告知主进程是否调用成功。所有的日志都记录在数据库里,方便查询。
  5. 针对不同类型脚本执行失败情况的考虑 无固定解决方法,根据实际业务决定不同类型脚本是否需要失败重试以及重试次数。甚至可以自己加入监控,脚本失败时发邮件或通知。

##部分截图: 图片名称

图片名称

图片名称

About

后台任务管理系统

License:MIT License


Languages

Language:PHP 100.0%