在Yii 2.0.48中启用分布式Memcached缓存需同时满足服务端可用、PHP扩展就绪、框架配置正确三重前提:先验证memcached服务状态和php-memcached扩展加载,再通过nc检查多节点端口连通性,然后在config/main.php中正确配置'class'=>'yii\caching\MemCache'及servers数组,启用hashKey确保键路由一致性,最后通过跨服务器读取、命中率统计或故障转移测试验证分布式生效。

在 Yii 2.0.48 中启用分布式 Memcached 缓存,需同时满足服务端可用、PHP 扩展就绪、框架配置正确三重前提,缺一不可——比如只配了多个服务器但未安装 php-memcached 扩展,应用启动时会直接抛出 Class 'yii\caching\MemCache' not found 异常。
确认 Memcached 服务与 PHP 扩展已就绪
登录服务器执行 systemctl is-active memcached,返回 active 表示服务运行中;若为 inactive,先执行 sudo systemctl start memcached 并设开机自启:sudo systemctl enable memcached。
运行 php -m | grep memcached,输出含 memcached 即表示扩展已加载;若无输出,需安装扩展:sudo apt install php-memcached(Ubuntu/Debian)或 sudo yum install php-pecl-memcached(CentOS/RHEL),安装后重启 Web 服务。
【必须验证端口连通性】 在应用服务器上执行 nc -zv server1 11211 && nc -zv server2 11211,两个节点均返回 succeeded! 才能继续配置;任一节点不通,后续 set 操作将静默失败,且 Yii 不报错。
配置多节点 Memcached 组件
打开 config/main.php,在 'components' 数组内添加或替换 'cache' 配置项:
```php
'cache' => [
'class' => 'yii\caching\MemCache',
'servers' => [
['host' => 'server1.example.com', 'port' => 11211, 'weight' => 60],
['host' => 'server2.example.com', 'port' => 11211, 'weight' => 40],
],
'keyPrefix' => 'app_v2_',
'hashKey' => true,
],
```
权重值总和不必为 100,仅用于相对比例分配;hashKey => true 启用默认的 CRC32 哈希算法,确保相同 key 总路由到同一节点——若设为 false,多节点下 get 可能永远找不到 set 过的数据。
注意:Yii 2.0.48 不支持 'clusters' 键(那是 Redis 配置用的),误写会导致组件初始化失败,报错信息为 Unknown property: yii\caching\MemCache::clusters。
验证缓存是否真正分布式生效
方法一:写入带明确节点标识的键值
在控制器中执行:Yii::$app->cache->set('test_node_1', 'from_server1', 300);
然后立即从另一台应用服务器(非本机)执行:var_dump(Yii::$app->cache->get('test_node_1'));
若返回 string(11) "from_server1",说明跨服务器读取成功,分布式链路打通。
方法二:检查各 Memcached 节点实时命中率
在 server1 上执行:echo "stats" | nc server1.example.com 11211 | grep "cmd_get\|get_hits";
在 server2 上执行同命令。分别观察 get_hits 值增长比例是否接近 6:4——若 server1 的 get_hits 暴涨而 server2 几乎不变,说明哈希或权重配置失效,所有请求被路由到单点。
方法三:强制触发节点故障转移
临时停掉 server1:sudo systemctl stop memcached,再执行 Yii::$app->cache->set('failover_test', 'alive', 300);
随后调用 Yii::$app->cache->get('failover_test'),应仍能返回 'alive';
若返回 false,说明 Yii 未自动跳过宕机节点,需检查 MemCache 类版本——Yii 2.0.48 内置的 MemCache 默认具备故障剔除能力,但若手动覆盖了该类,可能丢失此特性。


















