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; } }
阅读全文
0 0
- WorkerMan::Worker类解析(1)
- WorkerMan::Worker类解析(2)
- WorkerMan::Worker类解析(3)
- WorkerMan::Worker类解析(4)
- WorkerMan::Timer解析
- Workerman Day 1 - Autoloader
- Workerman
- Workerman
- workerman
- Workerman
- Spark Worker原理解析
- Worker::setProcessTitle()解析
- Worker::initId()解析
- Workerman WebSocket错误总结1
- C语言实现类workerman的功能
- Worker
- spark worker的原理和源码解析
- workerman 定时器
- 微信第三方网页关闭当前页面回到微信对话窗口
- Tensorflow深度学习之五:激活函数
- Spring事务传播特性实例解析
- Gym 101482.F
- Session简介丶特性
- WorkerMan::Worker类解析(1)
- latex 编辑文档遇到的问题
- 算法:巴什(Bash)博弈与斐波那契博弈
- T立方云工作平台正式上线 十项全能助力简单工作
- JAVA循环语句
- 洛谷1967 货车运输 NOIP2013
- C#中向DataGridView中添加DataTable数据
- 列表数据处理
- c# 连接oracle简单示例