PHP

Simple caching in PHP5

<![CDATA[I've just written a script that reads from a few webpages and I faced a problem of the servers sometime being slow and delaying my page display, so I decided to write a simple caching object:

class cache {

    function __construct($path='.') {
        $this->path = $path;
    }

    function cache($name, $callback, $args) {
        if (file_exists("$this->path/$name")) {
            $this->callbacks[$name] = array($callback, $args);
            return implode('', file("$this->path/$name"));
        } else {
            return $this->save($name, $callback, $args);
        }
    }

    function save($name, $callback, $args) {
        $text = call_user_func($callback, $args);
        $fh = fopen("$this->path/$name", 'w');
        fwrite($fh, $text);
        fclose($fh);
        return $text;
    }

    function __desctruct() {
        if (is_array($this->callbacks)) {
            foreach ($this->callbacks as $name => $callback) {
                list($callback, $args) = $callback;
                return $this->save($name, $callback, $args);
            }
        }
    }
}

You call it using:

$cache = new Cache();
$cache->cache('MyFunc.txt', 'MyFunc', 'an argument');

All it does is save the output of the function to a file with the given name. The clever bit is that the output it sends to the browser is the content of the file; it doesn’t actually call the function until the end of the script execution and so doesn’t slow the output to the browser down.

Start sending output.
Output cached result of function.
Finish sending output.
Call function and save to the cache file.

It means the content will always be slightly out of date, but in a lot of situations that may not be a problem.

Quick note, this is only really possible (at least the way I’ve done it) in PHP5 because it requires destructor support.
php5, oop, caching, http, code]]>

Advertisements

5 thoughts on “Simple caching in PHP5

  1. Pingback: Ashley furniture.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s