php操作linux Crontab设定定时任务
浏览量:147
自己封装一个类,来实现新增,删除操作,
一模一样的任务,即时间,任务内容完全相同,那么返回的任务id是一样的,不过这个基本不会出现,同一个任务可以多次添加,但任务id是一样的
引入了2个文件,
CrontabManager.php
CronEntry.php
PhpCrontab.php
/*
Filename: PhpCrontab.php
Comment: php 控制linux crontab 命令
*/
class PhpCrontab {
private $_crontab_obj = null;
//构造 引入 是放在同一个目录里面的
public function __construct() {
set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__);
spl_autoload_register(function($class_name) {
//需要将引入的文件全部小写
spl_autoload($class_name,'.php');
});
$this->_crontab_obj = new CrontabManager();
}
/*
* 新增任务
* @param id 任务唯一标示符,自己数据库的,方便自己后期处理
* @param time 任务执行时间
* @param job 任务具体内容
*
* @return false | 任务自身的id标志
*/
public function addJob($id,$time,$job) {
//新增任务
$job_obj = $this->_crontab_obj->newJob();
$job_obj->on($time)->addComments(array($id))->doJob($job);
$this->_crontab_obj->add($job_obj);
$this->_crontab_obj->save();
$job_obj = $time = null;
//获取任务列表
$job_arr = $this->getJobList();
//通过$id 找到任务的自身id
foreach($job_arr as $k => $v) {
//正则匹配
$pattern = '/#\s[\w]+(\s|$)/iU';
$match_info = array();
$is_match = preg_match_all($pattern,$v,$match_info);
if(!$is_match)
return false;
if(trim($match_info[0][0]) == '# ' . $id)
return str_replace("\n",'',$match_info[0][1]);
}
return false;
}
/*
* 获取任务列表
* @param void
* @return array
*/
public function getJobList() {
//获取字符串任务列表
$job_str = $this->_crontab_obj->listJobs();
//解析为数组,返回
return explode("\n\n",$job_str);
}
/*
* 清理一条任务
* @param 任务自身的id
* @return true | false
*/
public function delJob($jobid) {
//验证是否存在
$is_exists = $this->_crontab_obj->jobExists($jobid);
if(!$is_exists)
return false;
$is_exists = null;
$new_jobid = str_replace('#','',$jobid);
$new_jobid = str_replace("\n",'',$new_jobid);
$del_nums = $this->_crontab_obj->deleteJob($new_jobid); $this->_crontab_obj->save(false);
$new_jobid = null;
if($del_nums)
return true;
return false;
}
/*
* 析构
*/
public function destruct() {
$this->_crontab_obj = null;
}
}
crontabmanage 类,deleteJob 需要更新些内容
function deleteJob($job = null) {
$jobsDeleted = 0;
if (!is_null($job)) {
$data = array();
$oldJobs = explode("\n", $this->listJobs()); // get the old jobs
if (is_array($oldJobs)) {
//放置comment 信息
$_comment = '';
foreach ($oldJobs as $oldJob) {
if ($oldJob != '') {
//加入判断,匹配出comment信息
if(preg_match_all('/^#(.*)/',$oldJob,$match_arr)) {
$_comment = $match_arr[0][0];
continue;
}
if (!preg_match('/' . $job . '/', $oldJob)) {
$newJob = new CronEntry($oldJob, $this);
$newJob->lineComment = '';
//设置comment 信息
$newJob->comments = array($_comment);
$_comment = '';
$data[] = $newJob;
} else {
$jobsDeleted++;
}
}
}
}
$this->jobs = $data;
}
return $jobsDeleted;
}
测试调用:
require_once('PhpCrontab.php');
$obj = new PhpCrontab();
//新增 参数 依次位 id 自己标志的任务id; time 时间; job 任务内容
//$res = $obj->addJob(1,'* * * * *','date >> /tmp/obj.log');
//var_dump($res);
//删除,$id 即新增返回的res的值
$id = '# sgzjiu';
$res = $obj->delJob($id);
var_dump($res);


感谢支持与鼓励~