配置文件详解

Viswoole 的配置文件存放在 config/ 目录下,支持多种文件格式。每个配置文件返回一个 PHP 数组,通过 config() 函数按文件名作为顶级键进行访问。

目录结构

text
config/
├── app.php                 # 应用基础配置
├── cache.php               # 缓存系统配置
├── database.php            # 数据库配置
├── log.php                 # 日志系统配置
├── listens.php             # 事件监听配置
├── router.php              # 路由配置
├── server.php              # Swoole 服务配置
├── lazy/                   # 延迟加载配置目录
│   ├── middleware.php       # 中间件懒加载配置
│   └── ...                  # 其他懒加载配置
└── route/
    └── route.php            # 路由定义文件

支持的文件格式

PHP 格式(推荐)

最常用且功能最完整的格式,支持表达式计算和条件逻辑:

php
<?php
// config/services.php (示例:演示 PHP 配置文件支持表达式与条件逻辑)

declare (strict_types=1);

return [
    // 支持表达式
    'version' => '1.0.' . date('Ymd'),

    // 支持条件配置
    'providers' => [
        // 根据环境动态加载
        ...(env('APP_ENV') === 'local'
            ? [\App\Providers\DevServiceProvider::class]
            : []
        ),
    ],
];

JSON 格式

适用于结构化数据配置:

json
{
  "name": "Viswoole",
  "menu": {
    "home": "/",
    "about": "/about",
    "contact": "/contact"
  }
}

YAML 格式

需要安装 yaml 扩展:

yaml
# config/services.yaml
database:
  host: localhost
  port: 3306
cache:
  driver: redis
  ttl: 3600

INI 格式

适合简单的键值对配置:

ini
; config/features.ini
[features]
registration = true
email_verification = false
oauth_login = true
rate_limiting = true

访问配置

config() 函数

全局辅助函数,用于读取配置(config() 仅支持读取,写入请使用 Config 门面):

php
// 读取配置
$value = config('app.debug');           // true / false
$timezone = config('app.default_timezone');  // 'Asia/Shanghai'

// 多级访问(点号分隔)
$host = config('database.channels.default.options.host');

// 带默认值
$port = config('database.channels.default.options.port', 3306);

// 获取整个文件的配置
$appConfig = config('app');            // 返回数组

// 获取全部配置
$all = config();

// 检查配置是否存在(需使用 Config 门面,config() 无参调用返回的是配置数组而非 Config 实例)
use Viswoole\Core\Facade\Config;
if (Config::has('app.debug')) { /* ... */ }
if (Config::has('cache.default')) { /* ... */ }

Config 门面

php
use Viswoole\Core\Facade\Config;

// 读取
Config::get('app.debug');
Config::get('nonexistent', 'default_value');

// 写入(仅当前进程有效,不写入文件)
Config::set('app.debug', true);
Config::set([
    'app.debug' => false,
    'app.default_timezone' => 'UTC',
]);

// 检查存在性
Config::has('app.debug');  // true
Config::has('missing.key'); // false

点号分隔的多级访问

php
// config/database.php(实际结构,使用 channels 键)
return [
    'default' => env('DATABASE_DEFAULT', 'default'),
    'channels' => [
        'default' => [
            'driver' => PDOChannel::class,
            'options' => [
                'host' => '127.0.0.1',
                'port' => 3306,
                'database' => 'viswoole',
                'username' => 'root',
                'password' => '',
            ],
        ],
    ],
];

// 访问方式
config('database.default');                                    // 'default'
config('database.channels.default.options.host');              // '127.0.0.1'
config('database.channels.default.options.port');              // 3306
config('database.channels.default.options.database');          // 'viswoole'

核心配置文件说明

app.php - 应用配置

php
<?php
// 系统配置

declare (strict_types=1);

use Viswoole\Core\Service\TaskService;

return [
  // 默认时区
  'default_timezone' => env('default_timezone', 'Asia/Shanghai'),
  // 是否开启调试模式
  'debug' => env('app_debug', true),
  // 服务提供者注册
  'services' => [
    // swoole异步任务管理服务 如果不使用可以删除
    TaskService::class
  ],
  // 命令处理程序注册
  'commands' => []
];

