我最近想过如何在PHP应用程序中使用getDelayed
和getMulti
,以及它们的区别。
阅读有关getDelayed的文档:
“该方法不等待响应 并马上回来。当你是 准备收集物品,打电话 Memcached :: fetch或 memcached的::使用fetchall“。
显然,在使用密钥之前需要调用fetchAll,这与getMulti
不同。但实际的memcached调用何时完成?
在fetchAll
或getDelayed
运行时?
更新了示例:
$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.
答案 0 :(得分:4)
Memcache IO在getDelayed
或fetchAll
上发生。
getDelayed
基本上说“我想要这些钥匙,但我现在不需要它们”。
这样做的主要好处是它允许PHP在后台执行此操作作为并行操作。如果您知道以后在一个过程中需要哪些键,您可以让PHP去获取它们,当您需要它时,请拨打fetchAll
。
如果PHP在设置其他内容时设法获取数据,那么当您调用fetchAll
时,就没有等待。如果没有,则当Memcached中的数据完成传输时,进程暂停。
一个非常愚蠢的例子是,如果你有两件事要做:
如果您只是调整了图像大小,然后使用getMulti
,则需要5秒钟。
如果您为密钥调用getDelayed
,然后调整图像大小,然后使用fetchAll
,整个过程只需3秒。
答案 1 :(得分:3)
这是在那段时间之间完成的。基本上,当你调用getDelayed时,它会告诉该服务器上的memcache客户端它需要这些密钥,然后它将返回以便稍后获取它们。因此,当memcache客户端执行fetch时,您的PHP脚本可以自由地执行它想要的操作。然后,当你需要它们时,你可以调用fetchAll。如果在调用fetchAll时所有数据都已可用,则会立即返回。如果没有,它将阻塞,直到所有数据都准备就绪。
getMulti和fetchAll都是blocking次调用。他们等到他们要返回所有数据。 getDelayed是非阻塞的,因为它会立即返回,无论它是否有数据(因为你在以后需要时“拉”数据)。
你将使用getDelayed的一个例子是这样的:假设你有一个应用程序,你知道你需要一个来自memcached的大对象(比如一个渲染的html页面)。一旦你知道你将需要它,你可以调用getDelayed。然后,您可以处理所有应用程序清理,日志记录或标题等。完成所有操作后,您可以调用fetchAll将数据实际导入到脚本中。由于其他一切都已经完成,您需要做的就是回显数据并消亡。