From 0137b9646469ef8b4d8d38733da8d48b9d405164 Mon Sep 17 00:00:00 2001 From: Savetheinternet Date: Sun, 22 May 2011 01:12:57 +1000 Subject: [PATCH] PURGE for caching reverse-proxies like Squid or Varnish --- inc/config.php | 8 ++++++++ inc/functions.php | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/inc/config.php b/inc/config.php index 12d5f609..b519fe1e 100644 --- a/inc/config.php +++ b/inc/config.php @@ -661,6 +661,14 @@ // Keep the Google Analytics cookies to one domain -- ga._setDomainName() // $config['google_analytics_domain'] = 'www.example.org'; + // If you use Varnish, Squid, or any similar caching reverse-proxy in front of Tinyboard, + // you can configure Tinyboard to PURGE files when they're written to + //$config['purge'] = Array( + // Array('127.0.0.1', 80) + //); + // Connection timeout, in seconds + $config['purge_timeout'] = 3; + if($_SERVER['SCRIPT_FILENAME'] == str_replace('\\', '/', __FILE__)) { // You cannot request this file directly. header('Location: ../', true, 302); diff --git a/inc/functions.php b/inc/functions.php index 06674749..ec49dfbf 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -218,6 +218,25 @@ } else return false; } + function purge($uri) { + global $config; + $uri = (str_replace('\\', '/', dirname($_SERVER['REQUEST_URI'])) == '/' ? '/' : str_replace('\\', '/', dirname($_SERVER['REQUEST_URI'])) . '/') . $uri; + $request = "PURGE {$uri} HTTP/1.0\r\nHost: {$_SERVER['HTTP_HOST']}\r\nUser-Agent: Tinyboard\r\nConnection: Close\r\n\r\n"; + + foreach($config['purge'] as &$purge) { + $host = $purge[0]; + $port = $purge[1]; + if($fp = fsockopen($host, $port, $errno, $errstr, $config['purge_timeout'])) { + fwrite($fp, $request); + fclose($fp); + } else { + // Cannot connect? + error('Could not PURGE for ' . $host); + } + + } + } + function file_write($path, $data) { global $config; if(preg_match('/^scp:\/\/(.+)$/', $path, $m)) { @@ -233,6 +252,15 @@ return; } + if(isset($config['purge']) && isset($_SERVER['HTTP_HOST'])) { + // Purge cache + if(basename($path) == $config['file_index']) { + // Index file (/index.html); purge "/" as well + purge(dirname($path) . '/'); + } + purge($path); + } + if(!$fp = fopen($path, 'c')) error('Unable to open file for writing: ' . $path);