[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 设置启动进程数