ThinkPHP 5.1 使用 Memcached 实现分布式 Session,核心在于正确启用 ext-memcached 扩展(≥3.0.0)、配置 type 为全小写 'memcached'、服务器列表必须为纯数字索引数组(含 host/port)、显式设置 expire/serialize/cookie.domain,否则会静默回退到文件存储。

ThinkPHP 5.1 使用 Memcached 实现分布式 Session,核心在于正确启用扩展、严格匹配驱动名、规范配置服务器列表,并统一 Cookie 域。配错一个字段(比如 type 写成 Memcache 或 memcache),Session 就会静默回退到文件存储,根本不会报错——这是线上环境最隐蔽的故障点。
确认 PHP 环境已就绪
Memcached 驱动依赖 ext-memcached(不是 ext-memcache),且版本不低于 3.0.0:
- 运行
php -m | grep memcached,有输出才表示扩展已加载 - 检查
php.ini中是否启用:extension=memcached - Docker 用户注意 Alpine 镜像需额外安装
php82-pecl-memcached类似包 - 若用的是 Windows 或 WAMP/XAMPP,确认启用的是
php_memcached.dll而非php_memcache.dll
配置项必须写对位置和大小写
ThinkPHP 5.1 的 Session 配置路径是 config/session.php,不是 .env,也不是 php.ini:
-
type 必须为全小写
'memcached'(Memcached、memcache、MEMCACHED全部无效) - 删除或注释掉
type以外的旧驱动配置(如redis或file),避免冲突 - 确保
'auto_start' => true已开启,否则 Session 不会自动初始化
Memcached 服务器列表格式极敏感
ThinkPHP 5.1 的 Memcached 驱动不接受关联数组或字符串地址,只认纯数字索引的二维数组,每个元素必须含 host 和 port:
立即学习“PHP免费学习笔记(深入)”;
- ✅ 正确写法:
'memcached' => [['host' => '10.0.1.5', 'port' => 11211]] - ❌ 错误写法:
['server1' => ['host' => 'x', 'port' => 11211]](键名非数字) - ❌ 错误写法:
'127.0.0.1:11211'(字符串无法解析) - 多节点时可追加:
[['host'=>'10.0.1.5','port'=>11211], ['host'=>'10.0.1.6','port'=>11211]]
关键参数不能漏:expire、serialize、cookie.domain
缺一不可,否则高并发下易丢数据或跨域失效:
-
expire:显式设置过期时间,例如
'expire' => 7200(单位秒),避免依赖 Memcached 默认 TTL 导致 key 冲突 -
serialize:设为
'php',保证与 PHP 原生序列化兼容,防止读取乱码或失败 -
cookie.domain:设为
'.example.com'(开头带点),使多个子域名(如 api.example.com、www.example.com)共享同一 Session ID - 安全项建议开启:
'use_strict_mode' => true、'cookie_httponly' => true、'cookie_secure' => true(HTTPS 环境)



















