You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中Memcached的addServer在服务器宕机时不返回False,如何判断连接状态?

问题分析

addServer()方法的特性是仅将服务器地址添加到客户端的服务器列表中,不会立即建立连接或验证服务器是否可达,所以哪怕目标服务器不存在,它也会返回true,这就是你得到OK的原因。

正确的连接验证方法

以下是几种可靠的验证方式:

1. 通过服务器统计信息检查

添加服务器后,调用getStats()获取所有服务器的运行状态,根据返回结果判断目标服务器是否正常:

$memcached = new Memcached;
$memcached->addServer('127.0.0.22', 11212);

// 获取所有服务器的统计数据
$stats = $memcached->getStats();
$targetKey = '127.0.0.22:11212';

if (!isset($stats[$targetKey]) || empty($stats[$targetKey])) {
    die('memcached server error');
} else {
    echo 'OK';
}

2. 执行实际操作并检查错误码

尝试执行一个简单的Memcached操作(比如get或set),然后通过getResultCode()获取操作结果码,判断是否连接失败:

$memcached = new Memcached;
$memcached->addServer('127.0.0.22', 11212);

// 尝试获取一个不存在的key,触发连接尝试
$memcached->get('test_key');
$code = $memcached->getResultCode();

// 常见的连接失败错误码
$errorCodes = [
    Memcached::RES_SERVER_ERROR,
    Memcached::RES_CONNECTION_SOCKET_CREATE_FAILURE,
    Memcached::RES_CONNECTION_FAILURE
];

if (in_array($code, $errorCodes)) {
    die('memcached server error');
} else {
    echo 'OK';
}

3. 检查服务器版本

调用getVersion()获取所有服务器的版本信息,不存在的服务器会返回false:

$memcached = new Memcached;
$memcached->addServer('127.0.0.22', 11212);

$versions = $memcached->getVersion();
$targetKey = '127.0.0.22:11212';

if (!isset($versions[$targetKey]) || $versions[$targetKey] === false) {
    die('memcached server error');
} else {
    echo 'OK';
}

内容的提问来源于stack exchange,提问作者Mr.TT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:18:18