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
相关产品推荐
相关产品推荐

