美文网首页
linux命令行下执行php脚本笔记!

linux命令行下执行php脚本笔记!

作者: DragonersLi | 来源:发表于2021-12-24 17:15 被阅读0次

    通过命令行执行php脚本php ./watch.php start|stop|reload

    [root@xxx]# php ./watch.php start #开启
    ----------------start-------------------
    queue_balance.php 已运行,pid:29862
    ----------------start-------------------
    [root@xxx]# php ./watch.php stop #停止
    ----------------stop-------------------
    queue_balance.php 进程已停止
    ----------------stop-------------------
    [root@xxx]# php ./watch.php reload #重载
    #################reload#################
    ----------------stop-------------------
    queue_balance.php 进程已停止
    ----------------stop-------------------
    ----------------start-------------------
    queue_balance.php 进程本次运行,pid:30275
    ----------------start-------------------
    #################reload#################
    
    #开启状态
    [root@xxx]# ps -ef|grep queue_balance.php
    root     30275     1  0 17:02 pts/1    00:00:00 /www/server/php/74/bin/php ./queue_balance.php
    root     30987 23928  0 17:10 pts/1    00:00:00 grep --color=auto queue_balance.php
    [root@xxx]# ps -ef|grep queue_balance.php|grep -v grep
    root     30275     1  0 17:02 pts/1    00:00:00 /www/server/php/74/bin/php ./queue_balance.php
    
    #关闭状态
    [root@xxx]# ps -ef|grep queue_balance.php
    root     31172 23928  0 17:12 pts/1    00:00:00 grep --color=auto queue_balance.php
    [root@xxx]# ps -ef|grep queue_balance.php|grep -v grep
    [root@xxx]#
    
    #查看日志
    [root@xxx]# tail -f ./watch.txt 
    2021-12-24 17:02:21-开启进程:queue_balance.php
    
    2021-12-24 17:02:21-0
    
    2021-12-24 17:02:22-1
    
    2021-12-24 17:02:24-2
    
    ...
    

    watch.php代码:配置调试模式是否开启,记录日志;设置php路径;日志文件路径;脚本路径等

    <?php
    
    
    class watch{
    
    
        private $debug = false;
        private $php = '/www/server/php/74/bin/php';
        private $log_file = './watch.txt';
        private $queue_arr = [
            'queue_balance.php',
        ];
    
    
        public function __construct($argv){
            $this->params=$argv;
        }
    
        public function index(){
            $disable_functions=ini_get('disable_functions');
            if($disable_functions){
                $dis_funs=explode(',',$disable_functions);
                if(in_array('exec',$dis_funs)){
                    exit("请修改php.ini配置文件里面的disable_functions项,允许exec函数执行!\n");
                }
            }
    
            if($this->params[1]=='start'){
                $this->start();
            }elseif($this->params[1]=='stop'){
                $this->stop();
            }elseif($this->params[1]=='reload'){
                $this->reload();
            }else{
                exit("允许命令: php ./watch.php start|stop|reload\n");
            }
    
        }
        //开始
        private function start(){
    
            echo "----------------start-------------------\n";
            foreach($this->queue_arr as $qv){
                $pid=$this->getRunningPid($qv);
                if(!$pid){
                    $res=$this->exec_php($qv);
                    if(!$res){
                        echo $res."\n";
                    }else{
                        $pid=$this->getRunningPid($qv);
                        echo "{$qv} 进程本次运行,pid:{$pid}\n";
                    }
                }else{
                    echo "{$qv} 已运行,pid:{$pid}\n";
                }
            }
            echo "----------------start-------------------\n";
        }
    
    //停止
    private function stop(){
    
            echo "----------------stop-------------------\n";
            foreach($this->queue_arr as $qv){
                $pid=$this->getRunningPid($qv);
                if(!$pid){
                    echo "{$qv} 进程已停止\n";
                }else{
                    $this->kill_php($qv);
                    $pid=$this->getRunningPid($qv);
                    if($pid){
                        echo "{$qv} 进程关闭失败\n";
                    }else{
                        echo "{$qv} 进程已停止\n";
                    }
                }
            }
            echo "----------------stop-------------------\n";
        }
    
        //重载
        private function reload(){
            echo "#################reload#################\n";
            $this->stop();
            $this->start();
            echo "#################reload#################\n";
        }
    
        //获取正在执行文件的程序id
        private function getRunningPid($fileName){
            if(!$fileName){
                return false;
            }
            exec("ps -ef|grep '{$fileName}'|grep -v 'grep'",$result);
            if(!$result[0]){
                return false;
            }
            $result_str=preg_replace("/\s(?=\s)/","\\1",$result[0]);
            if(!$result_str){
                return false;
            }
            $resultArr=explode(' ',$result_str);
            return  intval($resultArr[1]);
        }
    
        //执行php
        private function exec_php($fileName){
            $file='./'.$fileName;
            if(!file_exists($file)){
                return "不存在文件:{$file}";
            }
            $log_file = $this->debug ? $this->log_file : '/dev/null';
    
            exec("{$this->php} {$file} >>{$log_file} &",$result,$resultInt);
            file_put_contents('./watch.txt',date('Y-m-d H:i:s')."-开启进程:{$fileName}\n\n",FILE_APPEND);
            return true;
        }
    
        //结束运行
        private function kill_php($fileName){
           $log_file = $this->debug ? $this->log_file : '/dev/null';
           exec("kill {$this->getRunningPid($fileName)} >>{$log_file}");
           file_put_contents('./watch.txt',date('Y-m-d H:i:s')."-结束进程:{$fileName}\n\n",FILE_APPEND);
       }
    
    
    }
    
    
    exit((new watch($argv))->index());
    
    

    queue_balance.php测试代码:

    for($i=0;$i<100;$i++){
        sleep($i);
        file_put_contents('./watch.txt',date('Y-m-d H:i:s')."-$i\n\n",FILE_APPEND);
    }
    

    相关文章

      网友评论

          本文标题:linux命令行下执行php脚本笔记!

          本文链接:https://www.haomeiwen.com/subject/ymvarxtx.html