Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Примитивный метод кэширования образцов на PHP

Anna | 29.05.2014 | нет комментариев
Часто при разработке приложений на PHP встаёт вопрос кэширования каждого выводимого приложением образца, либо какой-то его части, которая достаточно неподвижная во времени. Если при разработке применялся какой-либо шаблонизатор, то данный вопрос решается «из коробки». Но не во всех приложениях на PHP применяются шаблонизаторы, а вопрос о кешировании образца либо его части остаётся открытым. Ниже описан один из вариантов решения данной задачи.

image

Ниже приведён код реализации класса для кэширования образца (дальше он будет рассмотрен чуть детально)

Класс TemplateCache

class TemplateCache
{
    /**
     * @var ICacheDriver
     */
    private $cacheDriver;

    public function __construct($cacheDriver = false, $options=array())
    {
        if(!$cacheDriver){
            $cacheDriver = new ArrayCacheDriver($options);
        }
        $this->cacheDriver = $cacheDriver;
    }

    public function setCacheDriver($cacheDriver)
    {
        $this->cacheDriver = $cacheDriver;
    }

    public function start($id, $group='template')
    {
        $content = $this->cacheDriver->get($id, $group);
        if($content){
            echo $content;
            return true;
        }
        ob_start();
        return false;
    }

    public function end($id, $group='template')
    {
        $content = ob_get_contents();
        $this->cacheDriver->store($id, $group, $content);
        ob_end_clean();
        echo $headerContent;
    }

    public function clean($group=false, $id=false)
    {
        this->cacheDriver->clean($group, $id);
    }

}

Данный класс работает дальнейший образом — кэширование запускается способом start. Если кэшируемый блок присутствует в кэше — то выводим его, получив из кэша, если нет — кешируем блок (либо целую страницу) образца. Кеширование заканчивается по вызову способа end.
Работа класса базируется на буферизации итога, расположенного между вызовами данных 2 способов и сохранении данного буфера в кэш.
Работа с хранилищем кэша инкапсулируется в отдельном классе, объект которого создаётся и передаётся в класс TemplateCache.
Данный класс должен реализовывать интерфейс ICacheDriver, приведённый ниже.

Интерфейс ICacheDriver

interface ICacheDriver
{
    public function store($id, $group, $data);
    public function get($id, $group);
    public function clean($group, $id);
}
Реализация ICacheDriver классом MemcachedCacheDriver

class MemcachedCacheDriver implements ICacheDriver
{
    private $memcache;
    private $server = "localhost";
    private $port = 11211;
    private $expires = 600;

    public function __construct($options=array())
    {
        $this->server = isset($options['server']) ? $options['server'] : $this->server;
        $this->port = isset($options['port']) ? $options['port'] : $this->port;
        $this->expires = isset($options['expires']) ? $options['expires'] : $this->expires;

        $this->memcache = new Memcache();
        $this->memcache->connect($this->server, $this->port);
    }

    public function store($id, $group, $data)
    {
        $this->memcache->set($this->prepareKey($id, $group), $data, MEMCACHE_COMPRESSED, $this->expires);
    }

    public function get($id, $group)
    {
        return $this->memcache->get($this->prepareKey($id, $group));
    }

    public function clean($group, $id)
    {
        if(!$group && !$id){
            $this->memcache->flush();
            return;
        }

        if(!$id){
            //TO DO: develop delete cache by group
            return;
        }

        $this->memcache->delete($this->_getKey());
    }

    protected function prepareKey($id, $group)
    {
        return $group . ':' . $id;
    }

}

Ниже приведён пример применения класса для кеширования образца.

Пример применения TemplateCache в образце

<?php if(!$templateCache->start('links', 'startPage')): ?>
 <dl>
<dt><a href='/manual/en/getting-started.php'>Getting Started</a></dt>
	<dd><a href='/manual/en/introduction.php'>Introduction</a></dd>
	<dd><a href='/manual/en/tutorial.php'>A simple tutorial</a></dd>
<dt><a href='/manual/en/langref.php'>Language Reference</a></dt>
	<dd><a href='/manual/en/language.basic-syntax.php'>Basic syntax</a></dd>
	<dd><a href='/manual/en/language.types.php'>Types</a></dd>
	<dd><a href='/manual/en/language.variables.php'>Variables</a></dd>
	<dd><a href='/manual/en/language.constants.php'>Constants</a></dd>
	<dd><a href='/manual/en/language.expressions.php'>Expressions</a></dd>
	<dd><a href='/manual/en/language.operators.php'>Operators</a></dd>
	<dd><a href='/manual/en/language.control-structures.php'>Control Structures</a></dd>
	<dd><a href='/manual/en/language.functions.php'>Functions</a></dd>
	<dd><a href='/manual/en/language.oop5.php'>Classes and Objects</a></dd>
	<dd><a href='/manual/en/language.namespaces.php'>Namespaces</a></dd>
	<dd><a href='/manual/en/language.exceptions.php'>Exceptions</a></dd>
	<dd><a href='/manual/en/language.generators.php'>Generators</a></dd>
	<dd><a href='/manual/en/language.references.php'>References Explained</a></dd>
	<dd><a href='/manual/en/reserved.variables.php'>Predefined Variables</a></dd>
	<dd><a href='/manual/en/reserved.exceptions.php'>Predefined Exceptions</a></dd>
	<dd><a href='/manual/en/reserved.interfaces.php'>Predefined Interfaces and Classes</a></dd>
	<dd><a href='/manual/en/context.php'>Context options and parameters</a></dd>
	<dd><a href='/manual/en/wrappers.php'>Supported Protocols and Wrappers</a></dd>
</dl>
<?php $templateCache->end('links', 'startPage'); endif; ?>

В результате, получен комфортный класс для прозрачного и незагромождающего образцы кэширования блоков HTML-кода.
Буду рад увидеть Вас в комментариях со своими предложениями и примечаниями.
Спасибо

 Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB