WorkerMan::Worker类解析(1)

    // 构造函数声明要创建的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;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值