【发布时间】:2014-07-21 18:23:03
【问题描述】:
用于 PHP 的 Memcached(不是 Memcache)PECL 插件接受 $persistent_id 作为其构造函数的一部分。
docs 说:
默认情况下,Memcached 实例在请求结束时被销毁。要创建在请求之间持续存在的实例,请使用 persistent_id 为实例指定唯一 ID。使用相同 persistent_id 创建的所有实例将共享相同的连接。
在具有多个网络服务器和多个共享 memcached 服务器的站点上使用(或不使用)$persistent_id 的最佳方式是什么?特别是,如果我总是分配相同的 $persistent_id,“共享实例”是否会成为瓶颈,而不同的 php 进程会等待该实例?是否可以通过例如竞争条件创建具有相同 $persistent_id 的其他实例?如果发生这种情况,这些额外的连接会发生什么?进程之间的这些实例会发生什么?
至少,根据我的测试,多个“连接”可以具有相同的 $persistent_id。我做了一个简单的测试,我创建了具有相同 $persistent_id 的 Memcached 实例并向它们添加不同的服务器,然后加载并回显服务器;有时我会得到第一组,有时是第二组,总是使用相同的 $persistent_id。
此外,很明显,将服务器添加到这些共享实例之一时会出现问题。因为 Memcached 允许您多次添加同一服务器,所以我看到有人建议在添加服务器之前使用 getServerList() 检查服务器,并且仅在未填充服务器列表时才添加它们。根据这些实例的共享程度,这似乎是一种潜在的竞争条件——两个进程是否有可能同时将服务器添加到同一个实例,从而破坏服务器列表?
有没有办法在没有竞争条件的进程之间安全地共享 Memcached 实例?值得吗?
【问题讨论】:
-
嗯...我的问题似乎与这个问题有关,但没有收到任何回复。 stackoverflow.com/questions/19451582/…