how do I cache a web page in php so that if a page has not been updated viewers should get a cached copy?
Thanks for your help. PS: I am beginner in php.
You can actually save the output of the page before you end the script, then load the cache at the start of the script.
example code:
<?php
$cachefile = 'cache/'.basename($_SERVER['PHP_SELF']).'.cache'; // e.g. cache/index.php.cache
$cachetime = 3600; // time to cache in seconds
if (file_exists($cachefile) && time() - $cachetime <= filemtime($cachefile)) {
$c = @file_get_contents($cf);
echo $c;
exit;
} else {
unlink($cachefile);
}
ob_start();
// all the coding goes here
$c = ob_get_contents();
file_put_contents($cachefile, $c);
?>
If you have a lot of pages needing this caching you can do this:
in cachestart.php
:
<?php
$cachefile = 'cache/' . basename($_SERVER['PHP_SELF']) . '.cache'; // e.g. cache/index.php.cache
$cachetime = 3600; // time to cache in seconds
if (file_exists($cachefile) && time() - $cachetime <= filemtime($cachefile)) {
$c = @file_get_contents($cf);
echo $c;
exit;
} else {
unlink($cachefile);
}
ob_start();
?>
in cacheend.php
:
<?php
$c = ob_get_contents();
file_put_contents($cachefile, $c);
?>
Then just simply add
include('cachestart.php');
at the start of your scripts. and add
include('cacheend.php');
at the end of your scripts. Remember to have a folder named cache and allow PHP to access it.
Also do remember that if you're doing a full page cache, your page should not have SESSION specific display (e.g. display members' bar or what) because they will be cached as well. Look at a framework for specific-caching (variable or part of the page).
Additionally to mauris answer I'd like to point this out:
You have to be careful when you use caching. When you have dynamic data (which should be the case when you use php instead of static html) then you have to invalidate the cache when the corresponding data changes.
This can be pretty easy or extremely tricky, depending on your kind of dynamic data.
Update
How you invalidate the cache depends on the concrete kind of caching. You have to know which cache files belong to which page (and maybe with user input). When the data changes you should delete the cached file or remove the page output from your cache data structure.
I can't give you any more detailed info about that without knowing which implementation you use for caching.
Other folks suggested for example the Pear package or memcached. These have the necessary functions to invalidate the whole cache or parts of it when data changes.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With