huangdingbo 2019-04-20 23:42:41 1648次浏览 1条评论 3 0 0

刚接触yii框架不久,公司也不用yii,但是就是很喜欢yii框架,平时没事做就用yii写点小东西,前段时间写了很多后台脚本,用crontab管理起来太麻烦了,所以想搞一个后台任务管理,简单的添加就能跑起来。 所以有了想法以后,一般第一思路就是百度一下,有没有类似的YB体育,有现成的不用白不用,对吧。但是百度一番并没有,这就尴尬了......不过也找到了一个例子,思路跟我想的也差不多,所以连抄带搬,再优化一下,我就是一个菜鸟!!!

参考例子 话不多说(好像说了很多废话),下面把设计的思路理一遍,还是有很多坑的,上面例子的代码直接粘贴到项目里,基本上不能跑起来吧,毕竟服务器的配置都有差异......

思路:
  1. 利用crontab来创建主进程,并且每隔三分钟执行一次(避免服务器意外关机、重启,主进程意外中 止......)

  2. 主进程:

(1)检查主进程是否再运行,没有就启动,有就退出

(2)检查是否有执行超时的任务,有就杀掉进程,并写入日志

(3)检查任务表,是否有需要执行的任务,有就执行,如果产生错误就写入日志

设计:一个主进程控制器类,两个模型类(任务模型、日志模型),两个工具类(进程类、写日志类),两个 公共的控制器类(分web、console)

功能:限制ip访问、前台添加任务,主进程循环扫描任务列表,执行任务,创建的任务可以是yii控制台的脚 本,也可以是web端的脚本,错误写入日志,默认是在runtime下以日期命名

截图:

任务列表: 列表.png 创建: 创建.jpg 修改: 修改.png 运行日志: 执行日志.png 错误日志: 错误日志.png

说明:

  1. 添加yii控制台的脚本program直接写<控制器 方法="">,并且必须继承ConsoleBaseController这个类,如果执 行web端的脚本,program就得写完成的url,因为用的wget,且需继承WebBaseController这个类,不继承的 话无法判断任务是否执行成功。
  2. 用到了file_put_content,所以保证 nginx 或者 apache 用户有足够的权限,如果权限不足的话就在 /etc/sudoers 里添加:nginx ALL=(ALL) NOPASSWD:ALL(好像是这样写的,具体找度娘)
  3. runtime目录权限给够
  4. 允许访问的 IP 添加到 params 里,格式为 'TaskAllowedIPs' => [],
  5. 只能在 linux 机器上运行!!!

gitHub地址: https://github.com/huangdingbo/taskManager

发这篇文章的主要目的还是交流,学习,如果大家有跟好的想法和设计思路,请给我留言,让菜鸟成长一下,谢谢!

亿速云
您需要登录后才可以评论。登录 | 立即注册