Part of the EllisLab Network
x
 
Create New Page
 View Previous Changes    ( Last updated by beemr )

Centralized Cache URI

Adjusting the storages paths of the CI cache can be labor-intensive, so I decided to make it a little less expensive.  Make this mod to MY_Output and you should be able to plug in Suffix Cache, Slightly Better Caching, or make any other adjustments to the CI caching conventions—all from one spot.

I’ve included snippets for the two Cache libraries mentioned above.

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * One Cache URI to Rule Them All
 *
 * Cache URI building is coded in duplicate as of 1.6.2 trunk, so I
 * refactored it to make it a little more manageable.  If you're using
 * Slightly Better Caching or Suffix Cache, the codebases can be merged 
 * to give you more reign over cache filing practices.
 *
 * @package        CodeIgniter
 * @subpackage    Libraries
 * @hacked-by    Bradford Mar
 * @copyright    Copyright (c) 2008, Bradford Mar
 * @license    http://codeigniter.com/wiki/Copyrights_and_Content_License/
 */
class MY_Output extends CI_Output {

    
    
/**
     * _get_from_session
     *
     * Attempts to get a value from a global object. If path is an array, attempts
     * to digg deeper into that object. Returns FALSE on error.
     *
     * @access    public
     * @param    string || array
     * @return    string || FALSE
     */
    
function _get_from_session $path )
    
{
        
if ( is_string($path) )
        
{
            $path 
= array($path);
        
}
        
        
do {
            
            $el 
array_shift($path);
            
            if ( !isset(
$current) && isset($_SESSION[$el]) )
            
{
                $current 
$_SESSION[$el];
            
}
            
else if ( isset($current) && isset($current[$el]) )
            
{
                $current 
$current[$el];
            
}
            
else
            
{
                
unset($current);
                break;
            
}
            
        } 
while (count($path) > 0);
        
        if ( isset(
$current) )
        
{
            
return $current;
        
}
        
else
        
{
            
return FALSE;
        
}
    }

    
    
/**
     * Get the uri of a given cached page
     *
     * @access    public
     * @return    void
     */    

    
function get_cache_URI($set_uri null$append_suffix true){
        $CFG 
=& load_class('Config');
        
$URI =& load_class('URI');
        
        
$set_uri = (isset($set_uri)) ? $set_uri $URI->uri_string;
    
        
$cache_path = ($CFG->item('cache_path') == '') ? BASEPATH.'cache/' $CFG->item('cache_path');
                
        if ( ! 
is_dir($cache_path) OR ! is_writable($cache_path))
        
{
             
return FALSE;
         
}
        
        
/*
         * Build the file path.  The file name is an MD5 hash of the full URI
         * If we make the suffix optional in _write_cache() be sure to do
         * so here too. <josh@surber.us>
         */
        
$uri =    $CFG->item('base_url').
                
$CFG->item('index_page').
                
$set_uri '.';
        if (
$append_suffix)
        
{
            $uri
.=$URI->suffix;
        
else
        
{
            
// Get type type
            
if ( FALSE !== ($type $this->_get_from_session($CFG->item('cache_type_source'))) )
            
{
                $uri
.= 'sess:'.$type;
            
}
        }
        
return array('path'=>$cache_path'uri'=>$uri);
    
}


    
// --------------------------------------------------------------------
    
    /**
     * Manually clear a cached file
     *
     * @access    public
     * @return    void
     */    

    
function clear_page_cache($set_uri null$append_suffix true){
        $cacheuri 
$this->get_cache_URI($set_uri$append_suffix);
        
$filepath $cacheuri['path'];
        
$filepath .= md5($cacheuri['uri']);        
        if(
file_exists($filepath))
        
{
            touch
($filepath);
            
unlink($filepath);
            
log_message('debug'"Cache file has expired. File deleted for: ".$cacheuri['uri']);
        
else
        
{
            
return FALSE;
        
}
    }

}
// END MY_Output Class

/* End of file MY_Output.php */
/* Location: ./system/application/libraries/MY_Output.php */ 

Make edits to _display_cache() and _write_cache like so:

// --------------------------------------------------------------------
    
    /**
     * Update/serve a cached file
     *
     * @access    public
     * @return    void
     */    

    
function _display_cache(&$CFG, &$RTR)
    
{

// moved to function get_cache_URI()        
/*        $URI =& load_class('URI');
    
        $cache_path = ($CFG->item('cache_path') == '') ? BASEPATH.'cache/' : $CFG->item('cache_path');
            
        if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))
        {
            return FALSE;
        }
        
        // 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;
*/
        
$cacheuri $this->get_cache_URI();
        
$uri $cacheuri['uri'];
        
$cache_path $cacheuri['path'];
        
        
$filepath $cache_path.md5($uri);

        if ( ! @
file_exists($filepath))
        
{
            
return FALSE;
        
}
// etc... 
/**
     * Write a Cache File
     *
     * @access    public
     * @return    void
     */    
    
function _write_cache($output)
    
{
        $CI 
=& get_instance();

// moved to function get_cache_URI()        
/*        $path = $CI->config->item('cache_path');
    
        $cache_path = ($path == '') ? BASEPATH.'cache/' : $path;
        
        if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))
        {
            return;
        }
        
        $uri =    $CI->config->item('base_url').
                $CI->config->item('index_page').
                $CI->uri->uri_string();
*/        
        
$cacheuri $this->get_cache_URI();
        
$uri $cacheuri['uri'];
        
$cache_path $cacheuri['path'];

        
$cache_path .= md5($uri);

        if ( ! 
$fp = @fopen($cache_path'wb'))
        
{
            log_message
('error'"Unable to write cache file: ".$cache_path);
            return;
        
}
//  etc...