Универсальный PHP скрипт для кеширования страниц

Немного истории
Это очень специфический скрипт, так как многие современные решения уже имеют данный функционал. Но, разбирая старые модули и найдя его, я не мог не написать)
Основная сфера его применения, PHP скрипты, в которых содержится одновременно элементы модели MVC, а именно формирование данных, их обмен с БД и соответственно подготовка HTML вывода.
Как уже писал, сейчас это большая редкость, но иногда попадаются задачи доработки и оптимизации старых скриптов. И на практике этот модуль кеширования уже использовался мной не один раз. При этом я не анализирую его и не дорабатываю) А просто использую как есть)

Как использовать
Модуль состоит всего из одного файла unicache.class.php.
Для использования нужно добавить всего несколько строк в свой скрипт.
В начало файла нужно добавить строчки:
<?php 
require_once ('unicache.class.php');
$unicache = new CACHE_Unicache(TTL, COMPRESS,DIR-NAME);
?>
где
TTL — Время жизни кеш (по умолчанию — 3600 сек)
COMPRESS — сжатие кеш при помощи GZIP (ВНИМАНИЕ!!! Нужно очистить весь кеш, иначе будут ошибки!!!)
DIR-NAME — название директории кеш (по умолчанию — «unicache»)

В начало части страницы, которую собираетесь добавить в кеш поместим код:
<?php if ($unicache->begin($_SERVER["REQUEST_URI"])) : ?>

В конец страницы:
<?php endif; $unicache->end(); ?>

Больше ничего не нужно. Страница после вывода пользователю попадёт в кеш.

Содержимое файла unicache.class.php
<?php
/**
 * CACHE_Unicache
 * 
 * @package unicache
 * @author IgoRRius
 * @copyright 2012
 * @version 1.1.rel.18.05.2012
 * @access public
 * 
 * ******************************************************************************************
 *  Use instruction:
 *  1. load class file - require_once ('unicache.class.php');
 *  2. create New cache variable - $unicache = new CACHE_Unicache(TTL, COMPRESS,DIR-NAME);
 *      TTL - Time to live file in cache 'sec' (by default - 3600 sec)
 *      COMPRESS - compress cache file whith GZIP (WARNING!!! if cange this param, you must clear all cache!!!)
 *      DIR-NAME - cache dir name (by default - "unicache")
 *  3. Put code to begin of page - "if ($unicache->begin($_SERVER["REQUEST_URI"])) :"
 *  4. Put code to end of page - "endif; $unicache->end();"
 */
