CakeFest 2024: The Official CakePHP Conference

Memcached::addServer

(PECL memcached >= 0.1.0)

Memcached::addServerサーバーをサーバープールに追加する

説明

public Memcached::addServer(string $host, int $port, int $weight = 0): bool

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 が使用できるメモリの量に対応したものとなります。

戻り値

成功した場合に true を、失敗した場合に false を返します。

例1 Memcached::addServer() の例

<?php
$m
= new Memcached();

/* 2 つのサーバーを追加し、2 番目のサーバーが
最初のサーバーの 2 倍の確率で選択されるようにします */
$m->addServer('mem1.domain.com', 11211, 33);
$m->addServer('mem2.domain.com', 11211, 67);
?>

参考

add a note

User Contributed Notes 3 notes

up
19
mbarriolinares at gmail dot com
11 years ago
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);
}

}
?>
up
15
Dave
11 years ago
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'
up
2
Robbie De Lise
12 years ago
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
To Top