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     }