发布于2026-07-10 阅读(0)
扫一扫,手机访问
ThinkPHP 多语言性能的瓶颈,说白了并不在 lang() 这个函数本身——每次请求都要重新 require 一堆 PHP 语言文件,解析、执行、合并数组,全量重复一遍。如果不生成编译缓存,光改配置根本解决不了问题。

php think build:lang 生成缓存框架里的 lang_cache 配置只是一个开关,并不是“开箱即用的自动缓存”。不跑命令,runtime/lang/ 目录下根本不会有文件,缓存逻辑自然也就不会触发。
php think build:lang;旧版用 php think optimize:langzh-cn.php、zh-cn/admin.php)会被合并并序列化,存为单个文件 runtime/lang/zh-cn.phpinclude 这个文件,跳过全部解析和遍历逻辑runtime/ 目录可写,并且在 config/app.php 中显式指定路径——尤其要当心 NFS 或 Docker 挂载场景下的写入延迟lang()每个 {:lang('xxx')} 都会触发一次数组查找和语言包存在性判断。50 次调用不只是 50 次函数开销,背后还有 50 次键检查,以及可能的 fallback 路径遍历。
$this->assign('i18n', ['welcome' => lang('welcome'), 'submit' => lang('submit')]);{$i18n.welcome},这样就是零运行时函数调用lang('hello', ['name' => $user->name]))放在控制器处理,不要塞进模板'lang_tag' => false,防止 {% lang 'xxx' %} 这类语法偷偷触发一旦开启 auto_detect_browser,每次请求都要解析 $_SERVER['HTTP_ACCEPT_LANGUAGE'],做字符串截取、匹配、降级(比如 zh-CN → zh),还可能触发额外的语言包加载。
config/lang.php 中设置 'auto_detect' => false?lang=zh-cn)或 Cookie 显式控制语言,更可控也更快真正卡住多语言性能的,从来不是翻译文本本身,而是加载链路里的重复 IO、无索引遍历、以及根本没生效的缓存开关。生成缓存、预加载变量、关掉自动探测——这三步做完,TTFB 里那多出来的 80ms 基本就消失了。但只要漏掉 build:lang,其他操作都是白忙活。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8