Yii2需正确安装PHP的memcached扩展(非memcache),配置中启用useMemcached=>true、servers为数组、设置keyPrefix防冲突,并将cache配置移至公共配置以支持console应用。

Memcached扩展没装好,phpinfo()里看不到 memcached 模块
Yii2用的是 PHP 的 memcached 扩展(不是 memcache),不是装了服务端就完事。常见错误是只启了 memcached 服务,但 PHP 没编译或启用对应扩展。
- Linux 下检查:
php -m | grep memcached,没输出就说明扩展没加载 - 确认安装的是
memcached(带 d),不是旧版memcache(不带 d)—— Yii2 不支持后者 - Mac M1/M2 用户容易踩坑:用
pecl install memcached时若报libmemcached缺失,得先brew install libmemcached,再指定路径:sudo pecl install memcached --with-libmemcached-dir=/opt/homebrew/opt/libmemcached - Windows 用户直接下载对应 PHP 版本的
php_memcached.dll,加到php.ini里,注意线程安全(TS/NTS)和架构(x64/x86)必须匹配
Yii2 配置 cache 组件连不上 Memcached 服务
连不上通常不是密码或端口错,而是默认行为和实际部署不一致。Yii2 的 MemCache 组件底层用的是 PHP 的 Memcached 类,但默认开启 useMemcached 是 false,走的是兼容层,容易出连接超时或协议异常。
- 强制用原生
Memcached类:'useMemcached' => true,否则可能 fallback 到过时的Memcache协议 -
servers必须写成数组,哪怕只配一个:['servers' => [['host' => '127.0.0.1', 'port' => 11211']]],写成字符串或单层数组会静默失败 - 如果 Memcached 服务绑在
127.0.0.1而不是localhost,别写localhost——某些系统下 DNS 解析慢或失败,直接导致连接超时 - 测试连通性别只靠
yii cache/flush,先在控制器里写一行:Yii::$app->cache->set('test', 'ok', 10); var_dump(Yii::$app->cache->get('test'));,看是否返回string(2) "ok"
把 session 存进 Memcached,但用户频繁掉登录
Session 失效快,大概率不是缓存过期时间设短了,而是 Memcached 实例内存不足触发 LRU 清理,或者多个应用共用同一组服务器却没隔离 key 空间。
- Yii2 的 session 组件默认不自动加前缀,所有应用往同一个 Memcached 写
PHPSESSID_xxx,key 冲突或被误删很常见 - 必须配置
keyPrefix:'session' => ['class' => 'yii\web\CacheSession', 'cache' => 'cache', 'keyPrefix' => 'myapp_session_'] - 不要依赖
gc_maxlifetime控制 session 过期——Memcached 自身不支持 TTL 级别的 GC,它只认你 set 时传的$duration;所以CacheSession的timeout参数必须显式设,比如'timeout' => 1440(24 分钟) - 如果用 Docker 或云服务,确认 Memcached 实例内存 ≥ 128MB,小内存实例在压测时极易因 LRU 扔掉活跃 session
MemCache 组件在控制台命令里用不了
控制台应用(console app)默认不加载 web 层组件,cache 组件只在 web.php 里配置,console 启动时根本不知道有这个组件。
- 把
cache配置移到common/config/main.php(或所有环境共享的主配置),而不是只放在web.php - 如果用的是高级模板,确认
console.php中'bootstrap' => ['log']后面没漏掉'cache'—— 不需要,组件只要在components里声明就能用,但必须确保配置已加载 - 验证方式:在 console 命令的
execute()里写var_dump(Yii::$app->has('cache'));,返回bool(true)才算生效 - 别在 console 里用
Yii::$app->session—— 控制台没有 session,要用缓存就直接Yii::$app->cache->get()


















