#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, но это очень грубый подход, и на вас будут смотреть как на врага программирования.
Я бы выбрал второе, если бы мне пришлось выбирать.