2011-09-02 63 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的官方文檔在哪裏用'd'命名的「memcached」名稱的PHP模塊?當他們將它命名爲與守護進程完全相同的名字時,試圖找到實際的文檔非常令人沮喪...... ARGH! – MicronXD

+0

whats the $ 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

使用SASL連接到沒有SASL認證的Memcached時,這不起作用。 – Dereckson

+2

你還需要檢查'pid',因爲如果一個服務器被添加但沒有連接,它仍然顯示在統計數據中,但是使用'pid = -1' 所以我建議這樣做: 'return $ status [$ addr。「:」。$ port] ['pid']> 0);' –

+0

這對我沒有用。 –

-1

http://php.net/memcache.addserver指出

使用此方法時(而不是內存緩存:: connect()和內存緩存: :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; 
    } 
} 
相關問題