Пожалуйста, помогите улучшить мой кэш pHp? - PullRequest
0 голосов
/ 26 августа 2011

Я немного читал в интернете о php-кэше. в данный момент я использую эту систему для кэширования моих страниц:

Это помещается в начало страницы

<?php

    // Settings
    $cachedir = 'cache/'; // Directory to cache files in (keep outside web root)
    $cachetime = 600; // Seconds to cache files for
    $cacheext = 'html'; // Extension to give cached files (usually cache, htm, txt)

    // Ignore List
    $ignore_list = array(
        'addedbytes.com/rss.php',
        'addedbytes.com/search/'
    );

    // Script
    $page = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; // Requested page
    $cachefile = $cachedir . md5($page) . '.' . $cacheext; // Cache file to either load or create

    $ignore_page = false;
    for ($i = 0; $i < count($ignore_list); $i++) {
        $ignore_page = (strpos($page, $ignore_list[$i]) !== false) ? true : $ignore_page;
    }

    $cachefile_created = ((@file_exists($cachefile)) and ($ignore_page === false)) ? @filemtime($cachefile) : 0;
    @clearstatcache();

    // Show file from cache if still valid
    if (time() - $cachetime < $cachefile_created) {

        //ob_start('ob_gzhandler');
        @readfile($cachefile);
        //ob_end_flush();
        exit();

    }

    // If we're still here, we need to generate a cache file

    ob_start();

?>

МОЙ HTML-КОД здесь .............

и код ниже находится в нижней части моей страницы.

<?php

    // Now the script has run, generate a new cache file
    $fp = @fopen($cachefile, 'w'); 

    // save the contents of output buffer to the file
    @fwrite($fp, ob_get_contents());
    @fclose($fp); 

    ob_end_flush(); 

?>

Есть некоторые вещи, которые мне нужны, и у этого кода их нет:

  • GZIP
  • кэш с истекшим сроком действия не удаляется автоматически после истечения срока его действия.

Также хотел спросить, безопасен ли этот код для использования, если кто-то может предложить лучший или что-то для улучшения текущего кода, это будет просто здорово

Спасибо за чтение этого поста. С уважением Мео

Ответы [ 3 ]

2 голосов
/ 26 августа 2011
….
  // Show file from cache if still valid
  if (time() - $cachetime < $cachefile_created) {

      //ob_start('ob_gzhandler');
      echo gzuncompress(file_get_contents($cachefile));
      //ob_end_flush();
      exit();

  } else {
    if(file_exists($cachefile) && is_writable($cachefile)) unlink($cachefile)
  }            
….

и

    // Now the script has run, generate a new cache file
    $fp = @fopen($cachefile, 'w'); 

    // save the contents of output buffer to the file
    @fwrite($fp, gzcompress(ob_get_contents(), 9));
    @fclose($fp); 

    ob_end_flush(); 

?>
1 голос
/ 26 августа 2011

Используйте ob_start("ob_gzhandler"); для запуска буферизации gzipped (он позаботится о том, чтобы определить, может ли клиент действительно принимать / хочет данные gzipped и соответственно что-то изменить).

Чтобы удалить кэшированные файлы:

if (time() - $cachetime < $cachefile_created) {
    @readfile($cachefile);
    //ob_end_flush();
    exit();
} else {
    unlink($cachefile);
    exit();
}
0 голосов
/ 30 декабря 2011

Но может быть задержка или ошибка при записи файла, когда кто-то запрашивает эту страницу. Вы должны использовать flock для преодоления таких проблем, как указано в Ошибка при записи файла в простом PHP-кэшировании

Как-то так в конце страницы

<?php   
        $fp = @fopen($cachefile, 'w'); 
    if (flock($fp, LOCK_EX | LOCK_NB)) {
    fwrite($fp, gzcompress(ob_get_contents(), 9));
    flock($fp, LOCK_UN);
    fclose($fp); 
    }

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