配置文件详解
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: 3600INI 格式
适合简单的键值对配置:
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.php 和 config/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'),
],
],
];