PHP连Memcached前需先检查扩展启用和端口连通性,再调用addServer后用getVersion()探测连接,配合setOptions设置connect_timeout与retry_timeout防卡死,并用isPristine()和getVersion()组合判断连接状态。

PHP连Memcached前先检查扩展和端口通不通
连不上 Memcached,八成不是代码问题,而是环境没准备好。先确认 memcached 扩展已启用(注意不是 memcache,两者不兼容),运行 php -m | grep memcached 看是否在列表里;再用 telnet 127.0.0.1 11211 或 nc -zv 127.0.0.1 11211 测试端口是否可连——很多“连接超时”其实是防火墙或服务根本没起来。
new Memcached() 后必须调用 addServer 并检查返回值
new Memcached() 只是初始化客户端对象,不自动连服务器。必须显式调用 addServer(),且它返回 true 不代表连接成功,只是把地址加进列表。真正在第一次读写时才建立连接。所以关键操作前要加兜底判断:
$mc = new Memcached();
$mc->addServer('127.0.0.1', 11211);
// 立即探测连通性
if (!$mc->getVersion()) {
error_log("Memcached server unreachable at 127.0.0.1:11211");
// 触发降级逻辑,比如跳过缓存直连数据库
}
设置 connect_timeout 和 retry_timeout 防卡死
默认连接超时是无限的,一旦网络抖动或服务假死,PHP 进程会 hang 住。必须通过 setOptions() 显式设超时:
-
Memcached::OPT_CONNECT_TIMEOUT:单位毫秒,建议设100~500 -
Memcached::OPT_RETRY_TIMEOUT:重试间隔,设1(秒)足够 - 别碰
Memcached::OPT_SEND_TIMEOUT和OPT_RECV_TIMEOUT,它们在 PHP 8+ 已废弃,设了反而报错
示例:
立即学习“PHP免费学习笔记(深入)”;
$mc->setOptions([
Memcached::OPT_CONNECT_TIMEOUT => 300,
Memcached::OPT_RETRY_TIMEOUT => 1,
]);
用 isPristine() + getVersion() 组合判断连接是否还活着
Memcached 客户端不会自动感知服务断连,一次失败后后续请求仍可能走旧连接。不能只靠捕获异常,得主动探测:
-
isPristine()返回false表示内部连接已断开或未初始化 -
getVersion()成功返回版本数组才算真正可用 - 二者缺一不可——有些场景
isPristine()还是true,但连接其实已失效
复杂点在于:这个探测本身也有开销,别每个请求都跑一遍;适合放在连接复用池初始化、或上一次操作报错后的恢复路径里。