class CACHE_Unicache
{
    /*************************************************************************************/
    /**
     * TTL file in cache (seconds)
     */
    private $_ttl;
    /**
     * Path to cache folder
     */
    private $_path;
    /**
     * Hash URL
     */
    private $_hash;
    /**
     * Working MODE
     * UCACHE_MODE_WRITE | UCACHE_MODE_READ
     * 
     */
    private $_mode;
    /**
     * Default extention for cache file (Example: %URL_HASH%.$_default_ext)
     */
    private $_default_ext = 'html';
    /**
     * Compress the cache files
     */    
     private $_compress;
    /*************************************************************************************/
    /**
     * CACHE_Unicache::__construct()
     * 
     * @param integer $cache_ttl
     * @param string $cache_folder_path
     * @return
     */
    public function __construct($cache_ttl = 3600, $compress = false, $cache_folder_path = 'unicache')
    {
        /* DEFINE CONSTANTS */
        define('UCACHE_MODE_WRITE', 1);
        define('UCACHE_MODE_READ', 2);
        /* check input cache ttl */
        if ((int)$cache_ttl >= 0) {
            $this->_ttl = $cache_ttl;
        } else {
            $this->_ttl = 3600;
        } //if
        /* check cache folder */
        $this->_check_cache_folder($cache_folder_path);
        /* set compress param */
        $this->_compress = $compress;
    } //_construct
    /*************************************************************************************/
    /**
     * CACHE_Unicache::_check_cache_folder()
     * 
     * @param mixed $cache_folder_path
     * @return
     */
    private function _check_cache_folder($cache_folder_path)
    {
        if (is_dir($cache_folder_path)) {
            $curent_permissons = substr(sprintf('%o', fileperms($cache_folder_path)), -4);
            if ($curent_permissons != '0777') {
                chmod($cache_folder_path, 0777);
            } //
        } else {
            mkdir($cache_folder_path);
            chmod($cache_folder_path, 0777);
        } //
        $this->_path = $cache_folder_path;
    } //_check_cache_folder
    /*************************************************************************************/
    /**
     * CACHE_Unicache::clear_all()
     * 
     * @return
     */
    public function clear_all()
    {
        $files = scandir($this->_path);
        unset($files[0], $files[1]);
        foreach ($files as $file_name) {
            unlink($this->_path . DIRECTORY_SEPARATOR . $file_name);
        } //FILES
    } //clear_all
    /*************************************************************************************/
    /**
     * CACHE_Unicache::delete()
     * 
     * @return TRUE || FALSE
     */
    public function delete($page_id){
        $hash = md5($page_id);
        $path = $this->_path . DIRECTORY_SEPARATOR . $hash . ".{$this->_default_ext}";
        if (file_exists($path)){
            return unlink();    
        }else{
            return true;
        }//
    }//delete
    /*************************************************************************************/
    /**
     * CACHE_Unicache::start()
     * 
     * @return
     */
    private function start()
    {
        ob_start();
    } //start
    /*************************************************************************************/
    /**
     * CACHE_Unicache::save()
     * 
     * @return
     */
    private function save()
    {
        $content = ob_get_flush();
        if ($this->_compress){
            file_put_contents($this->_path . DIRECTORY_SEPARATOR . $this->_hash . ".{$this->_default_ext}", gzcompress($content), LOCK_EX);    
        }else{
            file_put_contents($this->_path . DIRECTORY_SEPARATOR . $this->_hash . ".{$this->_default_ext}", $content, LOCK_EX);
        }//if compress
        return $content;
    } //save
    /*************************************************************************************/
    /**
     * CACHE_Unicache::open()
     * 
     * @return
     */
    private function open()
    {
        if ($this->_compress){
            return gzuncompress(file_get_contents($this->_path . DIRECTORY_SEPARATOR . $this->_hash . ".{$this->_default_ext}"));
        }else{
            return file_get_contents($this->_path . DIRECTORY_SEPARATOR . $this->_hash . ".{$this->_default_ext}"); 
        }//if compress
    } //play
    /*************************************************************************************/
    /**
     * CACHE_Unicache::check()
     * 
     * @return
     */
    private function check()
    {
        $path = $this->_path . DIRECTORY_SEPARATOR . $this->_hash . ".{$this->_default_ext}";
        if (file_exists($path)) {
            $ttl = time() - filemtime($path);
            if ($ttl > $this->_ttl){
                return false;
            }else{
                return true;
            }//if
        } else {
            return false;
        } //if
    } //check
    /*************************************************************************************/
    /**
     * CACHE_Unicache::begin()
     * 
     * @param mixed $page_id
     * @return
     */
    public function begin($page_id){
        $this->_hash = md5($page_id);
        if ($this->check()){
            $this->_mode = UCACHE_MODE_READ;
            echo $this->open();
            return false;            
        }else{
            $this->_mode = UCACHE_MODE_WRITE;
            $this->start();
            return true;
        }// if isset and actual cache file        
    }//content_begin
    /*************************************************************************************/
    /**
     * CACHE_Unicache::end()
     * 
     * @return
     */
    public function end(){
        if ($this->_mode == UCACHE_MODE_WRITE){
            $this->save();
        }//if
    }//content_end
    /*************************************************************************************/
} //CACHE_Unicache
?>
  • +1
  • 09 декабря 2013, 16:00
  • igorrius

Комментарии (0)

RSS свернуть / развернуть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
comments powered by Disqus