7, January 2009

PhP Caching - webmaster forum

 
Webdigity webmaster forums
This forum shares its ad revenue with its members!
[ Home | Help | Search | Forum's Shop | Archive | Login | Register | Webmaster Directory ]
Webdigity Webmaster Forums  >  Web Development  >  PhP
Topic: PhP Caching
« previous next »
Pages: [1] Print

Author Topic: PhP Caching  (Read 16436 times)
I am a metal monkey!
Administrator
Community Supporter ?
Jedai Sword Master
*****
Gender: Male
Posts: 8350
43087 credits
Members referred : 3



« on: Nov 24, 2005, 04:21:27 PM »

Introduction

In this article I will try to give a view of what is the custom caching with php, why and how we can use it.

In the modern days, most of the sites are database driven. That means that your site is actually an application which retrieves data from a DBMS ( database managment system, eg MySQL) , parses the data and shows the result to the user. Most of these data are usually don't change frequently or don't change at all, and the reason that we use the database is that we can easilly update the site and the content.

A problem that this process creates is the server overhead. Every time we execute a query in the database, the instance of our script will call the DBMS, and then the DBMS will send the results of the query. This is time consuming, and especcially for sites with heavy traffic is a real big problem.

How we can solve this problem?

There are two ways to solve this if you want to make your site faster. First is optimizing the queries Visit through proxy, but we will not talk about this at the present article. The second and most valuable is using some kind of custom caching technique.

Custom caching with php

First let me explain the idea behind custom caching. When we have dynamic pages that their data is not updated frequently, we can use a 'system' that will be able to create the page, and then store it for later use. That means that after the page's creation, our application will not run the queries again in order to display the page, but it will show the cached one. Of course this system must be able to keep the cached pages for a time period that we will set.

Let's code it

Here is a simple class that will do the job. Let's see the code first :

Code:
<?php
class cache
{
    var 
$cache_dir './tmp/cache/';//This is the directory where the cache files will be stored;
    
var $cache_time 1000;//How much time will keep the cache files in seconds.
    
    
var $caching false;
    var 
$file '';

    function 
cache()
    {
        
//Constructor of the class
        
$this->file $this->cache_dir urlencode$_SERVER['REQUEST_URI'] );
        if ( 
file_exists $this->file ) && ( fileatime $this->file ) + $this->cache_time ) > time() )
        {
            
//Grab the cache:
            
$handle fopen$this->file "r");
            do {
                
$data fread($handle8192);
                if (
strlen($data) == 0) {
                    break;
                }
                echo 
$data;
            } while (
true);
            
fclose($handle);
            exit();
        }
        else
        {
            
//create cache :
            
$this->caching true;
            
ob_start();
        }
    }
    
    function 
close()
    {
        
//You should have this at the end of each page
        
if ( $this->caching )
        {
            
//You were caching the contents so display them, and write the cache file
            
$data ob_get_clean();
            echo 
$data;
            
$fp fopen$this->file 'w' );
            
fwrite $fp $data );
            
fclose $fp );
        }
    }
}


//Example :
$ch = new cache();
echo 
date("D M j G:i:s T Y");
$ch->close();
?>


Now let me explain :

function cache()

This is the constructor function of the class. The job of this function is to check if there is a cached file for the page that we want, or it should create it. Here is how this is done :

$this->file = $this->cache_dir . urlencode( $_SERVER['REQUEST_URI'] );

This line creates the file name of our cached page. So the cached file will be something like /path/to/cache/dir/request_uri

if ( file_exists ( $this->file ) && ( fileatime ( $this->file ) + $this->cache_time ) > time() )

Here we check if there is a cached version of this page, and if the file must be recreated because it has expired. If the file is cached, it will show the cached page and the exit. I will explain later why  exit. If the cached file must be created this code will be executed :

$this->caching = true;
 ob_start();

The first statement indicates to the close() function that it is creating the cache file, and the ob_start() Visit through proxy will start buffering the output. The buffer's data will be used later by the close() function to save the cache file.

function close()

This function must be called from the end of your script, and it will do the rest of the job. Actually it is needed only when we are in the process of caching that's why it starts with the statement  if ( $this->caching )
Let me explain what is happening here :

$data = ob_get_clean();

Here we get all the data from the output buffer while we unset it, and put the data in the $data variable. The four statements that folow up are showing the data and then write the cache file.

Troubleshooting

This is a very simple class, and the purpose is to learn how you can implement a caching solution for your site. The obligation using this class is that you must use it only in this form :

Code:
<?php
 $a 
= new cache();
 ....
 ....
 ....
 
$a->close();
?>


If you have code after the $a->close() statement, the class will not work right. This is because of the exit() statement in the cache() function.

Of course you can take this code and make it work for your own needs.

A quick solution is to remove the exit() statement in the cache() function and then use the class this way :

Code:
<?php
 $a 
= new cache();
 if ( 
$a->caching )
 {
 ....
 ....
 ....
 }
 
$a->close();
?>



Hope this helped. Smiley


You can publish this article to your site, but only if you give back credit, and a link to http://www.webdigity.com/ Visit through proxy

