阅读时间:1 分钟
0 字
配置文件
DuxLite 使用 TOML 格式的配置文件,提供了强大且灵活的配置管理系统。本章详细介绍各个配置文件的用途和配置选项。
配置文件概述
文件位置
所有配置文件位于项目根目录的 config/
文件夹中。
加载优先级
框架按以下优先级加载配置文件:
{name}.dev.toml
- 开发环境配置(优先级最高){name}.toml
- 生产环境配置- 空配置 - 如果文件不存在则使用默认值
配置层级
配置系统采用分层设计,按优先级合并:
- 开发环境配置 -
config/*.dev.toml
(优先级最高) - 生产环境配置 -
config/*.toml
- 环境变量 -
.env
文件(备用方案)
建议优先使用 TOML 配置文件,
.env
仅在特殊情况下作为备用方案使用。
占位符语法支持
新功能
DuxLite 支持在 TOML 配置文件中使用占位符语法,可以动态替换环境变量和调用PHP函数。
支持的占位符语法:
toml
[app]
# 环境变量占位符
secret = "%env(APP_SECRET)%"
name = "%env(APP_NAME)%"
[database.drivers.default]
# 环境变量配置
host = "%env(DB_HOST)%"
username = "%env(DB_USERNAME)%"
password = "%env(DB_PASSWORD)%"
database = "%env(DB_DATABASE)%"
[storage.drivers.local]
# 函数调用占位符
root = "%public_path(uploads)%"
# 混合文本和占位符
log_file = "logs/app_%date(Y-m-d)%.log"
[cache]
# 时间戳占位符
prefix = "cache_%time()%_"
占位符类型说明:
环境变量 -
%env(变量名)%
tomlsecret = "%env(APP_SECRET)%" debug = "%env(APP_DEBUG)%"
PHP函数调用 -
%函数名(参数)%
tomltimestamp = "%time()%" date = "%date(Y-m-d H:i:s)%" path = "%base_path(storage)%"
混合文本 - 可以在文本中嵌入多个占位符
tomllog_file = "%storage_path(logs)%/app_%date(Y-m-d)%.log" cache_key = "%env(APP_NAME)%_%time()%"
应用配置 (use.toml
)
应用的基础配置文件,包含核心设置。
toml
[app]
# 应用名称
name = "我的 DuxLite 应用"
# 版权信息
copyright = "2024 Your Company"
# 语言设置(影响多语言和本地化)
lang = "zh-CN"
# 时区设置
timezone = "Asia/Shanghai"
# 调试模式(生产环境应设为 false)
debug = true
# 应用密钥(用于加密,32位字符)
secret = "your-32-char-secret-key-here"
# 应用域名
domain = "http://localhost:8000"
[cache]
# 缓存类型:file(文件缓存)或 redis(Redis缓存)
type = "file"
# 缓存前缀(避免冲突)
prefix = "duxlite_"
# 默认缓存生存时间(秒,0表示永不过期)
defaultLifetime = 3600
[lock]
# 锁类型:semaphore, flock, redis 等
type = "semaphore"
模块注册配置 (app.toml
)
用于注册应用模块,这是框架的核心配置之一。
toml
# 模块注册数组
registers = [
"App\\Web\\App",
"App\\Admin\\App",
]
注册规则:
- 每个模块必须有对应的
App.php
类 - 类必须继承
Core\App\AppExtend
- 类需要实现
init()
方法进行模块初始化
数据库配置 (database.toml
)
数据库连接和相关服务配置。
toml
# 数据库连接配置
[db.drivers.default]
driver = "mysql"
host = "%env(DB_HOST)%"
port = "%env(DB_PORT)%"
database = "%env(DB_DATABASE)%"
username = "%env(DB_USERNAME)%"
password = "%env(DB_PASSWORD)%"
charset = "utf8mb4"
collation = "utf8mb4_unicode_ci"
prefix = ""
# Redis 配置(支持多个连接)
[redis.drivers.default]
host = "localhost"
port = 6379
password = ""
database = 0
timeout = 2.5
# optPrefix 是可选的键前缀
optPrefix = ""
[redis.drivers.cache]
host = "localhost"
port = 6379
password = ""
database = 1
timeout = 2.5
optPrefix = "cache_"
# 队列专用 Redis(队列配置实际上使用 database.toml 中的 Redis 配置)
[redis.drivers.queue]
host = "localhost"
port = 6379
password = ""
database = 2
timeout = 2.5
optPrefix = "queue_"
# AMQP 配置(RabbitMQ)
[amqp.drivers.default]
host = "localhost"
port = 5672
vhost = "/"
username = "guest"
password = "guest"
persisted = false
prefix = ""
队列配置 (queue.toml
)
队列配置说明
根据代码分析,队列配置主要依赖于 database.toml
中的 Redis/AMQP 配置,队列服务通过以下逻辑工作:
toml
# 队列服务类型:redis 或 amqp
type = "redis"
# 队列驱动器名称(对应 database.toml 中的配置)
driver = "default"
队列工作原理:
App::queue()
方法从queue.toml
读取type
(默认 "redis")- 然后从
database.toml
读取对应的连接配置 - 支持 Redis 和 AMQP(RabbitMQ)两种队列后端
存储配置 (storage.toml
)
文件存储服务配置,调用 App::storage()
方法获取存储服务实例
toml
# 默认存储类型
type = "local"
# 本地存储驱动
[drivers.local]
type = "local"
# 存储根目录
root = "data/uploads"
# 公共访问域名
domain = "http://localhost:8000"
# URL 路径前缀
path = "uploads"
# S3 兼容存储驱动
[drivers.s3]
type = "s3"
# S3 存储桶
bucket = "my-bucket"
# 访问域名(可选,用于自定义域名)
domain = "https://cdn.example.com"
# API 端点
endpoint = "s3.amazonaws.com"
# 区域
region = "us-east-1"
# 是否使用 SSL
ssl = true
# API 版本
version = "latest"
# 访问密钥
access_key = "your-access-key"
# 密钥
secret_key = "your-secret-key"
# 是否不可变存储
immutable = false
命令行配置 (command.toml
)
自定义命令注册配置。
toml
# 注册自定义命令类
registers = [
"App\\Commands\\CustomCommand",
"App\\Commands\\DataImportCommand"
]
配置使用方法
读取配置
php
// 读取应用配置
$config = App::config('use');
$appName = $config->get('app.name');
$debug = $config->get('app.debug', false); // 带默认值
// 读取数据库配置
$dbConfig = App::config('database');
$host = $dbConfig->get('db.drivers.default.host');
// 读取嵌套配置
$cacheConfig = App::config('use')->get('cache', []);
$cacheType = $cacheConfig['type'] ?? 'file';
使用占位符功能
php
// 使用占位符的配置文件会自动解析
$config = App::config('use');
$appName = $config->get('app.name'); // 已解析 %env(APP_NAME)%
$secret = $config->get('app.secret'); // 已解析 %env(APP_SECRET)%
// 数据库配置也会自动解析占位符
$dbConfig = App::config('database');
$host = $dbConfig->get('db.drivers.default.host'); // 已解析 %env(DB_HOST)%
传统环境变量访问
php
// ✅ 在 PHP 代码中直接访问环境变量
$dbHost = $_ENV['DB_HOST'] ?? 'localhost';
$appSecret = $_ENV['APP_SECRET'] ?? 'default-secret';
// ✅ 也可以使用 getenv() 函数
$dbPassword = getenv('DB_PASSWORD') ?: 'default-password';
服务配置获取
php
// 缓存服务配置
$cache = App::cache(); // 使用默认配置
$cache = App::cache('redis'); // 指定类型
// 数据库服务配置
$db = App::db(); // 使用默认连接
// Redis 服务配置
$redis = App::redis(); // 默认连接
$redis = App::redis('cache'); // 指定连接名
// 队列服务配置
$queue = App::queue(); // 使用默认配置
$queue = App::queue('redis'); // 指定类型
最佳实践
1. 环境配置分离
bash
# 开发环境
config/
├── use.dev.toml # 开发配置
├── database.dev.toml # 开发数据库
└── storage.dev.toml # 开发存储
# 生产环境
config/
├── use.toml # 生产配置
├── database.toml # 生产数据库
└── storage.toml # 生产存储
2. 安全配置
toml
# config/use.toml - 生产环境
[app]
debug = "%env(APP_DEBUG)%"
secret = "%env(APP_SECRET)%"
# 推荐:敏感信息使用环境变量占位符
# 在 .env 文件中设置实际值,不要提交到版本控制
bash
# .env 文件
APP_DEBUG=false
APP_SECRET=randomly-generated-32-char-secret-key
DB_PASSWORD=your-secure-database-password
3. 缓存优化
toml
# 生产环境推荐使用 Redis 缓存
[cache]
type = "redis"
prefix = "prod_app_"
defaultLifetime = 86400
4. .gitignore 设置
shell
# 开发配置文件
config/*.dev.toml
# 环境变量文件
.env
.env.local
# 数据目录
/data/
# 缓存目录
/cache/
故障排除
配置不生效
- 检查文件优先级 -
.dev.toml
优先于.toml
- 验证文件路径 - 确保文件在
config/
目录中 - 检查文件权限 - 确保 PHP 可以读取配置文件
- 验证语法 - TOML 语法错误会导致解析失败
环境变量问题
php
// 检查环境变量是否加载
var_dump($_ENV); // 查看所有环境变量
// 检查 .env 文件是否存在
if (!file_exists('.env')) {
echo ".env 文件不存在\n";
}
服务连接失败
php
// 测试数据库连接
try {
$db = App::db();
echo "数据库连接成功\n";
} catch (Exception $e) {
echo "数据库连接失败: " . $e->getMessage() . "\n";
}
// 测试 Redis 连接
try {
$redis = App::redis();
$redis->ping();
echo "Redis 连接成功\n";
} catch (Exception $e) {
echo "Redis 连接失败: " . $e->getMessage() . "\n";
}