持久性连接应该如何与PECL Memcached插件一起使用?


How should persistent connections be uses with the PECL Memcached plugin for PHP?

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

医生说:

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

什么是最好的方式来使用(或不使用)$persistent_id与多个web服务器和几个共享的memcached服务器的网站?特别是,如果我总是分配相同的$persistent_id,"共享实例"会成为瓶颈,而不同的php进程等待实例吗?是否可以创建具有相同$persistent_id的其他实例,例如,通过竞争条件?如果发生这种情况,那些额外的连接会发生什么?进程之间的那些实例发生了什么?

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

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

是否有一种方法可以在没有竞争条件的情况下安全地在进程之间共享Memcached实例?这值得做吗?

为MemCache服务器设置相同的persistent_id是一个正常的情况,当你想要一个服务器池。

文档中的示例:

/* 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不共享请求。因此,如果您有2个(或更多)具有相同persistent_id的请求,它们都将存在于自己的进程中。