1

根据 php.net,memcache_connect()应该返回TRUEsuccess 或FALSEfailure。因此,我认为即使我将缓存服务器地址更改为不存在的地址,以下代码也应该可以工作,但它没有:

    $memcache=memcache_connect('myCacheServer.com', 11211);

    if($memcache){
        $this->connect=$memcache;
    }
    else{
        $memcache=memcache_connect('localhost', 11211);
        $this->connect=$memcache;
    }

这是我收到的错误消息:

Message: memcache_connect(): php_network_getaddresses: getaddrinfo failed: Temporary 
failure in name resolution

有谁知道我还能如何设置这个简单的布尔值?

4

3 回答 3

1

根据评论,不知道为什么上述方法不起作用,但有更好的方法来处理这个问题。

如果无法连接“myCacheServer.com”,则每次超时可能需要 30 秒。然后在超时之后,您将回退到本地主机 - 但如果您每次需要等待 30 秒,则运行 memcached 并没有多大意义。

我建议将服务器放在配置文件中,或者根据已知值进行驱动——比如

if (isset($_SERVER['HTTP_HOST']) && strpos($_SERVER['HTTP_HOST'], 'localhost') ) !== false) {
    define('MEMCAHCED_SERVER', 'localhost');
    define('MEMCAHCED_PORT', '11211');
} else {
    // assume live - alwways have live as the fallback
    define('MEMCAHCED_SERVER', 'myCacheHost.com');
    define('MEMCAHCED_PORT', '11211');
}

$memcache=memcache_connect(MEMCAHCED_SERVER, MEMCAHCED_PORT);   

// Set the status to true or false.
$this->connect=$memcache;

然后,为了满足您的需求(如果您希望远程服务器不可用),我会将这个事实存储在服务器上的文件中。它有点不正常,但会节省你的时间。

// Before calling memcache connect
if (file_exists(MyFlagFile) and filemtime(MyFlagFile) > time() - 600) {
     // Do Not Use Memcached as it failed within hte last 5 minutes
} else {
     // Try to use memcached again

     if (!$memcache) {
         // Write a file to the server with the time, stopping more tries for the next 5 minutes
         file_put_contents(MyFlagFile, 'Failed again');
     }
 }
于 2012-09-19T01:06:13.663 回答
0

我从php.net 的 Memcache 文档中找到了一个部分有效的解决方案。这意味着,向用户显示的错误被抑制,但如果缓存服务器不存在,您仍然需要等待很长的超时时间。

这是我的代码:

    $host='myCacheServer.com';
    $port=11211;
    $memcache = new Memcache();
    $memcache->addServer($host, $port);
    $stats = @$memcache->getExtendedStats();
    $available = (bool) $stats["$host:$port"];
    if ($available && @$memcache->connect($host, $port)){
            $this->connect=$memcache;
           // echo 'true';
    }

    else{
            $host='localhost';
            $memcache->addServer($host, $port);
            $this->connect=$memcache;
            //echo 'false';
    }    
于 2012-09-19T17:20:12.050 回答
0

我使用此代码检查连接

function checkConnection()
{
    try {
        $client = $this->initClient();
        $data = @$client->getVersion();
    } catch (Exception $e) {
        $data = false;
    }
    return !empty($data);
}
于 2016-01-28T14:01:14.800 回答