PHP缓存结构(如果HIT跳过代码块)


PHP cache structure (skip code block if HIT)

基本上,我正在实现自己的缓存系统。理想情况下,它看起来像这样:

$CACHE->start($name);
   //CODE
$CACHE->end();

但那是我不希望找到的圣杯。基本上,$CACHE->start()检查缓存是命中还是未命中,如果是命中,它将跳过//CODE,直到$CACHE->end()。

我到目前为止最好的成绩是:

if ($CACHE->start($name)) {
   //CODE
}
$CACHE->end();

由于PHP支持匿名函数,我想:

$CACHE->make($name, function() {
   //CODE
});

但是这段代码有一个问题,代码不在同一个变量范围内。有办法绕过它吗?

更新:我已经切换到ruby,它允许将块传递给函数,非常适合此任务。

默认方法如何?下面的例子很常见,在memcached中经常使用。

   function doSomething()
   {
       $oCache = SomeRegistry::get('Cache');
       // Check for cached results.
       if ($oCache->exists('someKey')) {
           return $oCache->get('someKey');
       }
       $sCached = getSomeThing();
       $this->set('someKey', $sCached);
       return $sCached;
    }

它是基本的键值存储,不需要任何闭包技巧

Zend Framework包含一个跳过$cache->end()的缓存,假设页面的其余部分是缓存内容的一部分。

// Default cache ID is calculated from $_SERVER['REQUEST_URI']
$zendPageCache->start();
// ....
// No need for end

它并不适合所有的用例。

(我的评论的修改版本)

在匿名函数中,您可以使用'use'关键字将变量引入该作用域。

<?php
function () use ($container, $anythingElseYouMayWantToUse) {
    //...
}

你可以用goto实现第一个,但这是一种非常粗鲁的方法,你会被视为编程的敌人。

如果非要我选的话,我会选第二个