)
2005-07-19: 2.0.9
- Better control of post_id and comment_id by refactoring the code
(inspired by a Brian Dupuis patch).
- Avoid cleaning cache twice due to WP bugs that wrongly calls two actions.
2005-07-12: 2.0.8
- Add paranoic control to make sure it only caches files with
closing "body" and "html" tags.
2005-06-23: 2.0.7
- Add an extra control to make sure meta_mtime >= content_mtime
(it could serves incomplete html because other process is re-generating
content file and the meta file is the previous one).
2005-06-23: 2.0.6
- Delect cache _selectively_. If post_id is known
it deletes only that cache and the general (indexes) ones.
See: http://mnm.uib.es/gallir/wp-cache-2/#comment-4194
- Delete cache files (all) also after moderation.
2005-06-19: 2.0.5
- Added "#anchors" to refresh cache files' list
(http://mnm.uib.es/gallir/wp-cache-2/#comment-4116)
2005-06-09: 2.0.4
- Avoid "fwrite() thrashing" at the begining of a connections storm
- Send Content-Size header when generated dynamically too
- Clean stats cache before deleting expired files
- Optimized phase1, EVEN MORE! :-):
removed random and extrachecks that were not useful in the context
move checking for .meta at the begining
2005-05-27: 2.0.3
- Check for zero length of user agent and uri strings
2005-05-24: 2.0.2a
- As a workaround for buggy apache installations, create
Content-Type header if is not retrieved from Apache headers.
2005-05-23: 2.0.2
- Added mfunc sintax as in Staticize Reloaded 2.5,
also keep tags but take out function calls
- Check of numbers are really numbers in web forms.
- Remove header_list function verification, its result are not
the same.
- wp-cache now verifies if gzipcompression is enabled
2005-05-08: 2.0.1
sanitize function names to aovid namespace collisions
2005-05-08: 2.0-beta6
ignore URI after #, it's sent by buggy clients
print in red expired files's cache time
if phase2 was compiled, reuse its function to remove files,
it avoids race-conditions
check html _and_ meta exist when listing/accesing files in cache
2005-05-06: 2.0-beta5
remove all expired files when one has expired
POSTs are completely ignored
only wordpress specific cookies are used for the md5 key
2005-05-06: 2.0-beta4
move wp_cache_microtime_diff to phase 2
normalize functions' name in phase2
workaround for nasty bug un PHP4(.3) that hits when cache fallbacks to flock()
2005-05-06: 2.0-beta3
include sample configuration file if the final one does not exist
more verbose in errors
change order of initial configuration to give better information
stop if global cache is not enabled
wp-cache-phase1 returns silently if no wp-cache-config.php is found
2005-05-06: 2.0-beta2
removed paranoic chmod's
check for cache file consistency in Phase1 several times
addded option to prevent cache based on user-agents
added size in KB to every listed file in "cache listing"
*/
$wp_cache_config_file = ABSPATH . 'wp-content/wp-cache-config.php';
$wp_cache_config_file_sample = ABSPATH . 'wp-content/plugins/wp-cache/wp-cache-config-sample.php';
$wp_cache_link = ABSPATH . 'wp-content/advanced-cache.php';
$wp_cache_file = ABSPATH . 'wp-content/plugins/wp-cache/wp-cache-phase1.php';
if( !@include($wp_cache_config_file) ) {
@include($wp_cache_config_file_sample);
}
function wp_cache_add_pages() {
add_options_page('WP-Cache Manager', 'WP-Cache', 5, __FILE__, 'wp_cache_manager');
}
function wp_cache_manager() {
global $wp_cache_config_file, $valid_nonce;
$valid_nonce = wp_verify_nonce($_REQUEST['_wpnonce'], 'wp-cache');
echo '
';
echo "
WP-Cache Manager
\n";
if(isset($_REQUEST['wp_restore_config']) && $valid_nonce) {
unlink($wp_cache_config_file);
echo 'Configuration file changed, some values might be wrong. Load the page again from the "Options" menu to reset them.';
}
echo '
Add here strings (not a filename) that forces a page not to be cached. For example, if your URLs include year and you dont want to cache last year posts, it's enough to specify the year, i.e. '/2004/'. WP-Cache will search if that string is part of the URI and if so, it will no cache that page.
Add here those filenames that can be cached, even if they match one of the rejected substring specified above.
\n";
echo '\n";
}
function wp_cache_enable() {
global $wp_cache_config_file, $cache_enabled;
if(get_settings('gzipcompression')) {
echo "Error: GZIP compression is enabled, disable it if you want to enable wp-cache.
";
return false;
}
if( wp_cache_replace_line('^ *\$cache_enabled', '$cache_enabled = true;', $wp_cache_config_file) ) {
$cache_enabled = true;
}
}
function wp_cache_disable() {
global $wp_cache_config_file, $cache_enabled;
if (wp_cache_replace_line('^ *\$cache_enabled',
'$cache_enabled = false;', $wp_cache_config_file)) {
$cache_enabled = false;
}
}
function wp_cache_is_enabled() {
global $wp_cache_config_file;
if(get_settings('gzipcompression')) {
echo "Warning: GZIP compression is enabled in Wordpress, wp-cache will be bypassed until you disable gzip compression. ";
return false;
}
$lines = file($wp_cache_config_file);
foreach($lines as $line) {
if (preg_match('/^ *\$cache_enabled *= *true *;/', $line))
return true;
}
return false;
}
function wp_cache_replace_line($old, $new, $my_file) {
if (!is_writable($my_file)) {
echo "Error: file $my_file is not writeable. \n";
return false;
}
$found = false;
$lines = file($my_file);
foreach($lines as $line) {
if ( preg_match("/$old/", $line)) {
$found = true;
break;
}
}
if ($found) {
$fd = fopen($my_file, 'w');
foreach($lines as $line) {
if ( !preg_match("/$old/", $line))
fputs($fd, $line);
else {
fputs($fd, "$new //Added by WP-Cache Manager\n");
}
}
fclose($fd);
return true;
}
$fd = fopen($my_file, 'w');
$done = false;
foreach($lines as $line) {
if ( $done || !preg_match('/^define|\$|\?>/', $line))
fputs($fd, $line);
else {
fputs($fd, "$new //Added by WP-Cache Manager\n");
fputs($fd, $line);
$done = true;
}
}
fclose($fd);
return true;
/*
copy($my_file, $my_file . "-prev");
rename($my_file . '-new', $my_file);
*/
}
function wp_cache_verify_cache_dir() {
global $cache_path;
$dir = dirname($cache_path);
if ( !file_exists($cache_path) ) {
if ( !is_writable( $dir ) || !($dir = mkdir( $cache_path, 0777) ) ) {
echo "Error: Your cache directory ($cache_path) did not exist and couldn't be created by the web server. Check $dir permissions.";
return false;
}
}
if ( !is_writable($cache_path)) {
echo "Error: Your cache directory ($cache_path) or $dir need to be writable for this plugin to work. Double-check it.";
return false;
}
if ( '/' != substr($cache_path, -1)) {
$cache_path .= '/';
}
return true;
}
function wp_cache_verify_config_file() {
global $wp_cache_config_file, $wp_cache_config_file_sample;
$new = false;
$dir = dirname($wp_cache_config_file);
if ( !is_writable($dir)) {
echo "Error: wp-content directory ($dir) is not writable by the Web server. Check its permissions.";
return false;
}
if ( !file_exists($wp_cache_config_file) ) {
if ( !file_exists($wp_cache_config_file_sample) ) {
echo "Error: Sample WP-Cache config file ($wp_cache_config_file_sample) does not exist. Verify you installation.";
return false;
}
copy($wp_cache_config_file_sample, $wp_cache_config_file);
$new = true;
}
if ( !is_writable($wp_cache_config_file)) {
echo "Error: Your WP-Cache config file ($wp_cache_config_file) is not writable by the Web server. Check its permissions.";
return false;
}
require($wp_cache_config_file);
return true;
}
function wp_cache_check_link() {
global $wp_cache_link, $wp_cache_file;
if ( basename(@readlink($wp_cache_link)) != basename($wp_cache_file)) {
@unlink($wp_cache_link);
if (!@symlink ($wp_cache_file, $wp_cache_link)) {
echo "advanced-cache.php link does not exist ";
echo "Create it by executing: ln -s $wp_cache_file $wp_cache_link in your server ";
return false;
}
}
return true;
}
function wp_cache_check_global_config() {
$global = ABSPATH . 'wp-config.php';
$lines = file($global);
foreach($lines as $line) {
if (preg_match('/^ *define *\( *\'WP_CACHE\' *, *true *\) *;/', $line)) {
return true;
}
}
$line = 'define(\'WP_CACHE\', true);';
if (!is_writable($global) || !wp_cache_replace_line('define *\( *\'WP_CACHE\'', $line, $global) ) {
echo "Error: WP_CACHE is not enabled in your wp-config.php file and I couldn't modified it. ";
echo "Edit $global and add the following line: define('WP_CACHE', true); Otherwise, WP-Cache will not be executed by Wordpress core. ";
return false;
}
return true;
}
function wp_cache_files() {
global $cache_path, $file_prefix, $cache_max_time, $valid_nonce;
if ( '/' != substr($cache_path, -1)) {
$cache_path .= '/';
}
if ( $valid_nonce ) {
if(isset($_REQUEST['wp_delete_cache'])) {
wp_cache_clean_cache($file_prefix);
}
if(isset($_REQUEST['wp_delete_cache_file'])) {
wp_cache_clean_cache($_REQUEST['wp_delete_cache_file']);
}
if(isset($_REQUEST['wp_delete_expired'])) {
wp_cache_clean_expired($file_prefix);
}
}
if(isset($_REQUEST['wp_list_cache'])) {
$list_files = true;
$list_mess = "Update list";
} else
$list_mess = "List files";
echo '';
}
function wp_cache_clean_cache($file_prefix) {
global $cache_path;
// If phase2 was compiled, use its function to avoid race-conditions
if(function_exists('wp_cache_phase2_clean_cache'))
return wp_cache_phase2_clean_cache($file_prefix);
$expr = "/^$file_prefix/";
if ( ($handle = opendir( $cache_path )) ) {
while ( false !== ($file = readdir($handle))) {
if ( preg_match($expr, $file) ) {
unlink($cache_path . $file);
}
}
closedir($handle);
}
}
function wp_cache_clean_expired($file_prefix) {
global $cache_path, $cache_max_time;
// If phase2 was compiled, use its function to avoid race-conditions
if(function_exists('wp_cache_phase2_clean_expired'))
return wp_cache_phase2_clean_expired($file_prefix);
$expr = "/^$file_prefix/";
$now = time();
if ( ($handle = opendir( $cache_path )) ) {
while ( false !== ($file = readdir($handle))) {
if ( preg_match($expr, $file) &&
(filemtime($cache_path . $file) + $cache_max_time) <= $now) {
unlink($cache_path . $file);
}
}
closedir($handle);
}
}
add_action('admin_menu', 'wp_cache_add_pages');
?>