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实例?值得做吗?
答案 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的请求,则它们将存在于自己的进程中。