Как такие фреймворки, как codeigniter, кэшируют свои страницы?

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

Кроме того, как можно обеспечить безопасность входа для страниц, использующих этот тип модели кэширования?

Мы будем очень признательны за любое понимание. Спасибо!


person dqhendricks    schedule 22.01.2011    source источник
comment
Вместо системы шаблонов он, вероятно, будет использовать ob_start и друзей для захвата и сохранения вывода. Предпочтительный способ заставить кэширование работать — соблюдать условные заголовки HTTP If: и If-Modified-Since:. Хотя я понятия не имею, действительно ли CodeIgniter делает это или просто полагается на предварительно настроенные тайм-ауты.   -  person mario    schedule 22.01.2011


Ответы (1)


В строке 177 CodeIgniter.php в core/:

if ($EXT->_call_hook('cache_override') === FALSE)
    {
        if ($OUT->_display_cache($CFG, $URI) == TRUE)
        {
            exit;
        }
    }

Он проверяет кэшированный файл и отображает его вместо обработки кода контроллера/действия.

Вы также можете прочитать, как кешированный файл проверяется на истечение срока действия классом Output перед его отображением.

function _display_cache(&$CFG, &$URI)
{
    $cache_path = ($CFG->item('cache_path') == '') ? APPPATH.'cache/' : $CFG->item('cache_path');

    // Build the file path.  The file name is an MD5 hash of the full URI
    $uri =  $CFG->item('base_url').
            $CFG->item('index_page').
            $URI->uri_string;

    $filepath = $cache_path.md5($uri);

    if ( ! @file_exists($filepath))
    {
        return FALSE;
    }

    if ( ! $fp = @fopen($filepath, FOPEN_READ))
    {
        return FALSE;
    }

    flock($fp, LOCK_SH);

    $cache = '';
    if (filesize($filepath) > 0)
    {
        $cache = fread($fp, filesize($filepath));
    }

    flock($fp, LOCK_UN);
    fclose($fp);

    // Strip out the embedded timestamp
    if ( ! preg_match("/(\d+TS--->)/", $cache, $match))
    {
        return FALSE;
    }

    // Has the file expired? If so we'll delete it.
    if (time() >= trim(str_replace('TS--->', '', $match['1'])))
    {
        if (is_really_writable($cache_path))
        {
            @unlink($filepath);
            log_message('debug', "Cache file has expired. File deleted");
            return FALSE;
        }
    }

    // Display the cache
    $this->_display(str_replace($match['0'], '', $cache));
    log_message('debug', "Cache file is current. Sending it to browser.");
    return TRUE;
}
person Teej    schedule 22.01.2011
comment
интересно, а что если страница должна быть за логином. если он не доходит до контроллера, как разработчик может добавить проверки разрешений сеанса? - person dqhendricks; 22.01.2011
comment
Кроме того, кажется таким позорным каждый раз выполнять preg_match и preg_replace все содержимое файла, должен быть лучший способ определить время истечения срока действия. - person dqhendricks; 22.01.2011