PHP Conference Japan 2024

Memcache::addServer

(PECL memcache >= 2.0.0)

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

描述

Memcache::addServer(
    字符串 $host,
    整数 $port = 11211,
    布尔值 $persistent = ?,
    整数 $weight = ?,
    整数 $timeout = ?,
    整数 $retry_interval = ?,
    布尔值 $status = ?,
    可调用 $failure_callback = ?,
    整数 $timeoutms = ?
): 布尔值

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

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

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

注意:

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

参数

host

指向 memcached 正在监听连接的主机。此参数还可以指定其他传输方式,例如 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

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

failure_callback

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

timeoutms

返回值

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

示例

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

<?php

/* 面向对象 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 条注释

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

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

可以实现一个客户端库,对键进行 CRC 计算,并对实例列表中的实例数量进行取模运算,以从列表中选择一个实例用于设置/获取操作。这确保了数据在节点之间均匀分布。

只要您以一致的方式使用 addServer 添加 Memcache 实例列表,所有这些操作在您的 PHP 代码中都会在后台顺利完成。
3
enno dot rehling at gmail dot com
13 年前
$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)。
2
joewynn dot nz+phpnet at gmail dot com
11 年前
请注意,此方法将始终返回 TRUE,因为在调用时实际上并未建立连接。有关更多信息,请参阅此错误报告:https://bugs.php.net/bug.php?id=58193
1
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() 命令时)。
0
iwind dot liu at gmail dot com
14 年前
服务器的权重必须大于 0。

如果没有可用的 Memcached 服务器,并且您尝试设置/添加变量,则 Apache 将崩溃,错误日志文件中会出现错误消息“[notice] child pid 18725 exit signal Segmentation fault (11)”。
-5
Jean-Baptiste Quenot
16 年前
"weight" 参数的默认值为 1
To Top