袁来如此的工作笔记
袁来如此的工作笔记
竹杖芒鞋轻胜马,谁怕? 一蓑烟雨任平生。

php操作linux Crontab设定定时任务

浏览量:147

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


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

一模一样的任务,即时间,任务内容完全相同,那么返回的任务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);
打赏