forked from bcit-ci/CodeIgniter
-
Notifications
You must be signed in to change notification settings - Fork 0
Centralized Cache URI
Derek Jones edited this page Jul 5, 2012
·
4 revisions
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. <[email protected]>
*/
$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...