phpEnv不内置Memcached,需手动安装libmemcached库及PHP memcached扩展,并独立运行memcached服务端;否则new Memcached()会报Class not found或连接失败。

phpEnv 本身不内置 Memcached 服务或扩展,必须手动安装 libmemcached + PHP 的 memcached 扩展,并确保 memcached 服务端已独立运行 —— 否则 new Memcached() 会直接报 Class 'Memcached' not found 或连接失败。
确认 phpEnv 环境是否支持编译扩展
phpEnv 是基于源码编译的 PHP 版本管理工具,它默认不带 memcached 扩展,但支持后续追加。关键前提是:系统已安装编译依赖和 libmemcached 库。
- Ubuntu/Debian 必装:
sudo apt-get install libmemcached-dev build-essential autoconf - CentOS/RHEL 必装:
sudo yum install libmemcached-devel gcc autoconf - macOS(Homebrew):
brew install libmemcached,并确保pkg-config可用 - 检查
libmemcached是否就位:pkg-config --modversion libmemcached能输出版本号才算成功
为当前 phpEnv PHP 版本安装 memcached 扩展
不能直接用 pecl install memcached(phpEnv 下常因路径错乱失败),必须走 phpize + 指定配置路径的手动流程。
- 进入 phpEnv 的 ext 目录(例如你用的是 PHP 8.2):
cd ~/.phpenv/versions/8.2.0/share/php/pear,然后用pecl download memcached,或直接从 PECL 官网 下载memcached-3.2.0.tgz - 解压后进入目录:
tar xzfv memcached-3.2.0.tgz && cd memcached-3.2.0 - 调用当前 PHP 版本的
phpize:~/.phpenv/versions/8.2.0/bin/phpize - 配置时显式指定
php-config和libmemcached路径:./configure --with-php-config=~/.phpenv/versions/8.2.0/bin/php-config --with-libmemcached-dir=/usr(路径按你实际libmemcached安装位置调整) - 编译安装:
make && make install,成功后会输出类似Installing '/home/xxx/.phpenv/versions/8.2.0/lib/php/extensions/no-debug-zts-20220829/memcached.so' - 在
~/.phpenv/versions/8.2.0/etc/php.ini末尾添加:extension=memcached.so
启动 memcached 服务端(不是 PHP 扩展的事)
很多人卡在这步:以为装完 PHP 扩展就自动有了缓存服务 —— 实际上 memcached 是一个独立的 C 守护进程,PHP 扩展只是它的客户端。没它,addServer() 连的全是空地址。
- Ubuntu/Debian:
sudo apt-get install memcached,然后sudo systemctl enable --now memcached - macOS:
brew install memcached && brew services start memcached - 验证服务是否监听:
nc -zv 127.0.0.1 11211返回succeeded即通 - 别改默认端口除非必要;若改了,PHP 里
$mc->addServer('127.0.0.1', 11212)必须同步
测试代码与常见静默失败点
写完配置别急着跑业务逻辑,先用最小闭环验证:扩展加载、服务可达、协议可通。
<?php $mc = new Memcached();
$mc->addServer('127.0.0.1', 11211);
var_dump($mc->getStats()); // 应返回数组,含 version、uptime 等字段
$mc->set('test_key', 'hello', 60);
var_dump($mc->get('test_key')); // 应输出 string(5) "hello"
// 关键:不要只看 set() 返回 true —— 它只表示发包成功
if ($mc->getResultCode() !== Memcached::RES_SUCCESS) {
echo "Error: " . $mc->getResultMessage();
}
?>
- 如果
getStats()返回空数组或 false,大概率是addServer()失败(服务未启、防火墙拦截、IP 写错) - 如果
set()返回 true 但get()是 false,检查$mc->getResultCode()—— 常见RES_NOTFOUND表示 key 不存在,RES_SERVER_ERROR表示服务端异常 - CLI 下测试通过 ≠ Web 下可用:PHP-FPM 子进程可能继承损坏 socket,建议每次请求新建
Memcached实例,而非复用全局单例
最易被忽略的是:phpEnv 管理多个 PHP 版本时,每个版本的 php.ini 和扩展路径完全独立,装错版本或漏写 extension= 就等于没装。务必用 ~/.phpenv/versions/x.x.x/bin/php --ini 确认加载的是哪个 ini 文件,再用 ~/.phpenv/versions/x.x.x/bin/php -m | grep memcached 实锤是否启用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