Trial and Error my two best teachers Cool
Join us @ facebook Visit through proxy or twitter Visit through proxy

Last blog : Monetizing Old Posts
Global Moderator
Internet Junkie
*****
Gender: Male
Posts: 1523
6847 credits
Members referred : 8


Gimme all your cookies!!!


« Reply #1 on: Nov 24, 2005, 05:30:50 PM »

I can see this being very useful on very busy pages that don't change often at all. I will remember that your script is here for later when I need it...

I have this sql query that takes around 30 sec to complete. The query searches through 40000 clients and is very complicated; I wish that I could use this caching here, but I can't bacause the data is consantly changing. Sometimes you can't optimise your queries anymore...


Last blog : Site of the Month - August 2007
I am a metal monkey!
Administrator
Community Supporter ?
Jedai Sword Master
*****
Gender: Male
Posts: 8350
43087 credits
Members referred : 3



« Reply #2 on: Nov 24, 2005, 05:35:49 PM »

That's true. But you can propably optimize the DBMS. The bad thing is that I don't know much about this as I am working only with the coding issues.

I will try to convice my admin guy to write an article about this.

I suppose a lot of people would be interesting on that.

Trial and Error my two best teachers Cool
Join us @ facebook Visit through proxy or twitter Visit through proxy

Last blog : Monetizing Old Posts
Global Moderator
Internet Junkie
*****
Gender: Male
Posts: 1523
6847 credits
Members referred : 8


Gimme all your cookies!!!


« Reply #3 on: Nov 24, 2005, 05:40:06 PM »

I am sure too!

For me at this stage I think that the best is to use LIMIT's in the query to shorten the search time.


Last blog : Site of the Month - August 2007
Just another rainy day
*
Posts: 1
6 credits
Members referred : 0


« Reply #4 on: Aug 01, 2007, 05:07:35 AM »

Very nice article, and thanks for the clean code!

I had a little difficulty getting this to work until I changed the call to fileatime() to be filemtime().  That way you use the "modification time" instead of the "access time".  I am on FreeBSD, not sure if that makes a difference.

cheers,
James
Global Moderator
Community Supporter ?
Jedai Sword Master
*****
Gender: Male
Posts: 6556
40168 credits
Members referred : 374


It's time to use PHP5!


« Reply #5 on: Aug 01, 2007, 06:57:34 AM »

Very nice article, and thanks for the clean code!

I had a little difficulty getting this to work until I changed the call to fileatime() to be filemtime().  That way you use the "modification time" instead of the "access time".  I am on FreeBSD, not sure if that makes a difference.

cheers,
James

yeah I remember that some machines make a difference in this ...


Last blog : Just a better Internet portal provided by Google
I am a metal monkey!
Administrator
Community Supporter ?
Jedai Sword Master
*****
Gender: Male
Posts: 8350
43087 credits
Members referred : 3



« Reply #6 on: Aug 01, 2007, 09:30:01 AM »

Interesting. I think this is only for BSD based os. If you use the access time on windows it will give you the last time someone read the file Smiley

Trial and Error my two best teachers Cool
Join us @ facebook Visit through proxy or twitter Visit through proxy

Last blog : Monetizing Old Posts
Bill Cosby is my Father
*
Posts: 4
28 credits
Members referred : 0


« Reply #7 on: Aug 09, 2007, 03:57:15 AM »

very nice, thanks man, I'll c&p to my snippets file for a good look at, and use of later.
I love Pokemon
*
Posts: 13
86 credits
Members referred : 0



« Reply #8 on: Jan 03, 2009, 05:43:38 PM »

There are sites that will help YOU analyze your system, but don't let them do it for you. I've listed such a site below. They have links to volunteer sites that will help you clean your system, and somewhere along the line they will ask you to send them a log of what's going on with your system. They will use that to analyze your system and will give you advice based on that. That's safe. Don't let them have direct access to your system, however.
Trackback URI for this entry : http://www.webdigity.com/trackback.php?topic=862
Tags : php articles databases Bookmark this thread : Digg Del.icio.us Dzone more....

Topic sponsors:
Get a permanent link here for $1.99!


Pages: [1] Print 
Webdigity Webmaster Forums  >  Web Development  >  PhP
Topic: PhP Caching
« previous next »
Jump to:
User Area
Welcome, Guest. Please login or register.
Did you miss your activation email?
Jan 07, 2009, 08:21:42 PM





Login with username, password and session length

Donate to our community, and get a permanent link back to your site!

Donate to our community, and get a permanent link back to your site!


Forum Statistics
Total Posts: 38.628
Total Topics: 7.771
Total Members: 4.651
Tutorials : 56
Resources : 143
Designs : 220
Latest Member: tillyvanilli

31 Guests, 5 Users online :

16 users online today:



Readers

Web Design Gallery · Whois Lookup · Pagerank · Tag Browsing · Lo-fi version · Syndication · Webmaster forum history · Advertise
Developed by HumanWorks © 2005 - 2009 Webdigity webmaster community · sublime directory
Webdigity Webmaster Forums | Powered by SMF 1.0.12. © 2001-2005, Lewis Media. All Rights Reserved.