Структура кэша PHP (пропустить блок кода при ПОПАДАНИИ)

#php #caching #scope #control-structure

#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, который позволяет передавать блок в функцию, идеально подходящую для этой задачи.

Комментарии:

1. Еще одна идея связана с оператором GOTO, но это настолько уродливо, что я не планирую использовать.

2. Вы можете получить доступ к определенным переменным, добавив use ($var1, $var2, …) к определению анонимной функции, но нет способа сделать доступными все переменные из родительской области.

3. если ($cache->start()) { …. } $cache-> end(); может быть примерно таким же хорошим, как и получается. Zend Framework включает в себя кэш, который пропускает $cache-> end(), предполагая, что оставшаяся часть страницы является частью кэшированного содержимого. Однако не подходит для всех случаев.

4. Все получили 1 🙂 Я все еще ищу ПРОСТЫЕ идеи.

5. @rrehbein: Пожалуйста, напишите свой комментарий в качестве ответа, чтобы я мог его принять. Это помогло больше всего, поэтому я хочу принять ваш ответ.

Ответ №1:

Как насчет подхода по умолчанию? Приведенный ниже пример довольно распространен и используется, например, в 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;
    }
  

Это базовое хранилище значений ключа, и для его закрытия не требуются какие-либо хитрости.

Комментарии:

1. Да, но это не очень просто. Это также трудно запомнить.

Ответ №2:

Zend Framework включает в себя кэш, который пропускается $cache->end() , предполагая, что оставшаяся часть страницы является частью кэшированного содержимого.

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

// ....

// No need for end
  

Однако это подходит не для всех вариантов использования.

(Измененная версия моего комментария)

Ответ №3:

В анонимной функции вы можете использовать ключевое слово ‘use’ для переноса переменных в эту область.

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

Вы могли бы реализовать первый с помощью goto, но это очень грубый подход, и на вас будут смотреть как на врага программирования.

Я бы выбрал второе, если бы мне пришлось выбирать.