1

php.net によると、成功時または失敗時にmemcache_connect()返されるはずTRUEFALSEです。したがって、キャッシュ サーバーのアドレスを存在しないアドレスに変更しても、次のコードは機能するはずだと考えましたが、機能しませんでした。

    $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 に答える