PHP memcached:getDelayed& getMulti - 怎么用?

时间:2010-05-28 12:49:32

标签: php memcached

我最近想过如何在PHP应用程序中使用getDelayedgetMulti,以及它们的区别。

阅读有关getDelayed的文档:

  

“该方法不等待响应   并马上回来。当你是   准备收集物品,打电话   Memcached :: fetch或   memcached的::使用fetchall“。

显然,在使用密钥之前需要调用fetchAll,这与getMulti不同。但实际的memcached调用何时完成? 在fetchAllgetDelayed运行时?

更新了示例:

    $this->memcached->set('int', 99);
    $this->memcached->set('string', 'a simple string');
    $this->memcached->set('array', array(11, 12));

    $this->memcached->getDelayed(array('int'));
    $this->memcached->getDelayed(array('string'));
    $this->memcached->getDelayed(array('array'));

    print("<pre>".print_r( $this->memcached->fetchAll() )."</pre>"); // returns the array element only.

2 个答案:

答案 0 :(得分:4)

Memcache IO在getDelayedfetchAll上发生。

getDelayed基本上说“我想要这些钥匙,但我现在不需要它们”。

这样做的主要好处是它允许PHP在后台执行此操作作为并行操作。如果您知道以后在一个过程中需要哪些键,您可以让PHP去获取它们,当您需要它时,请拨打fetchAll

如果PHP在设置其他内容时设法获取数据,那么当您调用fetchAll时,就没有等待。如果没有,则当Memcached中的数据完成传输时,进程暂停。

一个非常愚蠢的例子是,如果你有两件事要做:

  1. 调整花费3秒的图像。
  2. 从记忆中获取100个值,耗时2秒。
  3. 如果您只是调整了图像大小,然后使用getMulti,则需要5秒钟。

    如果您为密钥调用getDelayed,然后调整图像大小,然后使用fetchAll,整个过程只需3秒。

答案 1 :(得分:3)

这是在那段时间之间完成的。基本上,当你调用getDelayed时,它会告诉该服务器上的memcache客户端它需要这些密钥,然后它将返回以便稍后获取它们。因此,当memcache客户端执行fetch时,您的PHP脚本可以自由地执行它想要的操作。然后,当你需要它们时,你可以调用fetchAll。如果在调用fetchAll时所有数据都已可用,则会立即返回。如果没有,它将阻塞,直到所有数据都准备就绪。

getMulti和fetchAll都是blocking次调用。他们等到他们要返回所有数据。 getDelayed是非阻塞的,因为它会立即返回,无论它是否有数据(因为你在以后需要时“拉”数据)。

你将使用getDelayed的一个例子是这样的:假设你有一个应用程序,你知道你需要一个来自memcached的大对象(比如一个渲染的html页面)。一旦你知道你将需要它,你可以调用getDelayed。然后,您可以处理所有应用程序清理,日志记录或标题等。完成所有操作后,您可以调用fetchAll将数据实际导入到脚本中。由于其他一切都已经完成,您需要做的就是回显数据并消亡。