jump to navigation

Http Cache Component (updated) June 16, 2006

Posted by rossoft in CakePHP.
trackback

Uses the HTTP 1.1 caching.
Example:

You've the 'modified' date from a record in your DB, then you must convert it to timestamp. In your action you can do
$this->httpCache->cache($modified_timestamp);
From now, the browser will cache that response, in the next request the browser will send that timestamp, and it will be compared with server's one. If the browser's one is not older than $modified_timestamp, then a status code of not modified is sent and the action exits.

Other example: expiration date
$this->httpCache->expires('+1 Day'); 
Then the page will be cached 1 day. You must use only one of those in every different url.

Copy to /app/controllers/components/http_cache.php
<?php
/**
 * Http Cache Component
 * Uses built in HTTP 1.1 caching mechanism
 * (304 Not Modified)
 * 
 * @author RosSoft
 * @license MIT
 * @version 0.2
 *
 * @link http://blog.codahale.com/2006/05/23/rails-plugin-http_caching/
 *
 *
 * Example 1:
 * $this->httpCache->cache($timestamp_modified_record);
 * $timestamp_modified_record is the timestamp of the content (like 'modified' field)
 *
 * Example 2:
 * $this->httpCache->expires('+1 Day');
 * The page will be cached until expire time.
 *
 * (cache and expires are incompatible, use one of them for each different url)
 */

class HttpCacheComponent extends Object
{
    var $enabled=true;
   
    /**
     * If the browser cache has a timestamp newer than the
     * modification date of the content, then a response of
     * not-modified is sent (and exits).
     *
     * @param integer $timestamp The modification date of the content (Unix timestamp)
     * @param boolean $no_cache If true, then it stores cache to user always
     *
     */   
    function cache($timestamp,$no_cache=false)
    {       
        if ($this->enabled)
        {
            $this->_cache_control();           
            if (env('HTTP_IF_MODIFIED_SINCE')
            && $timestamp <= strtotime(env('HTTP_IF_MODIFIED_SINCE'))
            && ! $no_cache)
            {
                header('Last-Modified: '.$this->_timestamp_to_gmt, true, 304);               
                exit();
            }
            else
            {
                header('Last-Modified: '.$this->_timestamp_to_gmt($timestamp), true, 200);
            }
        }
    }

    /**
     * Sets an expiration time for the page.
     *
     * @param mixed $expires A strtotime string / timestamp integer: expiration date.
     * @param boolean $no_cache If true, then it stores cache to user always
     */     
    function expires($expires='+1 Day',$no_cache=false)
    {
        if ($this->enabled)
        {
            $this->_cache_control();
            if (env('HTTP_IF_MODIFIED_SINCE')
            && time()<= strtotime(env('HTTP_IF_MODIFIED_SINCE'))
            && ! $no_cache)
            {
                header('Last-Modified: '.env('HTTP_IF_MODIFIED_SINCE'), true, 304);
                header("HTTP/1.1 304 Not changed");
                exit();
            }   
            else
            {
                header('Last-Modified: '.$this->_timestamp_to_gmt($expires), true, 200);
            }
        }                   
    }

    /**
     * Timestamp to GMT string   
     *
     * @param mixed $timestamp . A strtotime string / timestamp integer
     * @return string GMT time
     */
    function _timestamp_to_gmt($timestamp)
    {
        if (! is_numeric($timestamp))
        {
            $timestamp=strtotime($timestamp);                       
        }       
        return gmdate('D, d M Y H:i:s', $timestamp).' GMT';
    }   

    /**
     * Sets header for cache control
     */   
    function _cache_control()
    {
        header("Cache-Control: Public",true);
        header("Pragma: Public",true);   
    }   
}
?>

Advertisements

Comments»

1. truster - June 17, 2006

