Memcached::addServer
(PECL memcached >= 0.1.0)
Memcached::addServer — サーバーをサーバープールに追加する
説明
Memcached::addServer() は、指定したサーバーをサーバープールに追加します。
この時点では、サーバーへの接続は確立されません。しかし、一貫性のあるキー分散オプションを
(Memcached::DISTRIBUTION_CONSISTENT
あるいは
Memcached::OPT_LIBKETAMA_COMPATIBLE
で) 指定した場合は、
内部データ構造のうちの一部が更新されます。
したがって、もし複数のサーバーを追加したい場合は、
Memcached::addServers() を使用するほうがよいでしょう。
その場合、更新は一度しか発生しません。
同じサーバーがサーバープール内で複数回あらわれることもあります。
重複チェックはしていないからです。これは望ましい状態ではありません。
その代わりに weight
オプションを使用して、
このサーバーを選択する重みを増やします。
パラメータ
host
-
memcache サーバーのホスト名。ホスト名が無効な場合は、データ関連の操作の結果コードに
Memcached::RES_HOST_LOOKUP_FAILURE
が設定されます。 バージョン 2.0.0b1 以降では、このパラメータにソケットのパス (/path/to/memcached.sock
など) を指定すると、 UNIX ドメインソケットを使えるようになりました。 このとき、port
には0
を設定する必要があります。 port
-
memcache が動作しているポート。通常、これは
11211
となります。 バージョン 2.0.0b1 以降では、UNIX ドメインソケットを利用する際には0
を設定します。 weight
-
プール内の全サーバーにおけるそのサーバーの重み。 これで、何か操作をしたときにそのサーバーが選択される確率を制御します。 これは、一貫性のある分散オプションを使っている場合にのみ使用でき、 通常はそのサーバー上で memcache が使用できるメモリの量に対応したものとなります。
例
例1 Memcached::addServer() の例
<?php
$m = new Memcached();
/* 2 つのサーバーを追加し、2 番目のサーバーが
最初のサーバーの 2 倍の確率で選択されるようにします */
$m->addServer('mem1.domain.com', 11211, 33);
$m->addServer('mem2.domain.com', 11211, 67);
?>
参考
- Memcached::addServers() - 複数のサーバーをサーバープールに追加する
- Memcached::resetServerList() - サーバーリストからすべてのサーバーを消去する
User Contributed Notes 3 notes
Important to not call ->addServers() every run -- only call it if no servers exist (check getServerList() ); otherwise, since addServers() does not check for dups, it will let you add the same server again and again and again, resultings in hundreds if not thousands of connections to the MC daemon. Specially when using FastCGI.
Example:
<?php
class Cache {
private $id;
private $obj;
function __construct($id){
$this->id = $id;
$this->obj = new Memcached($id);
}
public function connect($host , $port){
$servers = $this->obj->getServerList();
if(is_array($servers)) {
foreach ($servers as $server)
if($server['host'] == $host and $server['port'] == $port)
return true;
}
return $this->obj->addServer($host , $port);
}
}
?>
As of version 2.0.0b1 you can use Unix socket.
<?php
$m = new Memcached();
$m->addServer('/path/to/socket',0);
?>
Not to be confused with Memcache that use 'unix:///path/to/socket'
On my Debian Squeeze system I was getting WRITE FAILURE errors. After debugging and finally tcpdump it seems that the problem was me adding the server 'localhost', which resolved to '::1' (ipv6) while the default memcached server on debian only listens to '127.0.0.1' (ipv4). DNS automatically prefers ipv6 over ipv4.
I added the server '127.0.0.1' instead and everything worked. You could also disable ipv6 or have memcached listen on ::1