ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] * * * * * ## 1 源代码 ~~~ Worker.php public function __construct($socket_name = '', $context_option = array()) { // Save all worker instances. $this->workerId = spl_object_hash($this); self::$_workers[$this->workerId] = $this; self::$_pidMap[$this->workerId] = array(); // Get autoload root path. $backrace = debug_backtrace(); $this->_autoloadRootPath = dirname($backrace[0]['file']); // Context for socket. if ($socket_name) { $this->_socketName = $socket_name; if (!isset($context_option['socket']['backlog'])) { $context_option['socket']['backlog'] = self::DEFAUL_BACKLOG; } $this->_context = stream_context_create($context_option); } // Set an empty onMessage callback. $this->onMessage = function () { }; } ~~~ ## 2 分析 ### 1 函数接口 `__construct($socket_name = '', $context_option = array())` > $socket_name: <协议>://<监听地址>类参数 > $context_option: socket的上下文选项 * * * * * >> <协议> 可以为以下格式: > tcp: 例如 tcp://0.0.0.0:8686 > udp: 例如 udp://0.0.0.0:8686 > unix: 例如 unix:///tmp/my_file (需要Workerman>=3.2.7) > http: 例如 http://0.0.0.0:80 > websocket: 例如 websocket://0.0.0.0:8686 > text: 例如 text://0.0.0.0:8686 * * * * * >> <监听地址> 可以为以下格式: > 如果是unix套接字,地址为本地一个磁盘路径 > 非unix套接字,地址格式为 <本机ip>:<端口号> > <本机ip>可以为0.0.0.0表示监听本机所有网卡,包括内网ip和外网ip及本地回环127.0.0.1 > <本机ip>如果以为127.0.0.1表示监听本地回环,只能本机访问,外部无法访问 > <本机ip>如果为内网ip,类似192.168.xx.xx,表示只监听内网ip,则外网用户无法访问 > <本机ip>设置的值不属于本机ip则无法执行监听,并且提示Cannot assign requested address错误 > 注意:<端口号>不能大于65535。<端口号>如果小于1024则需要root权限才能监听。监听的端口必须是本机未被占用的端口,否则无法监听,并且提示Address already in use错误 * * * * * > $context_option: 套接字选项见 基础原理 socket上下文选项呢 ### 2 函数分析 ~~~ $this->workerId = spl_object_hash($this); self::$_workers[$this->workerId] = $this; self::$_pidMap[$this->workerId] = array(); ~~~ 1 分配workeId 设置workerId。spl_object_hash()函数获取对象的hash值。 spl_object_hash()见 基础原理 基础函数 注册workerId到$_workers和$_pidMap ~~~ $backrace = debug_backtrace(); $this->_autoloadRootPath = dirname($backrace[0]['file']); ~~~ 2 设置自动加载根目录 debug_backtrace() 见 基础函数 dirname()返回文件目录信息 见 基础函数 ~~~ if ($socket_name) { $this->_socketName = $socket_name; if (!isset($context_option['socket']['backlog'])) { $context_option['socket']['backlog'] = self::DEFAUL_BACKLOG; } $this->_context = stream_context_create($context_option); } ~~~ 3 设置socket上下文。 设置_socketName 检查socket的backlog选项,见 socket上下文选项 最后调用straem_context_create() 创建资源流上下文 stream_context_create() 见 socket上下文选项 ~~~ $this->onMessage = function () { }; ~~~ 4 注册默认的onMessage接口函数 `$worker->count = 8;` 5 设置启动进程数 ## 3 总结 构造函数完成worker的基础属性设置 >[info] 1 workerId分配 >[info] 2 加载根目录 >[info] 3 socket上下文选项 >[info] 4 注册OnMessage回调接口 >[info] 5 设置启动进程数