在Laravel应用中引入Memcached作为缓存后端,是应对高并发读请求、降低数据库负载的有效方式。Laravel自带了对Memcached的完整支持,开发者无需自行封装客户端,只需正确安装服务端扩展并完成配置即可在代码中通过统一接口操作缓存。

一、环境准备与扩展安装
Laravel的Memcached驱动依赖于PHP的memcached扩展,而不是已废弃的memcache扩展。两者名称相似,但前者支持二进制协议、一致性哈希和连接池,是官方推荐的选择。在Ubuntu系统中,可通过包管理器直接安装。
安装完成后,需要在php.ini中启用扩展,并重启PHP服务使配置生效。可以通过命令行执行php -m | grep memcached确认扩展已加载。如果项目运行在PHP-FPM环境下,也必须确保FPM进程使用的php.ini包含该扩展,否则Web请求中会出现驱动不可用的异常。
# 安装PHP memcached扩展 sudo apt-get install php-memcached # 重启PHP-FPM使扩展生效 sudo systemctl restart php8.2-fpm # 验证扩展 php -m | grep memcached
二、Laravel缓存配置详解
Laravel的缓存配置位于config/cache.php文件中。在该文件中,默认驱动由环境变量CACHE_DRIVER控制,将其改为memcached即可切换。更重要的是memcached节点数组的定义,它决定了客户端要连接的服务器列表。
每个节点可设置host、port、weight等参数。weight用于加权分布,当某台机器内存更大时可分配更高权重。Laravel启动时会读取这些配置并实例化Memcached连接池。如果服务端未启动或端口错误,首次调用缓存时才会抛出异常,因此建议在上线前通过 artisan tinker 做一次连通性测试。
// config/cache.php 片段
'memcached' => [
'driver' => 'memcached',
'persistent_id' => 'laravel_cache',
'sasl' => [
env('MEMCACHED_USERNAME'),
env('MEMCACHED_PASSWORD'),
],
'options' => [
// 启用一致性哈希
Memcached::OPT_DISTRIBUTION => Memcached::DISTRIBUTION_CONSISTENT,
],
'servers' => [
[
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
'port' => env('MEMCACHED_PORT', 11211),
'weight' => 100,
],
],
],
三、使用Cache门面操作缓存
Laravel提供了IlluminateSupportFacadesCache门面,屏蔽了底层驱动差异。无论使用文件、Redis还是Memcached,上层调用方式完全一致。常用方法包括put、get、add、forever与remember。
其中remember方法最为实用,它接受键、过期分钟数和闭包,当缓存缺失时执行闭包并将结果写入Memcached,避免代码里反复判断是否存在。需要注意Memcached最大value通常为1MB,超过会写入失败,大对象应先序列化拆分或改用Redis。
use IlluminateSupportFacadesCache;
// 写入带过期时间的缓存
Cache::put('user:1', $userData, 30);
// 读取缓存,缺失返回默认值
$value = Cache::get('user:1', null);
// 仅当键不存在时写入
Cache::add('config:site', $cfg, 60);
// 自动回源并缓存查询结果
$posts = Cache::remember('posts:latest', 10, function () {
return AppModelsPost::orderBy('id', 'desc')->limit(20)->get();
});
四、集群与多节点部署
当单台Memcached无法承载内存需求时,可配置多个server节点实现横向扩展。Laravel的驱动会将键通过一致性哈希分散到不同节点,应用层无需感知具体位置。某节点宕机时,其上的键会失效并触发回源,不会影响整体可用。
在多节点场景中,不建议使用forever永久缓存重要数据,因为节点重启会清空全部内存。应结合业务设置合理TTL,并利用监控观察命中率。下表对比了不同缓存后端的适用差异。
| 后端 | 优点 | 局限 |
|---|---|---|
| 文件缓存 | 零依赖,适合小型站点 | 磁盘IO慢,集群间不共享 |
| Memcached | 内存读写极快,支持多节点 | 无持久化,单条不能超过1MB |
| Redis | 支持数据结构与持久化 | 内存占用略高,配置更复杂 |
五、常见误区与排查
一个典型误区是在开发环境使用数组或文件驱动,生产环境切到memcached后未清理序列化残留,导致旧代码读取到错误格式。另一个问题是把会话驱动也设为memcached时,忘记修改session.php配置,造成登录状态丢失。
排查连接问题时,可临时在tinker中执行Cache::store('memcached')->put('test', 1, 1)并立即get,若返回null说明服务端不可达或扩展异常。此外,SELinux或防火墙也可能阻断11211端口,需同步放通。
// artisan tinker 中测试
Cache::store('memcached')->put('ping', 'pong', 1);
echo Cache::store('memcached')->get('ping');
LaravelMemcachedcache_config修改时间:2026-08-06 06:09:26