Just one little thing what I think about it: imagine situation when You will use this component in more then one controller and You will call other controller by Object::requestAction(). In both of them will be HttpCacheComponent::cache() executed (in case cache is out of date). I think it is not wanted behaviour, so I propose to You use var $enabled = false; in definition of this component, implement method startup() with test of value $this->enabled and in Your controller You will be able manage this component in beforeFilter() method. default value of ‘enabled’ shall be true, if You think – it is not point here.

Anyway: nice work, man!

2. rossoft - June 17, 2006

thanks, updated

3. Uncentignog - December 9, 2013

L’extinction pend qant Г  ee ne dizaine de secondes. I appeciate eveyone’s answe’s, and thank yo a fo esponding and shaing yo views. Avec une rГ©solution de 2 Megapixels, les photos produites par le W800i sont impressionnantes de qualitГ© pour un pas cher portable (Г©quivalente, en nombre de pixels, aux appareils photo d’il y a 2 ou 3 ans). TiaiГ© ente Г©es passionnГ©s Г  a echeche d et Г©conomie financiГЁe.
Les fans de saves se Г©joiont d’n intГ©essant entetien avec e chef Wiiam Ledei o bien avec e maaГ®che-sta JoГ« ThiГ©bat, des pages s es bges, a cywst de Bein, e sandwich vietnamien Banh mi, o s ne ecette de asagnes Г©pinads-samon. Disponible en six langues diffГ©rentes et particuliГЁrement apprГ©ciГ© auxГ‰tats-Unis, au Royaume-Uni et en Inde, le site sГ©duit Г©galement de nombreux utilisateurs un peu partout dans le monde, avec une croissance subite enregistrГ©e ces derniГЁres annГ©es. Ces dispositions garantissent la qualit et la s des organes. Ce qui est impotant est dГЄtre ooked Г , admied o mГЄme enviГ© dans un sens positif.

nike air max femme
Des tavax Г©taient donc nГ©cessaies Mais assez-vos pesonne n tombГ© maade. Il s’agit bien d’une volontГ© d’un candidat confrontГ© Г  un choix plus intГ©ressantLa gГ©ant informatique HP l’a bien compris et multiplie les actions pour Г©viter la fuite de ses cerveaux chez son rival Cisco. Si je CEA coecty, IKEA armoires ae fait mainy FOM patice BOAD. Nouveau mode de communication, pas cher commence Г  ГЄtre utilisГ© par les entreprises, pour transmettre des informations ou de la publicitГ© par de courts messages instantanГ©s.
we that sti emains to be seen. TГЁs bon matГ©ie po e pix, et possibiitГ© de faie tot ce qe t vex moyennant ‘instaation de bons micos. Nos sommes dans ne sociй– ? En ce qui concerne le matage, je le fais Г  flot, Г  3 personnes.

coucou, tu reprends le travail Г  quelle date ? 000 sppessions d’empoi et a femete de son sine d’Anay-sos-Bois, en Г©gion paisienne. La ogiqe qi pГ©side Г  cette dГ©cision est cee de pГ©seve a sein de ‘AP e poids de cei qi se seait Г  mГЄme de constite n inteocte vaabe et sffisamment ‘aisonnabe’ po nГ©gocie avec IsaГ«. )Merci de m’aider, parce que je suis super mal lГ le mien , Г  3 mois, Г©tait curieux, mais prГ©fГ©rait de tres loin le portage en bercpas cher (il ne faisait que dormir, ou somnoler au dГ©but de l'”Г©charpage”)le croisГ©, il a aimГ© plus tard.
Normalement, on met de l’anesthГ©sique en spray, on attend un peu que Г§a soit un peu efficace, puis on fait une injection d’anesthГ©sique dans les berges de la plaie. Ma dГ©cision de venir Г©tait prise depuis des mois”, a-t-il martelГ©. JJ qui n jamais eu l de devenir lutteur professionnel, lui qui termine justement ses cours de pompier, m avouГ© qu y penserait si la WWE voulait de son frГЁre et lui. Il est peu coГ»teux, et il est livrГ© en tonnes de Favos.


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

%d bloggers like this: