phpenv 不安装 Memcached 扩展,因其仅管理 PHP 版本切换;Memcached 客户端是独立 PECL 扩展,需为每个 PHP 版本手动编译安装并配置 php.ini 启用。

phpenv 本身不安装或管理 Memcached 扩展,它只管 PHP 版本切换;Memcached 客户端扩展(memcached)必须单独为每个 PHP 版本手动编译安装,否则 php -m 看不见它,new Memcached() 会报类未定义。
为什么 phpenv install 后没有 memcached 扩展?
phpenv 的 install 命令只下载、编译、安装 PHP 解释器本身(含内置扩展如 json、mbstring),但不会自动拉取 PECL 扩展。Memcached 客户端是独立的 PECL 扩展,依赖系统级库 libmemcached,必须显式构建。
常见错误现象:
- 运行 php -m | grep memcached 无输出
- phpinfo() 页面里找不到 memcached 模块区块
- 报错 Fatal error: Uncaught Error: Class 'Memcached' not found
- 确认当前生效的 PHP 版本:运行
which php和php -v,确保是你用phpenv local或global切换后的那个版本 - 不要试图用系统包管理器(如
apt install php-memcached)安装——它只会装给系统默认 PHP,对 phpenv 管理的 PHP 无效 - 必须进入该 PHP 版本的源码构建上下文,或使用
pecl install配合对应版本的phpize
为 phpenv 管理的 PHP 版本安装 memcached 扩展
核心逻辑:用目标 PHP 版本自带的 phpize 工具生成配置,再链接系统 libmemcached 编译。假设你已用 phpenv install 8.3.13 安装好 PHP:
- 先装系统依赖:
sudo apt install libmemcached-dev libsasl2-dev(Ubuntu/Debian)或sudo yum install libmemcached-devel cyrus-sasl-devel(CentOS/RHEL) - 用目标 PHP 版本的
phpize:运行~/.phpenv/versions/8.3.13/bin/phpize - 下载并解压 PECL memcached(推荐 3.2.0+,兼容 PHP 8.3):
wget https://pecl.php.net/get/memcached-3.2.0.tgz && tar xf memcached-3.2.0.tgz && cd memcached-3.2.0 - 配置编译路径:
./configure --with-php-config=~/.phpenv/versions/8.3.13/bin/php-config --with-libmemcached-dir=/usr - 编译安装:
make && make install—— 成功后会提示类似Installing shared extensions: /home/xxx/.phpenv/versions/8.3.13/lib/php/extensions/no-debug-zts-20230831/ - 启用扩展:在
~/.phpenv/versions/8.3.13/etc/php.ini末尾加一行extension=memcached.so
验证:~/.phpenv/versions/8.3.13/bin/php -m | grep memcached 应有输出;再执行 php -r "new Memcached(); echo 'OK';" 不报错即成功。
立即学习“PHP免费学习笔记(深入)”;
连接本地 Memcached 服务前必须确认的三件事
装完 PHP 扩展只是客户端就绪,服务端(memcached daemon)必须运行且网络可达,否则 connect(): Connection refused。
- 检查服务是否运行:
sudo systemctl status memcached(systemd)或ps aux | grep memcached - 确认监听地址和端口:默认是
-l 127.0.0.1 -p 11211,PHP 客户端初始化时得匹配:$m = new Memcached(); $m->addServer('127.0.0.1', 11211); - 防火墙放行(仅跨机器时):
sudo ufw allow 11211或sudo firewall-cmd --add-port=11211/tcp --permanent
注意:memcached(服务端)和 memcache(另一个已废弃的 PHP 扩展)名称极相似,但完全不兼容——别混淆两者,也别装错扩展。
phpenv 多版本下 memcached 配置容易被忽略的点
每个 phpenv 版本的 php.ini 是独立的,改错位置等于白改。
-
~/.phpenv/versions/8.3.13/etc/php.ini和~/.phpenv/versions/7.4.33/etc/php.ini是两份文件,必须分别添加extension=memcached.so - 扩展路径里的
no-debug-zts-20230831这串目录名随 PHP 主版本变化(如 PHP 8.2 是20220829),不能复用旧版本的.so文件 - 如果用了
phpenv shell 8.3.13临时切换,但忘了退出,后续操作可能误以为在全局版本下,导致扩展加载失败却不自知
最稳妥的做法:每次为新 PHP 版本安装扩展后,立刻用完整路径执行验证命令,例如 ~/.phpenv/versions/8.3.13/bin/php -m,不依赖当前 shell 的 php 别名。



















