// 构造函数声明要创建的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;
}
}
WorkerMan::Worker类解析(1)
最新推荐文章于 2024-08-15 09:20:38 发布