开发者

Please help to improve my pHp cache ?

i have read a bit around in the internet about the php cache. at the moment i am using, this system to cache my pages:

This is putted on the start of the page

<?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();

?>

MY HTML CODE Goes here .............

and the code below is at the footer of my page.

<?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(); 

?>

There are some things that i need and this code dont have them :

  • gzip
  • the expired cache is not autodeleted after it expire.

Also wanted to ask, if this code is secure to use , if some one can suggest a better one or something to improve the current code it will be just great

Thank you fro reading this post. Best Regards Meo


….
  // 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)
  }            
….

and

    // 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(); 

?>


Use ob_start("ob_gzhandler"); to initiate gzipped buffering (it'll take care of determining if the client can actually accept/wants gzipped data and adjust things accordingly).

To delete the cached files:

if (time() - $cachetime < $cachefile_created) {
    @readfile($cachefile);
    //ob_end_flush();
    exit();
} else {
    unlink($cachefile);
    exit();
}


But there can be delay or maybe error when the file is being written and someone requests for that page. You should use flock to overcome such problems as mentioned at Error during file write in simple PHP caching

Something like this at the end of page

<?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(); ?>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