Laravel 5.2控制器中Memcached缓存失效问题求助
Laravel 5.2控制器中Memcached缓存无法读写,但AppServiceProvider中正常的问题排查
这种"服务提供者中正常、控制器里失效"的问题我之前碰到过几次,大多和Laravel的生命周期差异、运行环境配置或者代码上下文有关。下面是一步步的排查思路和解决方法:
可能的原因及排查步骤
1. 确认Cache门面是否正确引入
控制器的命名空间和服务提供者不同,如果没明确引入Cache门面,可能会调用错误的类(甚至静默失败)。
在控制器顶部添加门面引入:
use Illuminate\Support\Facades\Cache;
或者直接用完全限定名调用,避免命名空间冲突:
$regionList = \Illuminate\Support\Facades\Cache::store('memcached')->get('regionList');
2. 验证Memcached连接和配置是否正常
服务提供者在应用启动时执行,控制器则在web请求周期中运行,两者的运行环境(比如用户权限、网络配置)可能存在差异。
在控制器中添加调试代码,直接测试Memcached连接:
// 先打印当前Memcached配置,确认和config/cache.php一致 dd(config('cache.stores.memcached')); // 用原生Memcached类测试连接 $mem = new \Memcached(); $mem->addServer(config('cache.stores.memcached.servers.0.host'), config('cache.stores.memcached.servers.0.port')); $mem->set('test_controller_key', 'hello_from_controller', 60); dd($mem->get('test_controller_key'));
- 如果原生类能正常读写,说明Laravel的Cache门面在控制器中的使用有问题;
- 如果不能,说明web服务器进程(比如www-data)无法连接Memcached,可能是:
- Memcached绑定了特定IP(比如只允许127.0.0.1,但web服务器在容器中);
- 防火墙限制了11211端口;
- web用户没有访问Memcached的权限。
3. 检查配置缓存是否过期
如果执行过php artisan config:cache,Laravel会把所有配置合并到一个缓存文件中。如果之后修改了.env或config/cache.php但没重新生成缓存,控制器会读取过时的配置。
执行以下命令重置配置缓存:
php artisan config:clear php artisan config:cache
4. 排查中间件或全局代码的干扰
有些中间件、路由组或者全局初始化代码可能会修改缓存驱动,比如不小心把默认驱动设为array(内存缓存,请求结束就失效):
// 类似这样的代码会导致即使指定store('memcached')也出问题 Cache::setDefaultDriver('array');
在控制器中先打印当前默认驱动确认:
dd(Cache::getDefaultDriver());
如果不是memcached,检查所有中间件和全局代码,找到修改驱动的地方。
5. 确认模型查询是否返回数据
有时候在请求周期中,模型查询可能因为权限、上下文参数不同返回空数组,导致缓存存入空值,后续get自然也是空。
在控制器中打印查询结果:
$regions = new \App\Models\RegionalConfig(); $regionList = $regions->getVersionsList()->toArray(); dd($regionList); // 确认是否有数据
如果这里是空数组,问题出在模型查询,而非缓存本身。
总结
最常见的原因是控制器未正确引入Cache门面或者web进程无法连接Memcached,先从这两点入手排查,一般都能解决问题。
内容的提问来源于stack exchange,提问作者SergioZhidkov
相关产品推荐
相关产品推荐

