服务容器缓存文件位于 writepath . 'cache/services.php',是包含服务工厂闭包的 php 文件,用于提升启动性能;开发环境自动重建,生产环境需手动清理或禁用缓存。

服务容器缓存文件在哪?
CodeIgniter4 的服务容器(Service Container)在首次启动时会生成缓存类映射,存放在 WRITEPATH . 'cache/' 下的 services.php 文件里(不是 application/cache/,注意路径区别)。这个文件是 PHP 可执行代码,包含所有服务的工厂闭包和依赖关系快照,用于跳过重复解析,提升启动性能。
- 它由
CodeIgniter\Autoloader\Autoloader::discoverServices() 生成
- 仅在
CI_ENVIRONMENT !== 'production' 时自动重建(开发/测试环境)
- 生产环境默认不重建,靠手动触发或部署流程清理
怎么强制清除并重建服务容器缓存?
直接删文件是最可靠的方式,但要注意时机和副作用:
- 删除前确保应用未正在运行(尤其 CLI 命令或并发请求中删文件可能引发 fatal error)
- 执行命令:
rm -f $(php -r "echo WRITEPATH . 'cache/services.php';")
- 或在控制器/脚本中用 PHP 清理:
unlink(WRITEPATH . 'cache/services.php');
- 之后任意一次 HTTP 请求或 CLI 调用(如
php spark list)会自动重建
CodeIgniter\Autoloader\Autoloader::discoverServices() 生成 CI_ENVIRONMENT !== 'production' 时自动重建(开发/测试环境) - 删除前确保应用未正在运行(尤其 CLI 命令或并发请求中删文件可能引发 fatal error)
- 执行命令:
rm -f $(php -r "echo WRITEPATH . 'cache/services.php';")
- 或在控制器/脚本中用 PHP 清理:
unlink(WRITEPATH . 'cache/services.php');
- 之后任意一次 HTTP 请求或 CLI 调用(如
php spark list)会自动重建
⚠️ 不要用 $this->cache->clean() —— 它清的是应用层缓存驱动(如 file/redis),对 services.php 无效。
为什么改了服务定义但缓存没更新?
常见原因有三个:
- 环境变量
CI_ENVIRONMENT 被设为 production,导致框架跳过自动重建逻辑
-
services.php 文件权限问题(如只读),写入失败但无报错
- 修改了
app/Config/Services.php,但该类被其他服务引用并已实例化(容器缓存的是“构建逻辑”,不是运行时实例)
CI_ENVIRONMENT 被设为 production,导致框架跳过自动重建逻辑 services.php 文件权限问题(如只读),写入失败但无报错 app/Config/Services.php,但该类被其他服务引用并已实例化(容器缓存的是“构建逻辑”,不是运行时实例) 验证是否生效:查看 services.php 文件修改时间,或临时在 Services::database() 里加个 log_message('debug', 'rebuilding db service'),看日志是否出现。
CI4.5+ 的新行为:可禁用服务缓存
从 CI4.5 开始,可通过配置关闭服务容器缓存,避免清理困扰:
- 在
app/Config/Boot/production.php(或对应环境启动文件)中添加:define('CI_SERVICE_CACHE_DISABLE', true);
- 或在
.env 中设置:CI_SERVICE_CACHE_DISABLE=true
- 启用后,每次请求都会重新解析
Services.php,适合调试复杂依赖注入场景
app/Config/Boot/production.php(或对应环境启动文件)中添加:define('CI_SERVICE_CACHE_DISABLE', true); .env 中设置:CI_SERVICE_CACHE_DISABLE=true
Services.php,适合调试复杂依赖注入场景 但注意:这会带来约 5–15ms 的启动开销,生产环境慎用。
服务容器缓存不像页面缓存那样有 API 可调,它的生命周期绑定在文件系统和环境判断上,最容易被忽略的是环境变量与文件权限的组合影响——删了文件却没重建,八成是 CI_ENVIRONMENT 没设对,或者 WRITEPATH . 'cache/' 不可写。











