运行模式

ThinkAdmin 的运行配置由 think\admin\service\RuntimeService 管理,配置文件写入 runtime/.env,启动时再合并到 ThinkPHP 应用配置中。

当前实现中,核心判断只有一个:

  • mode === product:生产模式,RuntimeService::isOnline() 返回 true
  • mode !== product:调试模式,RuntimeService::isDebug() 返回 true

默认 modedebug。文档或业务中常说的“开发模式”本质上指所有非 product 模式。

配置文件

运行配置文件位置:

runtime/.env

RuntimeService::set() 会写入类似内容:

[RUNTIME]
mode = debug
appmap[myadmin] = admin
domain[admin.example.com] = admin

读取时通过 ThinkPHP Env 读取为:

  • RUNTIME_MODE
  • RUNTIME_APPMAP
  • RUNTIME_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

当前实现会:

  1. 调用 RuntimeService::set('product') 切换到生产模式。
  2. 读取数据库默认连接名。
  3. 执行 ThinkPHP optimize:schema --connection=...
  4. 返回连接名。

该操作同样只允许超级管理员通过后台接口调用。

应用映射

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 解析请求时会按以下顺序处理:

  1. 如果当前入口脚本不是 indexrouterthink,优先按脚本名绑定应用。
  2. 检查 app.domain_bind:完整 Host、子域名、*
  3. 从 URL 第一段读取应用名或映射名。
  4. 检查 app.app_map,命中后调度到映射应用。
  5. 如果名称命中已安装插件编码,则调度到插件应用。
  6. 找不到应用时,按 app.app_express 决定是否回落到默认应用。

因此,应用映射和域名绑定都是运行时调度规则,不是文件复制或目录重命名。

缓存清理

RuntimeService::clear(bool $force = true): bool

当前实现会:

  1. 读取当前运行配置。
  2. 清理权限节点缓存 SystemAuthNode
  3. 清理应用缓存。
  4. $force=true 时执行 ThinkPHP clear --dir
  5. 重新写回当前 modeappmapdomain

后台“清理运行缓存”调用 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 状态,更容易暴露错误详情和调试信息。

演示截图

运行模式操作

系统参数配置
最近更新:
Contributors: 邹景立, Anyon