【问题标题】:How should persistent connections be uses with the PECL Memcached plugin for PHP?持久连接应该如何与 PHP 的 PECL Memcached 插件一起使用?
【发布时间】: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 实例?值得吗?

【问题讨论】:

标签: php memcached


【解决方案1】:

当您想要一个服务器池时,为您的 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 的请求,则两者都将存在于自己的进程中。

【讨论】:

  • 如果我没记错 memcached 持久运行(在 php 脚本执行之外),所以我认为您可以保存 persistent_id 并在再次运行 php 文件时使用它
  • 您说您必须重新添加服务器,但请注意,您发送给我的示例仅在尚未设置服务器时才显示重新添加服务器。请求终止后,连接肯定会持续存在。我试图弄清楚为什么当您使用persistent_id 时,有时会获得相同的连接,而有时却没有,以及是否存在因此而出现问题的风险。
  • 无论如何,你必须处理好这个案子。您不能期望永久获得相同的连接。如果由于任何原因连接丢失,您必须重新打开它。上面的注释(106865),检查空(getServerList())。如果为空,则重新打开连接。对我来说,使用 persistent_id 时获得相同的连接是没有风险的。
猜你喜欢
  • 2010-11-02
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2013-04-19
相关资源
最近更新 更多