Commit b6b24c28 authored by Dries's avatar Dries

Applied patch by Natrak:

- page_header() now adds Last-Modified and ETag http headers.
- When running PHP as an Apache module page_header() will check the HTTP
  headers for conditional gets, and will only push the content when it
  fails. (Works for html and xml pages as they are all cached). Note:
  this is a PHP limitation, so until PHP makes it work for other web
  servers this won't work for them.
- Added created field to cache database to hold the timestamp when the
  cache was created.
- Changed cache_get() to return an object with ->data and ->created.
- Update forum and locale modules.
parent 56ac29fa
...@@ -105,6 +105,7 @@ CREATE TABLE cache ( ...@@ -105,6 +105,7 @@ CREATE TABLE cache (
cid varchar(255) NOT NULL default '', cid varchar(255) NOT NULL default '',
data mediumtext, data mediumtext,
expire int(11) NOT NULL default '0', expire int(11) NOT NULL default '0',
created int(11) NOT NULL default '0',
PRIMARY KEY (cid) PRIMARY KEY (cid)
) TYPE=MyISAM; ) TYPE=MyISAM;
......
...@@ -102,6 +102,7 @@ CREATE TABLE cache ( ...@@ -102,6 +102,7 @@ CREATE TABLE cache (
cid varchar(255) NOT NULL default '', cid varchar(255) NOT NULL default '',
data text default '', data text default '',
expire integer NOT NULL default '0', expire integer NOT NULL default '0',
created integer NOT NULL default '0',
PRIMARY KEY (cid) PRIMARY KEY (cid)
); );
......
...@@ -462,16 +462,17 @@ function format_size($size) { ...@@ -462,16 +462,17 @@ function format_size($size) {
} }
function cache_get($key) { function cache_get($key) {
$cache = db_fetch_object(db_query("SELECT data FROM cache WHERE cid = '%s'", $key)); $cache = db_fetch_object(db_query("SELECT data, created FROM cache WHERE cid = '%s'", $key));
return $cache->data ? $cache->data : 0; $created = $cache->created;
return $cache->data ? $cache : 0;
} }
function cache_set($cid, $data, $expire = 0) { function cache_set($cid, $data, $expire = 0) {
if (db_fetch_object(db_query("SELECT cid FROM cache WHERE cid = '%s'", $cid))) { if (db_fetch_object(db_query("SELECT cid FROM cache WHERE cid = '%s'", $cid))) {
db_query("UPDATE cache SET data = '%s' WHERE cid = '%s'", $data, $cid); db_query("UPDATE cache SET data = '%s', created = %d, expire = %d WHERE cid = '%s'", $data, time(), $expire, $cid);
} }
else { else {
db_query("INSERT INTO cache (cid, data, expire) VALUES('%s', '%s', '%s')", $cid, $data, $expire); db_query("INSERT INTO cache (cid, data, created, expire) VALUES('%s', '%s', %d, %d)", $cid, $data, time(), $expire);
} }
} }
...@@ -515,7 +516,7 @@ function page_get_cache() { ...@@ -515,7 +516,7 @@ function page_get_cache() {
} }
} }
return $cache ? $cache : 0; return $cache;
} }
function format_interval($timestamp) { function format_interval($timestamp) {
...@@ -764,8 +765,18 @@ function page_header() { ...@@ -764,8 +765,18 @@ function page_header() {
} }
if (variable_get("cache", 0)) { if (variable_get("cache", 0)) {
if ($data = page_get_cache()) { if ($cache = page_get_cache()) {
print $data; $date = gmdate("D, d M Y H:i:s", $cache->created) ." GMT";
header("Last-Modified: $date");
header("ETag: \"$date\"");
if ($headers = getallheaders()) {
// NOTE: the above is an Apache-ism so for the time being we don't send 304 headers to IIS servers.
if ($headers["If-Modified-Since"] == $date && $headers["If-None-Match"] == "\"$date\"") {
header("HTTP/1.0 304 Not Modified");
exit();
}
}
print $cache->data;
exit(); exit();
} }
} }
......
...@@ -104,7 +104,7 @@ function forum_block($op = "list", $delta = 0) { ...@@ -104,7 +104,7 @@ function forum_block($op = "list", $delta = 0) {
} }
$blocks["subject"] = t("Forum topics"); $blocks["subject"] = t("Forum topics");
$blocks["content"] = $content; $blocks["content"] = $content->data;
} }
} }
...@@ -310,7 +310,7 @@ function forum_get_forums($tid = 0) { ...@@ -310,7 +310,7 @@ function forum_get_forums($tid = 0) {
$tid = 0; $tid = 0;
} }
$forums = unserialize(cache_get("forum:$tid")); $forums = cache_get("forum:$tid");
if (!$forums) { if (!$forums) {
$forums = array(); $forums = array();
...@@ -333,6 +333,7 @@ function forum_get_forums($tid = 0) { ...@@ -333,6 +333,7 @@ function forum_get_forums($tid = 0) {
} }
if ($user->uid && $forums) { if ($user->uid && $forums) {
$forums = unserialize($forums);
foreach (_forum_topics_read($user->uid) as $tid => $old) { foreach (_forum_topics_read($user->uid) as $tid => $old) {
if ($forums[$tid]) { if ($forums[$tid]) {
$forums[$tid]->old_topics = $old; $forums[$tid]->old_topics = $old;
......
...@@ -104,7 +104,7 @@ function forum_block($op = "list", $delta = 0) { ...@@ -104,7 +104,7 @@ function forum_block($op = "list", $delta = 0) {
} }
$blocks["subject"] = t("Forum topics"); $blocks["subject"] = t("Forum topics");
$blocks["content"] = $content; $blocks["content"] = $content->data;
} }
} }
...@@ -310,7 +310,7 @@ function forum_get_forums($tid = 0) { ...@@ -310,7 +310,7 @@ function forum_get_forums($tid = 0) {
$tid = 0; $tid = 0;
} }
$forums = unserialize(cache_get("forum:$tid")); $forums = cache_get("forum:$tid");
if (!$forums) { if (!$forums) {
$forums = array(); $forums = array();
...@@ -333,6 +333,7 @@ function forum_get_forums($tid = 0) { ...@@ -333,6 +333,7 @@ function forum_get_forums($tid = 0) {
} }
if ($user->uid && $forums) { if ($user->uid && $forums) {
$forums = unserialize($forums);
foreach (_forum_topics_read($user->uid) as $tid => $old) { foreach (_forum_topics_read($user->uid) as $tid => $old) {
if ($forums[$tid]) { if ($forums[$tid]) {
$forums[$tid]->old_topics = $old; $forums[$tid]->old_topics = $old;
......
...@@ -282,7 +282,10 @@ function locale($string) { ...@@ -282,7 +282,10 @@ function locale($string) {
static $locale_t; static $locale_t;
if (!isset($locale_t)) { if (!isset($locale_t)) {
$locale_t = unserialize(cache_get("locale:$locale")); $cache = cache_get("locale:$locale");
if ($cache) {
$locale_t = unserialize($cache->data);
}
} }
if ($locale_t[$string] != "") { if ($locale_t[$string] != "") {
......
...@@ -282,7 +282,10 @@ function locale($string) { ...@@ -282,7 +282,10 @@ function locale($string) {
static $locale_t; static $locale_t;
if (!isset($locale_t)) { if (!isset($locale_t)) {
$locale_t = unserialize(cache_get("locale:$locale")); $cache = cache_get("locale:$locale");
if ($cache) {
$locale_t = unserialize($cache->data);
}
} }
if ($locale_t[$string] != "") { if ($locale_t[$string] != "") {
......
...@@ -57,7 +57,8 @@ ...@@ -57,7 +57,8 @@
"2002-10-17" => "update_42", "2002-10-17" => "update_42",
"2002-10-26" => "update_43", "2002-10-26" => "update_43",
"2002-11-08" => "update_44", "2002-11-08" => "update_44",
"2002-11-20" => "update_45" "2002-11-20" => "update_45",
"2002-12-10" => "update_46"
); );
// Update functions // Update functions
...@@ -636,6 +637,10 @@ function update_45() { ...@@ -636,6 +637,10 @@ function update_45() {
update_sql("ALTER TABLE page ADD description varchar(128) NOT NULL default ''"); update_sql("ALTER TABLE page ADD description varchar(128) NOT NULL default ''");
} }
function update_46() {
update_sql("ALTER TABLE cache ADD created int(11) NOT NULL default '0'");
}
function update_upgrade3() { function update_upgrade3() {
update_sql("INSERT INTO system VALUES ('archive.module','archive','module','',1)"); update_sql("INSERT INTO system VALUES ('archive.module','archive','module','',1)");
update_sql("INSERT INTO system VALUES ('block.module','block','module','',1)"); update_sql("INSERT INTO system VALUES ('block.module','block','module','',1)");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment