Laravel中session使用Memcached需同时满足:SESSION_DRIVER=cache、SESSION_STORE=memcached、config/cache.php的stores下明确定义memcached驱动、.env与配置名完全一致;缺一则静默回退file。

Memcached 不能直接用于 Laravel 的 session 存储,必须先确认它是否被正确配置为缓存驱动,再在 session 配置中显式指向该缓存 store。 很多人卡在“明明 cache 能用,session 却报错”,问题就出在这层间接依赖没对齐。
为什么 session('key') 不走 Memcached?
Laravel 的 session 系统默认不绑定 cache 驱动;即使 CACHE_DRIVER=memcached,session 仍可能走 file 或 database。session 需要单独指定 SESSION_DRIVER=cache,并确保 SESSION_STORE 指向一个已定义的 memcached store(如 memcached)。
-
SESSION_DRIVER必须设为cache(不是memcached)——这是关键混淆点 -
SESSION_STORE才决定用哪个缓存 store,例如memcached、redis,它对应config/cache.php中'stores'下的键名 - 若
SESSION_STORE为空或未定义,Laravel 会 fallback 到defaultstore,而default默认是file,哪怕CACHE_DRIVER是 memcached - session 使用的 store 必须在
config/cache.php的'stores'数组里明确定义,不能只靠'memcached'顶层配置
config/cache.php 中 memcached store 必须完整定义
仅仅在 'memcached' => [ ... ] 顶层写服务器地址不够。Laravel session 要求 store 是 'stores' 下的一个完整条目,且 'driver' 明确为 memcached。
- 错误写法:
'memcached' => [ [ 'host' => '127.0.0.1', 'port' => 11211 ] ](这只是连接参数,不是 store) - 正确写法:在
'stores'里加一项:'memcached' => [ 'driver' => 'memcached', 'servers' => [ [ 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 'port' => (int) env('MEMCACHED_PORT', 11211), 'weight' => 100 ] ], ], - UNIX socket 写法:
'host' => '/var/run/memcached/memcached.sock', 'port' => 0,port 必须为 0,否则仍走 TCP - 别忘了在
.env中设置SESSION_STORE=memcached,否则 session 无法识别这个 store 名
常见报错与验证步骤
遇到 Class 'Memcached' not found 或 session 数据不持久,优先按顺序验证这四点:
- 运行
php -m | grep memcached,输出必须是memcached(不是memcache);否则装错扩展 - 执行
dd(class_exists('Memcached'))在路由里,返回true才算 PHP 层通 - 清空配置缓存:
php artisan config:clear,否则.env和config/cache.php修改不生效 - 手动测试 session 写入:
Route::get('/session-test', function () { session(['test' => time()]); return session('test') ? 'OK' : 'FAIL'; });返回 FAIL 就说明 session store 没连上,不是缓存本身问题
最容易被忽略的是:session 使用的 store 名(SESSION_STORE)和 config/cache.php 中 'stores' 下的键名必须**完全一致、大小写敏感、无空格**;多一个下划线或拼错字母,就会静默 fallback 到 file 驱动,且没有任何报错提示。



















