php 7.4+ 及 8.x 已彻底移除 memcache 扩展,应改用基于 libmemcached 的 memcached 扩展;其支持 sasl 认证、二进制协议,并需注意 getresultcode() 判断未命中、过期时间语义等关键差异。

Memcache(旧扩展),转而推荐使用更稳定、功能更全的 Memcached 扩展(注意末尾多一个 d)。直接学 Memcache 容易踩兼容性坑,尤其在 PHP 7.4+ 和 8.x 上——它早已被移除支持。
Memcache 扩展在 PHP 7.4+ 已不可用
你执行 php -m | grep memcache 很可能返回空;new Memcache() 会报 Fatal error: Uncaught Error: Class 'Memcache' not found。这不是配置问题,是 PHP 核心已彻底移除该扩展。官方自 PHP 7.2 起标记为废弃,PHP 8.0 正式删除。继续查旧教程或强行编译安装,只会浪费时间且带来安全隐患。
改用 Memcached 扩展才是正确路径
Memcached 是基于 libmemcached 的现代实现,支持 SASL 认证、二进制协议、更好的错误处理和完整的 TTL 控制。它和 Memcache 的 API 高度相似但不完全兼容,关键差异点包括:
-
Memcached::set()默认不支持压缩,需显式调用setOptions([Memcached::OPT_COMPRESSION => true]) -
get()返回false时,必须用getResultCode() !== Memcached::RES_NOTFOUND判断是否真未命中(避免把缓存值为false误判为未命中) - 连接失败后不会自动重连,需手动检查
$memcached->isConnected()或捕获MemcachedException - 过期时间超过 30 天(2592000 秒)会被当作绝对 Unix 时间戳处理,不是相对秒数
一个能跑通的 Memcached 最小示例
<?php $memcached = new Memcached();
$memcached->addServer('127.0.0.1', 11211);
// 设置带过期时间的值
$memcached->set('user_1001', ['name' => 'Alice', 'role' => 'admin'], 300);
// 安全读取:区分未命中与真实 false 值
$value = $memcached->get('user_1001');
if ($memcached->getResultCode() === Memcached::RES_NOTFOUND) {
// 触发回源逻辑,比如查数据库
$value = fetchFromDB(1001);
$memcached->set('user_1001', $value, 300);
}
var_dump($value);
本地开发环境快速验证步骤
别在生产机上折腾:
- macOS:用
brew install memcached && brew services start memcached启动服务 - Ubuntu/Debian:
sudo apt install memcached php-memcached && sudo systemctl enable --now memcached - 确认扩展加载:
php -i | grep memcached应显示配置段;php -r "echo class_exists('Memcached') ? 'ok' : 'fail';"必须输出ok - 测试连接:
echo "stats" | nc 127.0.0.1 11211 | head -5能看到版本和状态即服务正常
Memcached::OPT_PREFIX_KEY 这类高级选项对多租户场景的影响——这些才是上线前必须理清的。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











