php 操作linux Crontab ,设定定时任务

调用别人的类:https://github.com/MediovskiTechnology/php-crontab-manager.git

自己封装一个类,来实现新增,删除操作,

一模一样的任务,即时间,任务内容完全相同,那么返回的任务id是一样的,不过这个基本不会出现,同一个任务可以多次添加,但任务id是一样的

引入了2个文件,

CrontabManager.php
CronEntry.php
  1 <?php
  2     /*
  3         Filename: PhpCrontab.php
  4         Comment: php 控制linux crontab 命令
  5         User: lxd
  6         Time: 15/11/13 13:55
  7     */
  8 
  9     class PhpCrontab {
 10         private $_crontab_obj       = null;
 11 
 12 
 13         //构造 引入 是放在同一个目录里面的 
 14         public function __construct() {
 15             set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__);
 16             spl_autoload_register(function($class_name) {
 17                 //需要将引入的文件全部小写
 18                 spl_autoload($class_name,'.php');
 19             });
 20             $this->_crontab_obj    = new CrontabManager();
 21         }
 22 
 23 
 24         /*
 25          * 新增任务
 26          *  @param  id  任务唯一标示符,自己数据库的,方便自己后期处理
 27          *  @param time 任务执行时间
 28          *  @param job  任务具体内容
 29          *
 30          *  @return false | 任务自身的id标志
 31          */
 32         public function addJob($id,$time,$job) {
 33             //新增任务
 34             $job_obj            = $this->_crontab_obj->newJob();
 35             $job_obj->on($time)->addComments(array($id))->doJob($job);
 36             $this->_crontab_obj->add($job_obj);
 37             $this->_crontab_obj->save();
 38             $job_obj            = $time = null;
 39 
 40             //获取任务列表
 41             $job_arr            = $this->getJobList();
 42             //通过$id 找到任务的自身id
 43             foreach($job_arr as $k => $v) {
 44                 //正则匹配
 45                 $pattern        = '/#\s[\w]+(\s|$)/iU';
 46                 $match_info     = array();
 47                 $is_match       = preg_match_all($pattern,$v,$match_info);
 48                 if(!$is_match)
 49                     return false;
 50 
 51                 if(trim($match_info[0][0]) == '# ' . $id)
 52                     return str_replace("\n",'',$match_info[0][1]);
 53 
 54             }
 55 
 56             return false;
 57         }
 58 
 59 
 60         /*
 61          * 获取任务列表
 62          * @param   void
 63          * @return  array
 64          */
 65         public function getJobList() {
 66             //获取字符串任务列表
 67             $job_str        = $this->_crontab_obj->listJobs();
 68             //解析为数组,返回
 69             return explode("\n\n",$job_str);
 70         }
 71 
 72         /*
 73          * 清理一条任务
 74          * @param  任务自身的id
 75          * @return true | false
 76          */
 77         public function delJob($jobid) {
 78             //验证是否存在
 79             $is_exists      = $this->_crontab_obj->jobExists($jobid);
 80             if(!$is_exists)
 81                 return false;
 82 
 83             $is_exists      = null;
 84 
 85             $new_jobid      = str_replace('#','',$jobid);
 86             $new_jobid      = str_replace("\n",'',$new_jobid);
 87 
 88             $del_nums       = $this->_crontab_obj->deleteJob($new_jobid);
          $this->_crontab_obj->save(false);
89 $new_jobid = null; 90 if($del_nums) 91 return true; 92 return false; 93 } 94 95 96 97 /* 98 * 析构 99 */ 100 public function destruct() { 101 $this->_crontab_obj = null; 102 } 103 104 }

  

测试调用:

  

 1 require_once('PhpCrontab.php');
 2         $obj        = new PhpCrontab();
 3     
 4         //新增 参数 依次位 id 自己标志的任务id; time 时间; job 任务内容
 5         //$res        = $obj->addJob(1,'* * * * *','date >> /tmp/obj.log');
 6         //var_dump($res);
 7         
 8         //删除,$id 即新增返回的res的值
 9         $id         = '# sgzjiu';
10         $res        = $obj->delJob($id);
11         var_dump($res);

 crontabmanage 类,deleteJob 需要更新些内容

 1 function deleteJob($job = null) {
 2         $jobsDeleted = 0;
 3         if (!is_null($job)) {
 4             $data = array();
 5             $oldJobs = explode("\n", $this->listJobs()); // get the old jobs
 6 
 7             if (is_array($oldJobs)) {
 8                 //放置comment 信息
 9                 $_comment        = '';
10                 foreach ($oldJobs as $oldJob) {
11                     if ($oldJob != '') {
12                         //加入判断,匹配出comment信息
13                         if(preg_match_all('/^#(.*)/',$oldJob,$match_arr)) {
14                             $_comment       = $match_arr[0][0];
15                             continue;
16                         }
17 
18                         if (!preg_match('/' . $job . '/', $oldJob)) {
19                             $newJob = new CronEntry($oldJob, $this);
20                             $newJob->lineComment = '';
21                             //设置comment 信息
22                             $newJob->comments    = array($_comment);
23                             $_comment            = '';
24 
25                             $data[] = $newJob;
26                         } else {
27                             $jobsDeleted++;
28                         }
29                     }
30                 }
31             }
32             $this->jobs = $data;
33         }
34         return $jobsDeleted;
35     }

 

转载于:https://www.cnblogs.com/lxdd/p/4962420.html

为什么使用PHP管理crontab 一般在定时任务较少的情况下,使用原生的crontab服务一般不会有什么问题,但当定时任务较多时就会产生如下问题: 文本形式的定时任务可读性很差,在没有任何注释的情况下,新人很难在不读源码的情况下了解定时任务的业务逻辑 在分布式的场景中,定时任务会散落到多台机器上,无法统一管理 定时任务的日志不能集中化管理,对定时任务的运行分析及故障排除比较麻烦 基于以上几点原因,我们迫切的需要一个可以集中化管理的、可配置的定时任务管理器 但自己开发一套分布式的定时任务系统何其复杂,所以作者采用crontab服务做辅助,使用php实现对定时任务的配置管理 使用php管理定时任务有哪些优势 定时任务可以不再是以文本方式的形式存在,可以存储在缓冲、数据库中,甚至你可以开发管理功能,在后台对定时任务进行编辑 定时任务的日志是可配置的,你可以按照业务需求,对日志进行差异化配置 使用方式如下: 编写一个任务管理器,可参考test/simple.php 将上述脚本添加到crontab中,一分钟执行一次 示例: <?php $crontab_config = [  'test_1' => [  'name' => '服务监控1',  'cmd' => 'php -v',  'output' => '/tmp/test.log',  'time' => '* * * * *'  ],  'single_test' => [  'name' => 'php -i',  'cmd' => 'php -i',  'output' => '/tmp/single_script.log',  'time' => [  '* * * * *',  '* * * * *',  ],  ], ];  $crontab_server = new \Jenner\Zebra\Crontab\Crontab($crontab_config); $crontab_server->start(); 工具短小,但很精悍 在分布式场景中,你可以把定时任务写入数据库中进行统一管理,你可以设定哪些定时任务是由哪些机器执行, 然后通过生成文本文件的方式发送到所有机器上,再由这些机器上的phpCrontab读取处理;从而实现分布式场景下的定时任务统一管理。 标签:Zebra
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值