运行模式
ThinkAdmin 的运行配置由 think\admin\service\RuntimeService 管理,配置文件写入 runtime/.env,启动时再合并到 ThinkPHP 应用配置中。
当前实现中,核心判断只有一个:
mode === product:生产模式,RuntimeService::isOnline()返回true。mode !== product:调试模式,RuntimeService::isDebug()返回true。
默认 mode 为 debug。文档或业务中常说的“开发模式”本质上指所有非 product 模式。
配置文件
运行配置文件位置:
runtime/.envRuntimeService::set() 会写入类似内容:
[RUNTIME]
mode = debug
appmap[myadmin] = admin
domain[admin.example.com] = admin读取时通过 ThinkPHP Env 读取为:
RUNTIME_MODERUNTIME_APPMAPRUNTIME_DOMAIN
不建议手动编辑该文件。后台按钮和 RuntimeService::set() 会同步更新内存配置、文件配置和当前应用配置。
运行模式
判断模式
isDebug(): bool
isOnline(): bool等价于:
RuntimeService::isDebug(); // RuntimeService::get('mode') !== 'product'
RuntimeService::isOnline(); // RuntimeService::get('mode') === 'product'示例:
if (isDebug()) {
p($data);
}
if (isOnline()) {
$this->error('操作失败,请稍后再试');
}切换模式
后台“系统参数配置”页面的运行模式按钮实际调用 admin/api.system/debug:
state=1:调用RuntimeService::set('product'),切换到生产模式。state=0:调用RuntimeService::set('debug'),切换到调试模式。
对应代码在 app\admin\controller\api\System::debug(),并且只允许超级管理员操作。
也可以在代码中直接调用:
use think\admin\service\RuntimeService;
RuntimeService::set('product');
RuntimeService::set('debug');发布加速
后台“网站缓存加速”调用 RuntimeService::push():
RuntimeService::push(): string当前实现会:
- 调用
RuntimeService::set('product')切换到生产模式。 - 读取数据库默认连接名。
- 执行 ThinkPHP
optimize:schema --connection=...。 - 返回连接名。
该操作同样只允许超级管理员通过后台接口调用。
应用映射
RuntimeService::set() 签名如下:
RuntimeService::set(?string $mode = null, ?array $appmap = [], ?array $domain = []): bool参数含义:
$mode:运行模式,传null表示保持原模式。$appmap:应用路径映射,会合并到config('app.app_map')。$domain:域名绑定,会合并到config('app.domain_bind')。
后台登录入口修改使用的是 $appmap:
RuntimeService::set(null, ['myadmin' => 'admin']);这表示访问 /myadmin 时调度到真实的 admin 应用。它不会移动或改名 app/admin 目录。
注意:RuntimeService::set() 合并映射时会去重同一个目标应用。将新的路径映射到 admin 后,旧的 admin => admin 映射会被新值替换;因此旧入口通常不再可用。
后台入口
后台系统参数表单中的“后台登录入口”字段名为 xpath。保存时实际执行:
if (!empty($post['xpath'])) {
if (!preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/', $post['xpath'])) {
$this->error('后台入口格式错误!');
}
if ($post['xpath'] !== 'admin') {
if (is_dir(syspath("app/{$post['xpath']}")) || !empty(Plugin::get($post['xpath']))) {
$this->error(lang('已存在 %s 应用!', [$post['xpath']]));
}
}
RuntimeService::set(null, [$post['xpath'] => 'admin']);
}入口规则:
- 必须以英文字母或下划线开头。
- 后续只能包含英文字母、数字和下划线。
- 不能与已有应用目录或插件编码冲突。
- 保存后通过应用映射访问真实
admin应用。
示例:
RuntimeService::set(null, ['console_2026' => 'admin']);访问入口:
/console_2026
/console_2026.html域名绑定
域名绑定使用第三个参数:
RuntimeService::set(null, [], ['admin.example.com' => 'admin']);MultAccess 解析请求时会按以下顺序处理:
- 如果当前入口脚本不是
index、router、think,优先按脚本名绑定应用。 - 检查
app.domain_bind:完整 Host、子域名、*。 - 从 URL 第一段读取应用名或映射名。
- 检查
app.app_map,命中后调度到映射应用。 - 如果名称命中已安装插件编码,则调度到插件应用。
- 找不到应用时,按
app.app_express决定是否回落到默认应用。
因此,应用映射和域名绑定都是运行时调度规则,不是文件复制或目录重命名。
缓存清理
RuntimeService::clear(bool $force = true): bool当前实现会:
- 读取当前运行配置。
- 清理权限节点缓存
SystemAuthNode。 - 清理应用缓存。
$force=true时执行 ThinkPHPclear --dir。- 重新写回当前
mode、appmap、domain。
后台“清理运行缓存”调用 admin/api.system/clear,同样只允许超级管理员操作。
命令行也可以使用 ThinkPHP 原生命令:
php think clear --dir但该命令不会像 RuntimeService::clear() 一样重新写入运行配置。
环境检查
RuntimeService::check() 不是读取 runtime/.env 的运行模式,而是按当前访问域名判断环境类型:
RuntimeService::check(string $type = 'dev'): bool当前规则:
check('demo'):Host 匹配v数字.thinkadmin.top。check('local'):Host 为127.0.0.1或包含local。check('dev'):本地或演示环境。- 其他类型默认返回
true。
后台登录页使用 RuntimeService::check() 设置 runtimeMode,用于展示当前访问环境提示,不等同于 RuntimeService::get('mode')。
常见问题
如何查看当前配置
use think\admin\service\RuntimeService;
$mode = RuntimeService::get('mode');
$appmap = RuntimeService::get('appmap');
$domain = RuntimeService::get('domain');
$all = RuntimeService::get();为什么切换生产模式后仍能看到旧页面
优先清理运行缓存:
RuntimeService::clear();或执行:
php think clear --dir如果是模板、配置或路由缓存导致的旧内容,清理后会重新生成。
为什么修改后台入口后 /admin 不能访问
后台入口修改本质是把新路径映射到真实 admin 应用,并用去重合并规则替换旧映射。保存后应使用新的入口路径访问后台。
生产环境应该使用什么模式
生产环境应使用:
RuntimeService::set('product');并清理运行缓存。调试模式会开启 ThinkPHP debug 状态,更容易暴露错误详情和调试信息。
演示截图


