diff options
Diffstat (limited to 'system/helpers/expires.php')
| -rw-r--r-- | system/helpers/expires.php | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/system/helpers/expires.php b/system/helpers/expires.php new file mode 100644 index 0000000..a3e01b8 --- /dev/null +++ b/system/helpers/expires.php @@ -0,0 +1,129 @@ +<?php defined('SYSPATH') OR die('No direct access allowed.'); +/** + * Controls headers that effect client caching of pages + * + * @package Kohana + * @author Kohana Team + * @copyright (c) 2007-2009 Kohana Team + * @license http://kohanaphp.com/license + */ +class expires_Core { + + /** + * Sets the amount of time before content expires + * + * @param integer Seconds before the content expires + * @param integer Last modified timestamp in seconds(optional) + * @return integer Timestamp when the content expires + */ + public static function set($seconds = 60, $last_modified=null) + { + $now = time(); + $expires = $now + $seconds; + if (empty($last_modified)) + { + $last_modified = $now; + } + + header('Last-Modified: '.gmdate('D, d M Y H:i:s T', $last_modified)); + + // HTTP 1.0 + header('Expires: '.gmdate('D, d M Y H:i:s T', $expires)); + + // HTTP 1.1 + header('Cache-Control: public,max-age='.$seconds); + + return $expires; + } + + /** + * Parses the If-Modified-Since header + * + * @return integer|boolean Timestamp or FALSE when header is lacking or malformed + */ + public static function get() + { + if ( ! empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) + { + // Some versions of IE6 append "; length=####" + if (($strpos = strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], ';')) !== FALSE) + { + $mod_time = substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, $strpos); + } + else + { + $mod_time = $_SERVER['HTTP_IF_MODIFIED_SINCE']; + } + + return strtotime($mod_time); + } + + return FALSE; + } + + /** + * Checks to see if content should be updated otherwise sends Not Modified status + * and exits. + * + * @uses exit() + * @uses expires::get() + * + * @param integer Maximum age of the content in seconds + * @param integer Last modified timestamp in seconds(optional) + * @return integer|boolean Timestamp of the If-Modified-Since header or FALSE when header is lacking or malformed + */ + public static function check($seconds = 60, $modified=null) + { + if ($last_modified = expires::get()) + { + $now = time(); + + if (empty($last_modified)) + { + $last_modified = $now; + } + + if ($modified <= $last_modified) + { + // Content has not expired + header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified'); + header('Last-Modified: '.gmdate('D, d M Y H:i:s T', $last_modified)); + + $expires = $now + $seconds; + // HTTP 1.0 + header('Expires: '.gmdate('D, d M Y H:i:s T', $expires)); + + // HTTP 1.1 + header('Cache-Control: public,max-age='.$seconds); + + // Clear any output + Event::add('system.display', create_function('', 'Kohana::$output = "";')); + + exit; + } + } + + return $last_modified; + } + + /** + * Check if expiration headers are already set + * + * @return boolean + */ + public static function headers_set() + { + foreach (headers_list() as $header) + { + if (strncasecmp($header, 'Expires:', 8) === 0 + OR strncasecmp($header, 'Cache-Control:', 14) === 0 + OR strncasecmp($header, 'Last-Modified:', 14) === 0) + { + return TRUE; + } + } + + return FALSE; + } + +} // End expires |