cache.php - 缓存配置

php
<?php
// 缓存配置

declare (strict_types=1);

use Viswoole\Cache\Facade\Cache;

return [
  // 默认通道
  'default' => env('cache.store', 'file'),
  // 通道列表
  'stores' => [
    // 驱动类需继承Viswoole\Cache\Driver,
    // 或实现Viswoole\Cache\Contract\CacheDriverInterface接口。
    // 内置了两种缓存驱动:File、Redis
    // 数组形式配置 'name'=>['diver'=>diver::class,'options'=>array] options为驱动类的构造参数列表
    // 字符串形式配置 'name' => diver::class
    // 实例形式配置 'name' => new Redis(env('REDIS_HOST', '127.0.0.1'))
    'file' => Cache::FILE_DRIVER
  ]
];

database.php - 数据库配置

php
<?php
// 数据库配置

declare (strict_types=1);

use Viswoole\Database\Channel\PDO\PDOChannel;
use Viswoole\Database\Facade\Db;

return [
  // 默认通道
  'default' => env('DATABASE_DEFAULT', 'default'),
  // 是否开启调试模式
  'debug' => env('app_debug', true),
  // 调试信息保存方式,1保存到控制台,2保存到日志文件,3保存到控制台和日志文件
  'info_save_manner' => Db::DEBUG_SAVE_CONSOLE | Db::DEBUG_SAVE_LOGGER,
  // 通道列表
  'channels' => [
    'default' => [
      // 驱动类,必须继承Viswoole\Database\Channel
      'driver' => PDOChannel::class,
      // PDOChannel通道构造参数
      'options' => [
        'host' => env('DATABASE_HOST', '127.0.0.1'),
        'port' => (int)env('DATABASE_PORT', 3306),
        'database' => env('DATABASE_NAME', ''),
        'username' => env('DATABASE_USER', 'root'),
        'password' => env('DATABASE_PASSWORD', '123456')
      ]
    ]
  ]
];

log.php - 日志配置

php
<?php
// 日志系统配置文件

declare (strict_types=1);

use Viswoole\Log\Drives\File;

return [
  // 默认通道
  'default' => 'file',
  // 类型指定写入通道,例如:['error'=>'email']
  'type_channel' => [],
  // 是否跟踪日志来源
  'trace_source' => true,
  // 是否同时将日志输出到控制台(只建议在开发环境中使用)
  'console' => false,
  // 日志驱动通道,可自行实现日志驱动需继承\Viswoole\Log\Drive类或实现\Viswoole\Log\Contract\DriveInterface接口
  'channels' => [
    'file' => File::class
  ]
];

server.php - Swoole 服务配置

php
<?php
// swoole服务配置文件

declare (strict_types=1);

use Swoole\Constant;
use Swoole\Http\Server as httpServer;
use Viswoole\HttpServer\Exception\HttpExceptionHandle;
use Viswoole\HttpServer\HttpEventHandle;

