php, имитировать включить?Кэш-система - PullRequest
1 голос
/ 19 августа 2010

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

function loadTemplate($name, $vars) {
    $buf = '';
    $path = $name . '.html';
    if (file_exists($path)) {
        $this->vars = $vars;
        ob_start();
        include($path);
        $buf = ob_get_clean();
    }
    return $buf;
}

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

function loadTemplate($name, $vars) {
    $buf = $template = '';
    if (isset($this->cache[$name]))
        $template = $this->cache[$name];
    else {
        $path = $name . '.html';
        $template = file_get_contents($path);
        $this->cache[$name] = $template;
    }
    //Exec template here with scope.
}

Или я просто педантичен и пытаюсь микрооптимизировать :)

Ответы [ 5 ]

1 голос
/ 19 августа 2010

Если бы я был вами и имел сложные операции с файлами шаблонов, я бы сохранил их в файловую систему. Я изменил вашу функцию, думаю, вы поймете, что там происходит:

<?php

function template($name, $vars = array())
{
    $cache = 'cache/'; // Path to cache folder, must be writeable
    $expire = 3600 * 3; // Cache lifetime, 3 hours
    $path = $name . '.html';
    $cache_file = $cache . sha1($path) . '.txt'; // Generate cache file path and hash-name

    // If cache file exists and it hasn't expired yet we must get cached data
    if (file_exists($cache_file) && filemtime($cache_file) > (time() - $expire))
    {
        return unserialize(file_get_contents($cache_file));
    }

    // Return NULL if template file doesn't exist
    if (!file_exists($path))
    {
        return null;
    }

    $this->vars = $vars;

    ob_start();
    include_once $path;
    $output = ob_get_clean();

    // Save output to the cache file
    file_put_contents($cache_file, serialize($output));

    return $output;
}

?>

P.S. Не проверял функцию.

0 голосов
/ 20 августа 2010

Будет смотреть на CakePHP в соответствии с комментарием NullUserException:)

0 голосов
/ 19 августа 2010

Это самый бесполезный кеш, который вы можете реализовать. Вам лучше подумать о реализации условного получения HTTP, которая вообще не будет вызывать temlpate. А затем перейдите к кэшу кода операции, который будет автоматически кешировать ваши включения.

Но на первых порах вам нужно профилировать ваше приложение / шаблон, чтобы увидеть, нужен ли вам вообще кеш

0 голосов
/ 19 августа 2010

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

0 голосов
/ 19 августа 2010

Я не думаю, что это имеет большое значение, если вы снова включите шаблон, как вы сказали сами ... это будет микрооптимизация. Но, что вы можете сделать, это сохранить уже включенный источник шаблонов в массив и использовать имя шаблона в качестве ключа для массива. Когда вы запускаете функцию loadTemplate, вы можете просто сделать array_key_exists, чтобы увидеть, включена ли она уже.

Но если можно, я бы порекомендовал smarty template engine . Я использовал это в своих проектах и ​​нахожу это просто идеальным. Я немного адаптировал его для более плавной работы с моим кодом, но теперь он действительно идеально подходит для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...