zoukankan      html  css  js  c++  java
  • 分析入口文件main.php

    在分析之前,需要了解php cli模式下的编程

    1.了解getopt函数,php手册地址:http://php.net/manual/zh/function.getopt.php

          static private $help = <<<EOF
    
      帮助信息:
      Usage: /path/to/php main.php [options] -- [args...]
    
      -h [--help]        显示帮助信息
      -p [--pid]         指定pid文件位置(默认pid文件保存在当前目录)
      -s start           启动进程
      -s stop            停止进程
      -s restart         重启进程
      -l [--log]         log文件夹的位置
      -c [--config]      config文件的位置
      -d [--daemon]      是否后台运行
      -r [--reload]      重新载入配置文件
      -m [--monitor]     监控进程是否在运行,如果在运行则不管,未运行则启动进程
      --worker           开启worker
      --tasktype         task任务获取类型,[file|mysql] 默认是file
      --checktime        默认精确对时(如果精确对时,程序则会延时到分钟开始0秒启动) 值为false则不精确对时
    
    EOF;
        /**
         * 运行入口
         */
        static public function run()
        {
            $opt = getopt(self::$options, self::$longopts);
            self::spl_autoload_register();
            self::params_h($opt);
            self::params_d($opt);
            self::params_p($opt);
            self::params_l($opt);
            self::params_c($opt);
            self::params_r($opt);
            self::params_worker($opt);
            self::params_tasktype($opt);
            self::params_checktime($opt);
            $opt = self::params_m($opt);
            self::params_s($opt);
        }
    

      如上,main.php 可以支持长短选项,以及接收参数

    短选项是options 。该字符串中的每个字符会被当做选项字符,匹配传入脚本的选项以单个连字符(-)开头。 比如,一个选项字符串 "x" 识别了一个选项 -x。 只允许 a-z、A-Z 和 0-9。

    长选项是longopts。此数组中的每个元素会被作为选项字符串,匹配了以两个连字符(--)传入到脚本的选项。 例如,长选项元素 "opt" 识别了一个选项 --opt

    这里有一个条件非常重要

    • 单独的字符(不接受值)
    • 后面跟随冒号的字符(此选项需要值)
    • 后面跟随两个冒号的字符(此选项的值可选)

    比如,我们试试看这个main.php -h 和 -s start 这里h是不带值的,s是可以带值的

    <?php
    $options = 's:h';
    $xx = getopt($options);
    var_dump($xx);

    E:FMS runkswoolestudy_swoole>php test.php -h

    输出:

    E:FMS runkswoolestudy_swoole est.php:4:
    array(1) {
    'h' =>
    bool(false)
    }

    E:FMS runkswoolestudy_swoole>php test.php -s reload

    输出:
    E:FMS runkswoolestudy_swoole est.php:4:
    array(1) {
    's' =>
    string(6) "reload"
    }

    了解了,cli怎么获取参数,我们再去看下main.php 的run方法到底在执行什么逻辑

    45行:self::spl_autoload_register();自己添加了自己支持的自动引入

    46行:self::params_h($opt); 返回帮助信息,并且会直接die退出

    [root@localhost crontab]# php main.php -h
    
      帮助信息:
      Usage: /path/to/php main.php [options] -- [args...]
    
      -h [--help]        显示帮助信息
      -p [--pid]         指定pid文件位置(默认pid文件保存在当前目录)
      -s start           启动进程
      -s stop            停止进程
      -s restart         重启进程
      -l [--log]         log文件夹的位置
      -c [--config]      config文件的位置
      -d [--daemon]      是否后台运行
      -r [--reload]      重新载入配置文件
      -m [--monitor]     监控进程是否在运行,如果在运行则不管,未运行则启动进程
      --worker           开启worker
      --tasktype         task任务获取类型,[file|mysql] 默认是file
      --checktime        默认精确对时(如果精确对时,程序则会延时到分钟开始0秒启动) 值为false则不精确对时
    

    47行:self::params_d($opt);//设置常量,Crontab::$daemon = true; 设置为守护进程

    48行:self::params_p($opt);//设置pid文件的位置 ,如果-p不接入参数会默认保存在当前目录

            if (empty(Crontab::$pid_file)) {
                Crontab::$pid_file = ROOT_PATH . "/pid";
            }    
    

    49行:self::params_l($opt);//设置日志文件放置位置,如果-l不写参数会默认保存在当前目录的logs文件夹

    50行:self::params_c($opt);//设置config配置参数这里的配置参数太过于复杂,我也不认为有人会想输入这个参数,这里默认值是根目录下的config/crontab.php中

    <?php
    return array(
        'taskid1' =>
            array(
                'taskname' => 'php -i',  //任务名称
                'rule' => '* * * * * *',//定时规则
                "unique" => 1, //排他数量,如果已经有这么多任务在执行,即使到了下一次执行时间,也不执行
                'execute'  => 'Cmd',//命令处理类
                'args' =>
                    array(
                        'cmd'    => 'php -i',//命令
                        'ext' => '',//附加属性
                    ),
            ),
        'taskid2' =>
            array(
                'taskname' => 'test',  //任务名称
                'rule' => array("09:30","14:12:58","22:30:36","22:24:36"),
                "unique" => 1, //排他数量,如果已经有这么多任务在执行,即使到了下一次执行时间,也不执行
                "execute" =>"Gather",
                'args' =>
                    array(
                        'cmd'    => 'gather',//命令
                        'ext' => '',//附加属性
                    ),
            ),
    );  

     这里是配置任务的相关参数,注意这里有几个需要注意的,execute是需要执行的命令,unique排他数量,rule是规则

     行51:self::params_r($opt);

     这里会重新载入配置文件,会判断之前的pid文件是否存在,如果存在就会执行kill

      swoole_process::kill($pid, 0)这句话是指的 $signo=0,可以检测进程是否存在,不会发送信号(swoole文档里面有说明,附传送门:https://wiki.swoole.com/wiki/page/219.html)

      发送SIGUSR1命令 ,但是我再后面的测试过程中发现,这个指令并没有什么用,不即时

    static public function params_r($opt)
        {
            if (isset($opt["r"]) || isset($opt["reload"])) {
                $pid = @file_get_contents(Crontab::$pid_file);
                if ($pid) {
                    if (swoole_process::kill($pid, 0)) {
                        swoole_process::kill($pid, SIGUSR1);
                        Main::log_write("对 {$pid} 发送了从新载入配置文件的信号");
                        exit;
                    }
                }
                Main::log_write("进程" . $pid . "不存在");
            }
        }  

    行52:self::params_worker($opt);Crontab::$worker = true;具体功能:设置开启工作进程,解释是:工厂要生成很多商品,将不同的商品流水线交给不同的工人进行生产处理

    行53:self::params_tasktype($opt);//task任务获取类型,[file|mysql] 默认是file 这里其实看源码最起码从main.php是看不到此类限制,但是在include/loadtask/LoadTasks.class.php里面的构造方法里面有这种判断

    行54:self::params_checktime($opt);//Crontab::$checktime = false; 

    行55:$opt = self::params_m($opt);//源码里面很清楚,检测进程是否存在,如果存在则重新设置参数数组,标示重启执行-s restart

    行56:self::params_s($opt);//这里是核心方法,下节开始分析

  • 相关阅读:
    Linux:less 命令
    Linux:more命令
    图解linux安装tomcat(附常用命令)
    Linux下安装tomcat
    Linux数字权限解释
    Tomcat配置远程调试
    CentOS 设置静态IP 方法
    oracle procedure存储过程
    【转】vector中erase()的使用注意事项
    strstr()函数的使用
  • 原文地址:https://www.cnblogs.com/gavinjunftd/p/8079099.html
Copyright © 2011-2022 走看看