PECL Memcached PHP插件应该如何使用持久连接?

PECL Memcached PHP插件应该如何使用持久连接?,php,memcached,Php,Memcached,用于PHP的Memcached(不是Memcache)PECL插件接受$persistent_id作为其构造函数的一部分 他们说: 默认情况下,Memcached实例将在请求结束时销毁。要创建在请求之间持久化的实例,请使用persistent_id为实例指定唯一的id。使用相同的持久化\u id创建的所有实例将共享相同的连接 在具有多个Web服务器和多个共享memcached服务器的站点上使用(或不使用)$persistent_id的最佳方式是什么?特别是,如果我总是分配相同的$persiste

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

他们说:

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

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

至少,根据我的测试,不止一个“连接”可以有相同的$persistent\u id;有时我会得到第一组,有时是第二组,总是使用相同的$persistent\u id

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


有没有一种方法可以在没有争用条件的进程之间安全地共享Memcached实例?值得这么做吗?

当您需要一个服务器池时,为您的MemCache服务器设置相同的持久\u id是正常情况

文档中的示例:

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

/* now $m2 and $m3 share the same connection */
请注意,即使使用持久id,也必须重新添加服务器,请参阅

另见本重要说明:


您的请求是独立的。PHP不共享它的请求。因此,如果您有两个(或更多)具有相同持久id的请求,这两个请求都将进入各自的进程。

Hmm。。。我的问题似乎与这个没有得到答复的问题有关。如果我记得正确,memcached可以持久运行(在php脚本执行之外),因此我认为您可以保存persistent_id并在另一次运行php文件时使用它。您说您必须重新添加服务器,但请注意,您发送给我的示例显示,只有在服务器尚未设置时,才重新添加服务器。请求终止后,连接肯定会保持。我试图弄明白为什么当你使用持久的id时,有时你会得到相同的连接,有时你不会,如果因此有任何问题的风险。无论如何,你必须处理好这个问题。您不能期望永久获得相同的连接。如果由于任何原因导致连接丢失,您必须重新打开连接。在上面的注释(106865)中,检查是否为空(getServerList()。如果为空,则重新打开连接。对我来说,当你使用persistent_id时,没有获得相同连接的风险。