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

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

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

思路:

  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

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

  • 评论于 2019-04-26 17:13 举报

    这个是模仿XXL-JOB吧

    1 条回复
    评论于 2019-04-28 16:37 回复

    我还不知道有这个东西,刚看了一下,是好东西啊 哈哈

  • 评论于 2020-03-19 16:49 举报

    致作者
    frontend\controllers的
    命名空间是namespace backend\controllers
    目录却是frontend,且继承的是extends BackendController,应该跑不起来吧

  • 评论于 2020-03-19 17:03 举报

    另 frontend\views\task\index.php
    应用 use \backend\models\TaskToolModel;
    如下:

    use yii\bootstrap\Modal;
    use yii\helpers\Html;
    use yii\grid\GridView;
    use yii\helpers\Url;
    use \backend\models\TaskToolModel;
    
    

    没有跟踪到 backend\models\TaskToolModel

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