核心是按需加载语言文件而非删除文件:拆分语言文件、控制器中只加载当前方法所需文件、合并高频共用项为逻辑组、启用APCu/Redis缓存已解析数组、清理冗余键值和注释。

语言文件太多导致加载慢,核心不是“删文件”,而是避免每次请求都加载全部语言项——CodeIgniter 的 $this->lang->load() 默认只加载指定文件,但若控制器或视图里分散调用、重复加载、或误用通配加载,就会拖慢响应。
按需加载,别一股脑全载
很多项目把所有语言项塞进一个 common_lang.php,然后在基类里统一 load,结果每次请求都加载上百条、甚至几百条字符串,哪怕只用其中 3–5 条。正确做法是:
- 按功能拆分语言文件,比如
auth_lang.php、dashboard_lang.php、error_lang.php - 控制器中只 load 当前方法真正需要的文件:
$this->lang->load('auth', $lang); - 视图里不手动 load,靠控制器提前加载好;避免在 view 里写
$this->lang->load() - 移除无用的
load('common')全局调用,尤其在 MY_Controller 构造函数里
合并高频短语,减少文件 IO 次数
每个 load() 调用都会触发一次文件读取和 PHP 解析。如果多个小文件被频繁同时使用(比如登录页用到 auth + error + form),可合并为一个逻辑组文件:
- 新建
login_lang.php,包含:$lang['login_title']、$lang['login_failed']、$lang['required_field']等 - 控制器中只需一次
$this->lang->load('login', $lang) - 比分别 load auth、error、form 三个文件节省 2 次文件打开+解析开销
启用语言缓存(非默认,需手动配置)
CodeIgniter 默认不缓存语言文件内容,每次请求都重新 require_once。可通过 APCu 或 Redis 缓存已解析的语言数组:
- 在
MY_Lang类(继承CI_Lang)中重写load()方法,在解析后存入apcu_store()或cache()->save() - 下次同语言同文件请求时,直接从缓存取数组,跳过文件读取和
eval过程 - 注意键名需唯一,建议用
md5($lang . '/' . $file)作缓存 key - 开发环境关掉该缓存,避免改语言文件后不生效
检查并清理冗余语言项
长期迭代后,语言文件里常有大量注释掉、拼写错误、或早已下线功能对应的键值。这些虽不执行,但仍被 PHP 解析器扫描:
- 用脚本扫描所有
*_lang.php,找出 6 个月未被lang('xxx')调用的键(配合日志或静态分析) - 删除空行、全注释行、重复定义(如同一文件里出现两次
$lang['submit']) - 统一缩进风格(推荐单空格缩进),减小文件体积,加快 PHP 解析速度


















