Caching is basically required for any data-heavy or interaction-heavy
site... but you need to be in control of who gets what cache; more
specifically, you need to be sure people only get their own cached
content.
Cake < 1.2 has caching... great caching if your contact is the same
for everyone... but it's less than ideal for per-user content... in
fact if you wanted to cache the "public" version of a view, and ignore
cache >userid; and even for one site an additional parameter: $this-
>repid. The cache file name defaults to starting with the current
controller_action... but they can be arbitrarily set (which is how I
use it most of the time).

Feel free to add other parameters, if you need to split your caches by
other things... for me, I just needed a unique cache per userid and
per repid.

Controller Class:
<?php
/***
* == Example of Usage ==
* The following is simply an example of how you might use the
component.
*/
class MockUserController extends AppController {
    var $components = array('Ecache');

    /**
    * This component doesn't handle authentication, nor does it
automatically integrate with any other authenticaiton system.
    * You have to tell it what userid is logged in.
    * This shouldn't be too difficult, as most authenticaiton systems
will have unique user ids.
    * If you don't have an authentication system, you probably don't
need this component, as all you're cached data will look the same for
all people.
    */
    function beforeFilter() {
        // whatever your authentication sets
        $this->userid = $this->myAuthenticaitonSystem();

        // populating value with a number, so we can discuss in this
example.
        $this->userid = 42; // mockup value!

        // initialize Ecache
        $this->Ecache->startup($this);
    }

    /**
    * simple ecache example.  just a regular database data result
cached.
    * cache filename will be: ./app/tmp/cache/views/
users_list_0_42_0.php
    * if $this->userid was 89, the cache filename would be: ./app/tmp/
cache/views/users_list_0_89_0.php
    */
    function example1() {
        // checking cache
        $d = $this->Ecache->ecache(null,'users','list');
        // if missing cached content
        if (empty($d)) {
            // now get cached content
            $cond = array('User.parent_id'=>$this->userid);
            $results = $this->User->findAll($cond);
            // writing cache
            $d = $this->Ecache->ecache($results,'users','list');
        }
        $this->set('myusers',$d);
    }

    /**
    * there are 2 differnt cache calls in this example.
    * the first is like above, based on the $this->userid.
    * cache filename will be: ./app/tmp/cache/views/
users_pageelement_0_42_0.php
    * if $this->userid was 89, the cache filename would be: ./app/tmp/
cache/views/users_pageelement_0_89_0.php
    * the second will cache content globally (not on a per-user basis)
    * cache filename will be: ./app/tmp/cache/views/
users_pageelement_0_global_global.php
    * notice that the content in this example is generated from
returned "requestAction"s
    */
    function example2() {
        // checking cache
        $d = $this->Ecache->ecache(null,'users','pageelement');
        // if missing cached content
        if (empty($d)) {
            // now get cached content
            $results = $this->requestAction('/something/
action',array('return'));
            // writing cache
            $d = $this->Ecache-
>ecache($results,'users','pageelement');
        }
        $this->set('user_specific_content',$d);

        // checking cache
        $d = $this->Ecache->ecache(null,'users','pageelement',
0,'global','global');
        // if missing cached content
        if (empty($d)) {
            // now get cached content
            $results = $this->requestAction('/anything/
content',array('return'));
            // writing cache
            $d = $this->Ecache->ecache($results,'users','pageelement',
0,'global','global');
        }
        $this->set('global_content',$d);
    }

    /**
    * This is simply a convenience wrapper for clearing the cache
files.
    * clearing cache deletes: ./app/tmp/cache/view/*
    * ...often you may need to clear from a model, afterSave()
    */
    function exampleClear() {
        $this->Ecache->clear();
    }
}
?>

Obviously, the above examples were simple. If you had a huge database
query it might be worth it to cache, or if you used the same content a
lot... most of the time though, caching is really useful for multiple
database operations, heavily processed data, or returned
"requestAction" data.

Component Class:
<?php
/***
 * PHP versions 4 and 5
 *
 * ecache: extends and simplifies caching content based on per-user or
per--anything parameters for the cakePHP framework.
 * Copyright (c)    2007, Alan Blount
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @author           Alan Blount
 * @copyright        Copyright (c) 2007, Alan Blount
 * @version          0.1
 * @modifiedby       alan [a4] zeroasterisk [d07] com
 * @license          http://www.opensource.org/licenses/mit-license.php
The MIT License
 *
 * == Info ==
 * caches arrays or strings... good for $this->requestEvent(), and
just as good for a Database Query Result Set...
 *
 * version below includes optional fields: $controller, $action, $id,
$userid, $repid
 * most of those fields inherit from the controller if empty... (left
the code as simple as possible for easy reconfiguration)
 * --------
 * Can clear at any point with cake helper function: clearCache();
 */

class EcacheComponent extends Object {
    var $duration = '+2 hours';
    var $controller, $id, $userid, $repid; // may be used later
    function startup(&$controller) {
        $this->controller = &$controller;
        if (isset($this->controller->id)) {
            $this->id = $this->controller->id;
        }
        if (isset($this->controller->Uid)) {
            $this->userid = $this->controller->Uid;
        }
        if (isset($this->controller->repid)) {
            $this->repid = $this->controller->repid;
        }
    }

    function ecache($data=null, $controller=null, $action=null,
$id=null, $userid=null, $repid=null, $duration=null) {
        // set values
        if (empty($controller)) {
            if (isset($this->params['controller'])) {
                $controller = $this->controller->params['controller'];
            } else {
                $controller = 'unknown';
            }
        }
        if (empty($action)) {
            if (isset($this->params['action'])) {
                $action = $this->controller->params['action'];
            } else {
                $action = 'unknown';
            }
        }
        if (empty($id)) {
            if (isset($this->id)) {
                $id = intval($this->id);
            } elseif (isset($this->controller->id)) {
                $id = intval($this->controller->id);
            } else {
                $id = intval($this->id);
            }
        }
        if (empty($userid)) {
            if (isset($this->controller->userid)) {
                $userid = intval($this->controller->userid);
            } else {
                $userid = intval($this->userid);
            }
        }
        if (empty($repid)) {
            if (isset($this->controller->repid)) {
                $repid = intval($this->controller->repid);
            } else {
                $repid = intval($this->repid);
            }
        }
        if (empty($duration)) {
            if (isset($this->controller->ecache_duration)) {
                $duration = $this->controller->ecache_duration;
            } else {
                $duration = $this->duration;
            }
        }
        if (is_array($data) || is_object($data)) {
            $data = serialize($data);
        }
        // make cache path & filename
        $filename = $controller.'_'.$action.'_'.$id.'_'.$userid.'_'.
$repid;
        $replace = array('&', '~', '!', ',', ';', ':', '*', '__',
'__', '__');
        $path_key = str_replace($replace, '_', $filename);
        $cachePath = 'views'.DS.$path_key.'.php';
        // do cache.... if data=null, retrieve... else, write & return
        $re = cache($cachePath, $data, $duration);
        // return data (attempt unserialize)
        $d = @unserialize($re);
        if ($d!==false && $d!==null) {
            return $d;
        } else {
            return $re;
        }
    }

    // convenience wrapper for "clearCache"
    function clear() {
        return clearCache();
    }

    // convenience wrapper for "ecache"
    function c($data=null, $controller=null, $action=null, $id=null,
$userid=null, $repid=null, $duration=null) {
        return $this->ecache($data, $controller, $action, $id,
$userid, $repid, $duration);
    }
}


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Cake 
PHP" group.
To post to this group, send email to cake-php@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to