How to disable codeigniter’s cache

Learn how to disable Codeigniter’s cache for some specific IP address or logged in users and how to implement your own cache logic.

Enabling the Codeigniter’s cache

Enabling the cache is very easy in your Codeigniter’s application. In any of your controller when you want it enabled just call this function:

$this->output->cache($minutes);

when your controller finishes the output from the views is generated to both the browser of you users and also stored into the cache directory onto the filesystem.

The drawback of the Codeigniter’s cache

After a controller output has been cached the behavior of the Codeigniter’s cache system it’s not what you may have expected. Indeed when a cached copy is present onto the filesystem and the cache timeout has not yet expired then this static cached copy is served before your controller gets called completely bypassing any of your controller’s logic.

While providing great performance, my websites dropped from 2 seconds to 0.01, it has the drawback that you cannot implement any cache logic you wish into your controllers. This is because the function call:

$this->output->cache($minutes);

it’s just to enable the saving onto the disks of the controller’s view output; while, the checking about the rendering or not of the cached version of your URLs, it’s done way before the controller logic gets called.

Disabling the Codeigniter’s cache for some IP address or logged in users

In many circumstances you don’t want to have this feature and, particularly, when you want that some IP address, like your office, or some logged in users, needs to have fresh dynamic content to be served instead of the static content copy from the Codeigniter’s cache.

To implement this kind of cache logic in Codeigniter is quite easy: you have to override the core’s Output class.

Just follow those instructions:

1) create a new class file

In order to do that create a core directory under your application directory, and create a new class file called MY_Output.php the result must be ./application/core/MY_Output.php.

2) override the logic inside the Codeigniter’s core system cache class file

Then create a class MY_Output that extends the default class CI_Output and override the function _display_cache implementing the following logic:

  • return FALSE when you want override the cache behavior and force it to be disabled;
  • return TRUE when you want override the cache behavior and force it to be enabled;
  • call the parent function when you want it to works normally;

See the full  example below:

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

class MY_Output extends CI_Output {

	function _display_cache(&$CFG, &$URI)
	{
		/* Simple Test for Ip Address */
		if ($_SERVER['REMOTE_ADDR'] == NOCACHE_IP ) 
		{
			return FALSE;
		}
		/* Simple Test for a cookie value */
		if ( (isset($_COOKIE['nocache'])) && ( $_COOKIE['nocache'] > 0 ) )
		{
			return FALSE;
		}
		/* Call the parent function */
		return parent::_display_cache($CFG,$URI);
	}
}
?>

As you see from the example above you’re free to implement any kind of cache logic that you want in order to check and bypass the Codeigniter’s cache.

Remember that the “MY_” class’s prefix is controlled into the file config/config.php by the following parameter:

$config['subclass_prefix'] = 'MY_';

To learn more about the Codeigniter’s cache system visit the online manual:

How to disable codeigniter's cache, 5.0 out of 5 based on 2 ratings

Potrebbe interessarti anche:

Iscriviti alla newsletter

  • HowTo e Tutorial su Linux e Ubuntu
  • Wordpress, Perl & Webmin
  • VoIP, Asterisk, SIP
About

Antonio Gallo is a Linux entusiast and evangelists since 1996 when he started the Bad Penguin project. Notably he was in the board and sysadmin of linux.it for many years and also managed the "Linux Day" event in Italy, wrotes for technical magazines. Antonio writes, codes and develops Linux and Open Source software solutions. When everybody else fails he's the man to be called: bash, awk, php, perl, C are the rabbits in his cylinder ready to spread the Linux magic around the world.

  • Paul

    Nice!!! Thanks a lot for this post.

    P.S. In your code is to much closing brackets.

    • http://www.badpenguin.org Antonio Gallo

      Thanks Paul, i know… but since i learned C before PHP even existed i still use them a lot :)

      • Paul

        Oh, you don’t understood my english i think. Current code has error, because there are 5 opening brackets and 6 closing, so you recieve error using it, need to remove one.

        • http://www.badpenguin.org Antonio Gallo

          Oh thanks, i just fixed the typo! That’s because i formatted the code manually instead of using some syntax highlighter wordpress plugin