return [
  // 默认启动的服务
  'default_start_server' => env('default_start_server', 'http'),
  // 服务定义
  'servers' => [
    'http' => [
      // 服务类型
      'type' => httpServer::class,
      // 服务异常处理类
      'exception_handle' => HttpExceptionHandle::class,
      // 构造参数 参考https://wiki.swoole.com/#/server/methods?id=__construct
      'construct' => [
        // 指定监听的 ip 地址。
        'host' => '0,0,0,0',
        // 指定监听的端口
        'port' => 9501,
        // 运行模式
        'mode' => SWOOLE_PROCESS,
        // Server 的类型
        'sock_type' => SWOOLE_SOCK_TCP,
      ],
      'options' => [
        // 上传文件最大尺寸 单位kb
        Constant::OPTION_UPLOAD_MAX_FILESIZE => 5 * 1024,
        // 启用HTTP2协议解析
        Constant::OPTION_OPEN_HTTP2_PROTOCOL => true,
        // 如果需要ssl访问则需要配置 Constant::OPTION_SSL_CERT_FILE 和 Constant::OPTION_SSL_KEY_FILE
        // 进程守护运行
        Constant::OPTION_DAEMONIZE => false,
        // 任务进程数量 最大值不得超过 swoole_cpu_num() * 1000  0代表不开启
        Constant::OPTION_TASK_WORKER_NUM => swoole_cpu_num(),
        // 任务协程
        Constant::OPTION_TASK_ENABLE_COROUTINE => true
      ],
      'events' => [
        // HTTP请求处理
        Constant::EVENT_REQUEST => [HttpEventHandle::class, 'onRequest']
      ]
    ]
  ],
  // 全局配置
  'options' => [
    // 一键协程化Hook函数范围 参考https://wiki.swoole.com/#/server/setting?id=hook_flags
    Constant::OPTION_HOOK_FLAGS => SWOOLE_HOOK_ALL,
    // 是否启用异步风格服务器的协程支持
    Constant::OPTION_ENABLE_COROUTINE => true,
    // 最大协程数
    Constant::OPTION_MAX_CONCURRENCY => 100000,
    // 进程守护运行
    Constant::OPTION_DAEMONIZE => false,
    // 进程守护运行默认输出日志路径
    Constant::OPTION_LOG_FILE => BASE_PATH . '/runtime/sysLog.log',
    // 工作进程数量
    Constant::OPTION_WORKER_NUM => swoole_cpu_num(),
    // 任务进程数量 最大值不得超过 swoole_cpu_num() * 1000  0代表不开启
    Constant::OPTION_TASK_WORKER_NUM => 0,
    // 最大请求数 0为不限制
    Constant::OPTION_MAX_REQUEST => 100000,
    // 客户端连接的缓存区长度
    Constant::OPTION_SOCKET_BUFFER_SIZE => 2 * 1024 * 1024,
    // 发送输出缓冲区内存尺寸
    Constant::OPTION_BUFFER_OUTPUT_SIZE => 2 * 1024 * 1024,
    // 数据包最大尺寸 最小64k
    Constant::OPTION_PACKAGE_MAX_LENGTH => 2 * 1024 * 1024,
    // 日志输出等级
    Constant::OPTION_LOG_LEVEL => SWOOLE_LOG_WARNING
  ],
  // 全局EVENTS
  'events' => []
];

同名配置合并

当同一目录下存在同名但不同扩展名的配置文件时(如 config/app.phpconfig/app.json),框架会按解析顺序进行数组合并(后解析的覆盖先解析的):

php
// config/app.php
return ['name' => 'App', 'debug' => true];

// config/app.json
{"name": "Override", "version": "1.0"}

// 合并结果: ['name' => 'Override', 'debug' => true, 'version' => '1.0']

注意:框架的 Config 仅从项目 config/ 目录加载配置,不会自动加载 framework/config/ 下的文件。如需覆盖框架默认配置,请将配置文件复制到项目 config/ 目录下修改。

配置最佳实践

1. 敏感信息走环境变量

php
// ✅ 推荐
'password' => env('DATABASE_PASSWORD'),

// ❌ 避免
'password' => 'your_password_here';

2. 合理设置默认值

php
// ✅ 有意义的默认值
'timeout' => env('REQUEST_TIMEOUT', 30),

// ❌ 无默认值可能导致异常
'timeout' => env('REQUEST_TIMEOUT'),

3. 类型安全

php
// ✅ 显式类型转换
'debug' => (bool)env('APP_DEBUG', false),
'port' => (int)env('SERVER_PORT', 9501),
'max_retries' => (int)env('MAX_RETRIES', 3),

// ⚠️ 注意布尔值的自动转换
// env() 对 'true'/'false' 会自动转布尔
// 但 config() 不会做额外类型推断

4. 配置分组

php
// 按功能模块组织复杂配置
return [
    // HTTP 客户端配置
    'http_client' => [
        'base_uri' => env('API_BASE_URL'),
        'timeout' => 10,
        'retry' => 3,
    ],

    // 第三方服务配置
    'services' => [
        'sms' => [
            'provider' => env('SMS_PROVIDER'),
            'access_key' => env('SMS_ACCESS_KEY'),
        ],
        'oss' => [
            'bucket' => env('OSS_BUCKET'),
            'endpoint' => env('OSS_ENDPOINT'),
        ],
    ],
];