如何将持久连接与PHP的PECL Memcached插件一起使用?

时间:2014-07-21 18:23:04

标签: php memcached

PHP的Memcached(不是Memcache)PECL插件接受$ persistent_id作为其构造函数的一部分。

docs说:

  

默认情况下,Memcached实例在请求结束时被销毁。要创建在请求之间保持不变的实例,请使用persistent_id为实例指定唯一ID。使用相同的persistent_id创建的所有实例将共享相同的连接。

在具有多个Web服务器和多个共享memcached服务器的站点上使用(或不使用)$ persistent_id的最佳方法是什么?特别是,如果我总是分配相同的$ persistent_id,那么“共享实例”会成为瓶颈,而不同的php进程会等待实例吗?可以通过例如竞争条件创建具有相同$ persistent_id的其他实例吗?如果发生这种情况,那些附加连接会发生什么?流程之间的那些实例会发生什么?

至少,根据我的测试,不止一个“连接”可以具有相同的$ persistent_id。我做了一个简单的测试,我使用相同的$ persistent_id创建了Memcached实例,并为它们添加了不同的服务器,然后加载并回显出服务器;有时我会得到第一组,有时是第二组,总是使用相同的$ persistent_id。

此外,很明显将服务器添加到其中一个共享实例时会出现问题。因为Memcached允许你多次添加同一个服务器,所以我看到了在添加服务器之前应该用getServerList()检查服务器的建议,并且只有在没有填充服务器列表时才添加它们。根据这些实例的共享程度,这似乎是一种潜在的竞争条件 - 两个进程是否可能同时将服务器添加到同一个实例,从而破坏服务器列表?

有没有办法在没有竞争条件的进程之间安全地共享Memcached实例?值得做吗?

1 个答案:

答案 0 :(得分:1)

为您设置相同的persistent_id当您需要服务器池时,MemCache服务器是正常情况。

doc:

中的示例
/* Create a persistent instance */
$m2 = new Memcached('story_pool');
$m3 = new Memcached('story_pool');

/* now $m2 and $m3 share the same connection */

请注意,即使使用持久性ID,您也必须重新添加服务器,请参阅http://php.net/manual/en/memcached.construct.php#93536

另请参阅此重要提示:http://php.net/manual/en/memcached.construct.php#106865

您的要求是独立的。 PHP不会共享其请求。因此,如果您有两个(或更多)具有相同persistent_id的请求,则它们将存在于自己的进程中。