HTTP_ConditionalGet

Last-Modified is known : simple usage

If your content has not changed since a certain timestamp, set this via the the lastModifiedTime array key when instantiating HTTP_ConditionalGet. You can immediately call the method sendHeaders() to set the Last-Modified, ETag, and Cache-Control headers. The, if cacheIsValid property is false, you echo the content.

This script emulates a document that changes every 20 seconds.
This is version: Mon, 23 Dec 2024 08:36:40 -0500

Notes

How to distinguish 200 and 304 responses

For these pages all 200 responses are sent in chunks a second apart, so you should notice that 304 responses are quicker. You can also use HTTP sniffers like Fiddler (win) and LiveHTTPHeaders (Firefox add-on) to verify headers and content being sent.

Browser notes

Opera
Opera has a couple behaviors against the HTTP spec: Manual refreshes (F5) prevents the ETag/If-Modified-Since headers from being sent; it only sends them when following a link or bookmark. Also, Opera will not honor the must-revalidate Cache-Control value unless max-age is set. To get Opera to follow the spec, ConditionalGet will send Opera max-age=0 (if one is not already set).
Safari
ETag validation is unsupported, but Safari supports HTTP/1.0 validation via If-Modified-Since headers as long as the cache is explicitly marked "public" or "private" ("private" is default in ConditionalGet).