Как фреймворки, такие как codeigniter, выполняют кэширование своих страниц? - PullRequest
2 голосов
/ 22 января 2011

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

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

Любое понимание будет с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 22 января 2011

В строке 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;
}
...