Caching for dynamic content

I made this snippet to show how to use the Last-Modified and the ETag header <br/> to optimize the caching of a website. If used correctly this will speed up <br/> your page loads.
// Start output buffering, this will // catch all content so that we can // do some calculations ob_start(); // Some example HTML print '<html>'; // put your content in here: print '<h1>Example content</h1>'; print '<ul>'; for ($x=0; $x < 10; $x++) print "<li>List item $x</li>"; print '</ul>'; print '</html>'; // or include() something here // Now save all the content from above into // a variable $PageContent = ob_get_contents(); // And clear the buffer, so the // contents will not be submitted to // the client (we do that later manually) ob_end_clean(); // Generate unique Hash-ID by using MD5 $HashID = md5($PageContent); // Specify the time when the page has // been changed. For example this date // can come from the database or any // file. Here we define a fixed date value: $LastChangeTime = 1144055759; // Define the proxy or cache expire time $ExpireTime = 3600; // seconds (= one hour) // Get request headers: $headers = apache_request_headers(); // you could also use getallheaders() or $_SERVER // or HTTP_SERVER_VARS // Add the content type of your page header('Content-Type: text/html'); // Content language header('Content-language: en'); // Set cache/proxy informations: header('Cache-Control: max-age=' . $ExpireTime); // must-revalidate header('Expires: '.gmdate('D, d M Y H:i:s', time()+$ExpireTime).' GMT'); // Set last modified (this helps search engines // and other web tools to determine if a page has // been updated) header('Last-Modified: '.gmdate('D, d M Y H:i:s', $LastChangeTime).' GMT'); // Send a "ETag" which represents the content // (this helps browsers to determine if the page // has been changed or if it can be loaded from // the cache - this will speed up the page loading) header('ETag: ' . $HashID); // The browser "asks" us if the requested page has // been changed and sends the last modified date he // has in it's internal cache. So now we can check // if the submitted time equals our internal time value. // If yes then the page did not get updated $PageWasUpdated = !(isset($headers['If-Modified-Since']) and strtotime($headers['If-Modified-Since']) == $LastChangeTime); // The second possibility is that the browser sends us // the last Hash-ID he has. If he does we can determine // if he has the latest version by comparing both IDs. $DoIDsMatch = (isset($headers['If-None-Match']) and ereg($HashID, $headers['If-None-Match'])); // Does one of the two ways apply? if (!$PageWasUpdated or $DoIDsMatch){ // Okay, the browser already has the // latest version of our page in his // cache. So just tell him that // the page was not modified and DON'T // send the content -> this saves bandwith and // speeds up the loading for the visitor header('HTTP/1.1 304 Not Modified'); // That's all, now close the connection: header('Connection: close'); // The magical part: // No content here ;-) // Just the headers } else { // Okay, the browser does not have the // latest version or does not have any // version cached. So we have to send him // the full page. header('HTTP/1.1 200 OK'); // Tell the browser which size the content header('Content-Length: ' . strlen($PageContent)); // Send the full content print $PageContent; }

Url: http://www.jonasjohn.de/snippets/php/caching.htm

Language: PHP | User: ShareMySnippets | Created: Oct 16, 2013 | Tags: caching