Memcache::addServer

(PECL memcache >= 2.0.0)

Memcache::addServer将 Memcached 服务器添加到连接池

描述

Memcache::addServer(
    string $host,
    int $port = 11211,
    bool $persistent = ?,
    int $weight = ?,
    int $timeout = ?,
    int $retry_interval = ?,
    bool $status = ?,
    callable $failure_callback = ?,
    int $timeoutms = ?
): bool

Memcache::addServer() 将服务器添加到连接池。您也可以使用 memcache_add_server() 函数。

使用此方法(与 Memcache::connect()Memcache::pconnect() 相比),网络连接不会在实际需要之前建立。因此,将大量服务器添加到池中不会产生开销,即使它们可能不会全部使用。

故障转移可能发生在任何阶段的任何方法中,只要其他服务器可用,用户就不会注意到请求。任何类型的套接字或 Memcached 服务器级别的错误(内存不足除外)都可能触发故障转移。正常的客户端错误(例如添加现有键)不会触发故障转移。

注意:

此函数已添加到 Memcache 2.0.0 版中。

参数

host

指向 Memcached 正在监听连接的 host。此参数还可以指定其他传输方式,例如 unix:///path/to/memcached.sock 使用 UNIX 域套接字,在这种情况下,port 也必须设置为 0

port

指向 Memcached 正在监听连接的端口。在使用 UNIX 域套接字时,将此参数设置为 0

请注意:如果没有指定 port,则默认设置为 memcache.default_port。因此,建议在方法调用中明确指定端口。

persistent

控制是否使用持久连接。默认值为 true

weight

为该服务器创建的桶数,进而控制它被选中的概率。概率是相对于所有服务器的总权重而言的。

timeout

以秒为单位的值,将用于连接到守护程序。在更改默认值 1 秒之前请三思而后行 - 如果连接速度太慢,您可能会失去缓存的所有优势。

retry_interval

控制失败服务器将被重试的频率,默认值为 15 秒。将此参数设置为 -1 将禁用自动重试。当通过 dl() 动态加载扩展时,此参数和 persistent 参数均无效。

每个失败的连接结构都有自己的超时时间,在超时时间到期之前,在选择后端来处理请求时,将跳过该结构。超时时间到期后,连接将成功重新连接或被标记为失败另外 retry_interval 秒。典型的效果是,每个 Web 服务器子进程在处理页面时大约每 retry_interval 秒重试一次连接。

status

控制服务器是否应该被标记为在线。将此参数设置为 falseretry_interval 设置为 -1,允许将失败的服务器保留在池中,以免影响密钥分配算法。然后,对该服务器的请求将根据 memcache.allow_failover 设置进行故障转移或立即失败。默认值为 true,表示服务器应被视为在线。

failure_callback

允许用户指定一个回调函数,在遇到错误时运行。回调函数在尝试故障转移之前运行。该函数接受两个参数,即失败服务器的主机名和端口。

timeoutms

返回值

成功时返回 true,失败时返回 false

示例

示例 #1 Memcache::addServer() 示例

<?php

/* OO API */

$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211);
$memcache->addServer('memcache_host2', 11211);

/* 过程式 API */

$memcache_obj = memcache_connect('memcache_host', 11211);
memcache_add_server($memcache_obj, 'memcache_host2', 11211);

?>

注释

警告

port 未指定时,此方法默认为 PHP ini 指令 memcache.default_port 的值设置。如果此值在您的应用程序的其他地方被更改,可能会导致意外结果:因此,建议始终在方法调用中明确指定端口。

参见

添加注释

用户贡献的注释 6 notes

rstaveley at seseit dot com
13 年前
Memcache 客户端库负责选择正确的服务器来设置/获取数据。这就是为什么当您有多个 Memcache 服务器时,您希望使用 addServer 而不是 connect。随后的 set/get 将根据需要按需连接到适当的实例。当您关闭或脚本终止时,将断开连接到所有已连接服务器的连接。

通过 addServer 添加到您的 Memcache 对象的 Memcache 实例应在您的应用程序中以相同的顺序添加,以确保为同一键选择相同的服务器。

客户端库可以实现为对键运行 CRC 并对列表中的实例数量进行模运算,以便从列表中选择一个实例进行 set/get。这确保了数据在节点之间很好地分布。

只要您以一致的方式使用 addServer 添加 Memcache 实例列表,所有这些操作都会在 PHP 代码中为您顺利完成。
enno dot rehling at gmail dot com
12 年前
$timeoutms 参数可用于指定以毫秒为单位的超时时间,但并非所有版本都提供。例如,它存在于 php_memcache 2.2.6 中,但不存在于 3.0.4 中。在 2.2.6 中,如果您指定它,它将覆盖 $timeout。

注意:如果未指定 $timeoutms,它将默认为 php.ini 中的 memcache.default_timeout_ms 值,如果未设置,则默认为 1000。这也将覆盖 $timeout,这会导致 $timeout 在 php_memcache 2.2.6 中始终被忽略(按优先级顺序,要么支持 $timeoutms,要么支持 memcache.default_timeout_ms,要么支持值 1000)。
joewynn dot nz+phpnet at gmail dot com
10 年前
请注意,此方法将始终返回 TRUE,因为在调用时不会实际建立连接。有关更多信息,请参阅此错误报告:https://bugs.php.net/bug.php?id=58193
eu at serbannistor dot ro
13 年前
实际上,如果您有两个 Memcached 服务器,其中一个在本地主机上,另一个在远程机器上,即使您为本地服务器指定了回环地址,您也可以与两者通信。

<?php
$memcache_obj
= memcache_connect("127.0.0.1", 11211);
memcache_add_server($memcache_obj, "memcache_remote_host");
$memcache_obj->set('var_key', time());
?>

这将与两个主机通信,但必须考虑两个方面
1. 与两个主机的通信将通过不同的网络接口完成。它将使用回环接口与“127.0.0.1”主机通信(在我的 Linux 系统上是 lo),并使用外部接口与“memcache_remote_host”通信(在我的系统上是 eth0)。只有当您想使用相同的网络接口与两个主机通信时,您才需要使用两台机器的外部 IP(所有通信都将通过 eth0 接口进行)。
2. 由于 memcache_connect() 和 memcache_add_server() 的工作方式,与两个主机的连接将以不同的方式建立。因此,memcache_connect() 将在调用时通过回环接口启动与本地主机的连接,而 memcache_add_server() 只是将第二个服务器添加到池中,但在绝对需要之前不会通过网络发送任何数据包(例如,当发出 memcache_set() 命令时)。
iwind dot liu at gmail dot com
14 年前
服务器的权重必须大于 0。

如果没有 Memcached 服务器可用,并且您尝试设置/添加变量,Apache 将会崩溃,错误日志文件中会出现错误消息“[注意] 子进程 18725 退出信号段错误 (11)”。
Jean-Baptiste Quenot
16 年前
“weight”参数的默认值为 1
To Top