WorkerMan::Worker类解析(1)

来源:互联网 发布:mac dare you试色全脸 编辑:程序博客网 时间:2024/06/05 01:10
    // 构造函数声明要创建的worker.    public function __construct($socket_name = '', $context_option = array())    {        // 生成对象的唯一id.        $this->workerId                  = spl_object_hash($this);        // 保存对象实例.        self::$_workers[$this->workerId] = $this;        self::$_pidMap[$this->workerId]  = array();        // 获取自动加载根目录.        $backtrace                = debug_backtrace();        $this->_autoloadRootPath = dirname($backtrace[0]['file']);        // Context for socket.        if ($socket_name) {            $this->_socketName = $socket_name;            if (!isset($context_option['socket']['backlog'])) {                // 设置socket server最大链接数.                $context_option['socket']['backlog'] = self::DEFAULT_BACKLOG;            }            // 创建资源上下文.            $this->_context = stream_context_create($context_option);        }    }    // 全局启动Worker.    public static function runAll()    {        // 检查运行环境(需要在命令行下运行).        self::checkSapiEnv();        // 初始化        self::init();        // 解析命令.        self::parseCommand();        // 将主进程变为守护进程.        self::daemonize();        // 初始化worker的server.        self::initWorkers();        // 安装信号处理.        self::installSignal();        // 保存主进程id.        self::saveMasterPid();        // 打印worker的主要信息.        self::displayUI();        // 创建每个worker对应的进程数量.        self::forkWorkers();        // 重置输入输出.        self::resetStd();        // 主进程监控各个worker的状态.        self::monitorWorkers();    }    // 初始化部分数据.    protected static function init()    {        // Start file.        $backtrace        = debug_backtrace();        // 获取入口文件.        self::$_startFile = $backtrace[count($backtrace) - 1]['file'];        // 生成一个唯一的前缀.        $unique_prefix = str_replace('/', '_', self::$_startFile);        // 生成存放主进程id的文件名.        if (empty(self::$pidFile)) {            self::$pidFile = __DIR__ . "/../$unique_prefix.pid";        }        // 生成日志文件名.        if (empty(self::$logFile)) {            self::$logFile = __DIR__ . '/../workerman.log';        }        $log_file = (string)self::$logFile;        if (!is_file($log_file)) {            touch($log_file);            // 修改日志文件权限.            chmod($log_file, 0622);        }        // 把状态标记为开始.        self::$_status = self::STATUS_STARTING;        // 统计信息相关参数..        self::$_globalStatistics['start_timestamp'] = time();        // sys_get_temp_dir() 将统计的状态文件放在临时文件夹中.        self::$_statisticsFile                      = sys_get_temp_dir() . "/$unique_prefix.status";        // 设置进程的标题.        self::setProcessTitle('WorkerMan: master process  start_file=' . self::$_startFile);        // 给每一个worker服务的分配id.        self::initId();        // 定时器初始化(详情见Timer分析).        Timer::init();    }    // 设置进程的标题.    protected static function setProcessTitle($title)    {        // >=php 5.5        if (function_exists('cli_set_process_title')) {            // 设置当前进程的标题.            @cli_set_process_title($title);        } // Need proctitle when php<=5.5 .        elseif (extension_loaded('proctitle') && function_exists('setproctitle')) {            // 通过扩展函数,设置当前进程标题.            @setproctitle($title);        }    }    // 给每一个worker服务的分配id.    protected static function initId()    {        foreach (self::$_workers as $worker_id => $worker) {            $new_id_map = array();            for($key = 0; $key < $worker->count; $key++) {                // 每个id都是初始化0,后续forkOneWorker是根据array_search()查找进行赋值的.                $new_id_map[$key] = isset(self::$_idMap[$worker_id][$key]) ? self::$_idMap[$worker_id][$key] : 0;            }            self::$_idMap[$worker_id] = $new_id_map;        }    }
原创粉丝点击