2011-09-02 3 views
3

в файле PHP, у меня есть:Модуль Memcached PHP: как узнать, не удалось ли соединение?

<?php 
$m = new Memcached(); 
echo get_class($m); 
echo "<br>"; 
echo $m->addServer('192.168.1.77', 11211, 1); 
$m->set("foo", "bar"); 
?> 

при запуске, около половины второго позже, я получаю:

Memcached 
1 

Если я перестану Memcached, примерно через 5 секунд, я получаю:

Memcached 
1 

Я ожидал что-то больше похоже на ...

Memcached 
0 

Как узнать, успешно ли вы попали на сервер memcached или нет? Я полностью ожидал, что это будет так же просто, как возвращаемое значение из addServer ... :(

+0

о да ... и кто-нибудь знает, где находится официальная документация для memcached php-module по имени «memcached» с «d»? Это так расстраивает, пытаясь найти фактическую документацию, когда они назвали это то же имя, что и демон ... ARGH! – MicronXD

+0

Что такое $ m-> addServer ('192.168.1.77', 11211, 1); возвращается? –

+0

возвращает '1' каждый раз ... независимо от того, работает ли мой memcached-демон на этом IP-адресе или нет ... – MicronXD

ответ

3

Это то, что я искал: Memcached :: getStats();

Итак, я написал:

add_memcached_server($m, $addr, $port) 
{ 
    $m->addServer($addr,$port); 
    $statuses = $m->getStats(); 
    return isset($statuses[$addr.":".$port]); 
} 

работает как шарм ...

+1

Это не работает при подключении к Memcached с SASL без аутентификации SASL. – Dereckson

+2

Вам также нужно проверить 'pid', потому что, если сервер добавлен, но не подключен, он все еще отображается в статистике, но с' pid = -1' , поэтому я бы предложил следующее: 'return ($ statuses [$ addr. ":". $ port] ['pid']> 0); ' –

+0

Это не сработало для меня. –

-1

http://php.net/memcache.addserver утверждает, что

При использовании этого метода (в отличие от Memcache :: подключения() и Memcache: :. pconnect()) подключение к сети не установлено, пока на самом деле не нужны

так что нет никакого способа addServer знает, если сетевое соединение установлено

использование http://php.net/memcache.connect вместо

+1

Даже если этот ответ верен, 'connect' не может быть заменен на' addServer', потому что последний используется, когда у вас есть пул нескольких серверов memcached – zerkms

+1

http: // in2 .php.net/memcache.getServerStatus – kranthi117

+2

Я использую 'memcached' (в отличие от' memcache' без 'd') – MicronXD

1

Ответ является

/** 
    * check for connection was established 
    * @param resource $m 
    * @param string $host 
    * @param int $port 
    * @access public 
    * @return bool 
    */ 
    function memConnected($m, $host, $port = 11211) 
    { 
     $statuses = $m->getStats(); 
     return (isset($statuses[$host.":".$port]) and $statuses[$host.":".$port]["pid"] > 0); 
    } 
0

Это, как я сделал это

/** 
* Add memcached server 
* @param String $new_ New Memcahed 
* @param String $addr Address 
* @param String $port Port 
* @return boolean 
*/ 
function add_memcached_server($new_, $addr, $port) 
{ 
    $new_->addServer($addr,$port); 
    $statuses = $new_->getStats(); 
    if($statuses[$addr.':'.$port]['uptime']<1){ 
     return false; 
    }else{ 
     return true; 
    } 
} 
Смежные вопросы