# 4.6 配置
配置是框架的重要组成部分,MSF框架的配置组件采用了第三方的[hassankhan/config](https://github.com/hassankhan/config),它支持多种配置书写的文件格式如:PHP,INI,XML,JSON,YAML,可以满足大部分的配置需求。但是建议采用PHP数组文件来配置我们的服务。
## PHP配置数组文件
配置采用PHP数组的形式进行书写,每个配置文件的最后一行都需要返回,即`return $config`,如:
```php
/**
* MongoDb配置文件
*
* @author camera360_server@camera360.com
* @copyright Chengdu pinguo Technology Co.,Ltd.
*/
$config['mongodb']['test']['server'] = 'mongodb://192.168.1.106:27017';
$config['mongodb']['test']['options'] = ['connect' => true];
$config['mongodb']['test']['driverOptions'] = [];
return $config;
````
## 配置目录
在应用程序的主目录中有`config`目录,是用来存放所有配置文件,配置目录的参考结构:
```
├── config // 配置目录
│ ├── check.php // 代码检查配置
│ ├── server.php // 主配置文件(server服务相关)
│ ├── constant.php // 业务常量定义文件
│ ├── log.php // 全局日志配置
│ ├── http.php // HTTP服务配置
│ ├── params.php // 全局业务配置(和运行环境无关)
│ ├── dev // 研发联调环境特殊配置目录
│ ├── docker // docker环境特殊配置目录
│ ├── product // 生产环境特殊配置目录
│ ├── qa // QA环境特殊配置目录
```
对于各个环境的差异配置,单独存在在不同的目录中,如:
`config/docker` 存放Docker环境配置
`config/dev` 存放研发联调环境配置
`config/qa` 存放QA环境配置
`product` 存放生产环境配置
## 主配置文件
是配置服务实例的大部分配置,包括Http Server的参数配置,服务器进程pid文件目录,服务进程名称,服务器worker、Task、reactor数量等等。
### 主配置重要选项说明
#### $config['server']
- $config['server']['process_title']
server服务进程标题前缀
- $config['server']['runtime_path']
server服务运行时目录
- $config['server']['pid_path']
server服务运行时pid目录
- $config['server']['route_tool']
server服务路由分发请求的类名,首先查找app\Route目录,再查到php-msf\src\Route目录,默认为`NormalRoute`
#### $config['server']['set']
- $config['server']['set']['reactor_num']
swoole server的reactor数量,更多请参考[reactor_num](https://wiki.swoole.com/wiki/page/281.html)
- $config['server']['set']['worker_num']
swoole server的worker数量,更多请参考[worker_num](https://wiki.swoole.com/wiki/page/275.html)
- $config['server']['set']['backlog']
swoole server的backlog队列长度,更多请参考[backlog](https://wiki.swoole.com/wiki/page/279.html)
- $config['server']['set']['dispatch_mode']
swoole server的数据包分发策略,对于http服务器推荐设置为1,更多请参考[dispatch_mode](https://wiki.swoole.com/wiki/page/277.html)
- $config['server']['set']['task_worker_num']
swoole server的task worker数量,更多请参考[task_worker_num](https://wiki.swoole.com/wiki/page/276.html)
swoole server的其他配置项,具体参考:[配置选项](https://wiki.swoole.com/wiki/page/274.html)
#### $config['config_manage_enable']
是否启动配置进程,设置为true或者false
#### $config['auto_reload_enable']
是否开启自动检测文件更新,并重启服务,在开发环境建议设置为true,生产环境设置为false
#### $config['user_timer_enable']
是否开启自定义业务Timer进程,为业务需求而定,主要用于一些定时业务,设置为true或者false
#### $config['http_server']
Http服务器相关配置,主要有以下几个重要子配置项
- $config['http_server']['port']
Http服务器监听的端口
- $config['http_server']['socket']
Http服务器监听的地址
#### $config['http']
- $config['http']['domain']
使用Http服务器时,绑定的域名列表
- $config['http']['domain']['localhost']
使用Http服务器时,绑定一个localhost的域名
- $config['http']['domain']['localhost']['root']
使用Http服务器时,绑定了一个localhost的域名,并且域名对应的根目录为此配置项的值,需要特别注意的是,一旦配置了root,那该目录下所有文件就可以被用户访问到
- $config['http']['domain']['localhost']['index']
使用Http服务器时,绑定了一个localhost的域名,并且域名对应的索引文件此配置项的值
- $config['http']['default_method']
使用Http服务器时,Controller的默认方法名,在路由请求时使用
## 日志配置
```php
/**
* 日志配置文件
*
* @author camera360_server@camera360.com
* @copyright Chengdu pinguo Technology Co.,Ltd.
*/
$config['server']['log'] = [
'handlers' => [
'application' => [
'levelList' => [
\PG\Log\PGLog::EMERGENCY,
\PG\Log\PGLog::ALERT,
\PG\Log\PGLog::CRITICAL,
\PG\Log\PGLog::ERROR,
\PG\Log\PGLog::WARNING
],
'dateFormat' => "Y/m/d H:i:s",
'format' => "%datetime% [%level_name%] [%channel%] [logid:%logId%] %message%\n",
'stream' => RUNTIME_DIR . '/application.log',
'buffer' => 0,
],
'notice' => [
'levelList' => [
\PG\Log\PGLog::NOTICE,
\PG\Log\PGLog::INFO,
\PG\Log\PGLog::DEBUG
],
'dateFormat' => "Y/m/d H:i:s",
'format' => "%datetime% [%level_name%] [%channel%] [logid:%logId%] %message%\n",
'stream' => RUNTIME_DIR . '/notice.log',
'buffer' => 0,
]
]
];
return $config;
```
更新配置示例请参考示例项目[php-msf-demo/config](https://github.com/pinguo/php-msf-demo/blob/master/config/log.php)
## 使用配置
在任何地方都可以通过`getInstance()->config`来访问读取配置,另外在继承`\PG\MSF\Base\Core`类的子类(比如Controller/Model等等)都可以通过`$this->getConfig()`来获取配置对象,访问配置项的代码如:
[php-msf/config/params.php](https://github.com/pinguo/php-msf/pinguo/config/params.php)
```php
/**
* 业务参数
*
* @author camera360_server@camera360.com
* @copyright Chengdu pinguo Technology Co.,Ltd.
*/
$config['params']['mock_ids'] = [
'581af00d4b58d59d22e8d7a6',
'581198754b58d54465ef4cad',
'580c7fa44b58d53f43e21c43',
'57ef6aec4b58d50d24e21a2a',
'57ee28ed4b58d52f24e21969',
'57eb6a484b58d50e3d078076',
'57e23b444b58d52f1e6689fc',
'57dfc9fc4b58d5581e668918',
'57de06b74b58d5471e66882f',
'57d8b78f4b58d5311e6686d5',
];
return $config;
```
```php
getInstance()->config->get('params.mock_ids', [])
```
get()方法的第一个参数为key名称,对于多维数组的配置,采用点分隔;第二个参数为配置选项默认值,即没有读取到配置时的默认配置。