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 }