2011-01-22 1 views
2

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

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

Любое понимание было бы весьма полезным. Благодаря!

+0

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

ответ

0

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

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; 
} 
+0

интересно, но что, если страница должна быть за логином. если он не доходит до контроллера, как разработчик может добавить проверки разрешений на сеанс? – dqhendricks

+0

также, похоже, такой позор, который должен быть preg_match и preg_replace все содержимое файла каждый раз, должен быть лучший способ времени истечения срока. – dqhendricks