Laravel 6.x PHPUnit测试中Memcached读写异常问题咨询
解决方案
- 优先排查是否存在缓存模拟逻辑:检查测试类、父类测试基类中是否调用了
Cache::fake()方法,该方法会强制将缓存驱动替换为内存模拟驱动,优先级高于配置文件中的缓存驱动设置,会直接屏蔽真实Memcached的读写。 - 验证配置覆盖优先级:确认项目根目录是否存在
.env.testing文件,该文件的配置项优先级高于phpunit.xml中定义的环境变量,若该文件内指定了其他CACHE_DRIVER值,会覆盖你的Memcached配置。 - 排查
getAllKeys方法兼容性问题:部分版本的php-memcached扩展(3.x及以上版本居多)默认禁用了getAllKeys()方法,或是开启二进制协议时该方法返回空,可在config/cache.php的memcached配置的options数组中添加以下配置测试:
'options' => [ \Memcached::OPT_BINARY_PROTOCOL => false, // 部分环境需要额外加以下配置 \Memcached::OPT_NO_BLOCK => false, ],
你可以先直接调用Cache::store('memcached')->get('foo')验证是否能读取到写入的值,如果能正常返回bar,说明Memcached读写本身正常,仅为getAllKeys()方法的兼容性问题。
- 测试Memcached连接有效性:在测试代码中添加
dd(cache()->getMemcached()->getVersion()),若返回false则说明测试环境无法连接Memcached服务,若你的测试运行在Docker等容器环境中,需确认配置的127.0.0.1对应的是Memcached服务所在的网络地址,而非容器本地回环地址。 - 排查测试生命周期中的缓存清理逻辑:检查测试类的
setUp、tearDown方法或者全局测试中间件中是否存在Cache::flush()调用,避免写入的缓存被提前清理。
内容的提问来源于stack exchange,提问作者StandardNerd
相关产品推荐
相关产品推荐

