PHP缓存结构(命中时跳过代码块)

PHP缓存结构(命中时跳过代码块),php,caching,scope,control-structure,Php,Caching,Scope,Control Structure,基本上,我正在实现自己的缓存系统。理想情况下,它将如下所示: $CACHE->start($name); //CODE $CACHE->end(); 但这是我不希望找到的圣杯。基本上,$CACHE->start()检查缓存是命中还是未命中,以及是否命中,它跳过//代码直到$CACHE->end() 到目前为止,我取得的最好成绩是: if ($CACHE->start($name)) { //CODE } $CACHE->end(); 由于PHP支持匿名函数

基本上,我正在实现自己的缓存系统。理想情况下,它将如下所示:

$CACHE->start($name);
   //CODE
$CACHE->end();
但这是我不希望找到的圣杯。基本上,$CACHE->start()检查缓存是命中还是未命中,以及是否命中,它跳过//代码直到$CACHE->end()

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

if ($CACHE->start($name)) {
   //CODE
}
$CACHE->end();
由于PHP支持匿名函数,我想到:

$CACHE->make($name, function() {
   //CODE
});
但该代码存在一个问题,即代码不在同一变量范围内。有没有机会绕过这个


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

默认方法如何?下面的示例非常常见,用于memcached f.e

   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;
    }

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

默认方法如何?下面的示例非常常见,用于memcached f.e

   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;
    }

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

在匿名函数中,您可以使用“use”关键字将变量带入该范围

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

在匿名函数中,可以使用“use”关键字将变量带入该范围

<?php
function () use ($container, $anythingElseYouMayWantToUse) {
    //...
}
Zend框架包括一个跳过
$cache->end()
,假设页面的其余部分是缓存内容的一部分

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

// ....

// No need for end
但它并不适合所有的用例

(我的评论的修改版本)

Zend框架包含一个脚本,它通过假设页面的其余部分是缓存内容的一部分来跳过
$cache->end()

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

// ....

// No need for end
但它并不适合所有的用例


(我的评论的修改版本)

还有一个想法是使用GOTO语句,但这太难看了,我不打算使用。您可以通过在匿名函数定义中添加
use($var1,$var2,…)
来访问特定变量,但无法使父作用域中的所有变量都可用。if($cache->start()){……}$cache->end();可能是最好的了。Zend Framework包含一个缓存,它通过假设页面的其余部分是缓存内容的一部分来跳过$cache->end()。但并不适合所有情况。每个人都得到+1:)我仍然在寻找简单的想法。@rrehbein:请写下你的评论作为答案,这样我就可以接受了。它帮助最大,所以我想接受你的答案。还有一个想法是使用GOTO语句,但它太难看了,我不打算使用。你可以通过在匿名函数定义中添加
use($var1,$var2,…)
来访问特定变量,但无法使父作用域中的所有变量都可用。如果($cache->start()){..}$cache->end();可能已经足够好了。Zend Framework包含一个跳过$cache->end()的缓存假设页面的其余部分是缓存内容的一部分。但并不适合所有情况。每个人都得到+1:)我仍然在寻找简单的想法。@rrehbein:请将您的评论作为答案写下来,这样我就可以接受了。它帮助最大,所以我想接受您的答案。是的,但这不是很简单。这也很难记住。是的,但这是s不是很简单,也很难记住。