1 | <?php
|
---|
2 |
|
---|
3 | function wp_cache_phase2() {
|
---|
4 | global $cache_filename, $cache_acceptable_files, $wp_cache_gzip_encoding, $super_cache_enabled, $cache_rebuild_files, $wp_cache_gmt_offset, $wp_cache_blog_charset, $wp_cache_last_gc;
|
---|
5 | global $cache_max_time, $wp_cache_not_logged_in, $wp_cache_request_uri;
|
---|
6 |
|
---|
7 | $wp_cache_gmt_offset = get_option( 'gmt_offset' ); // caching for later use when wpdb is gone. http://wordpress.org/support/topic/224349
|
---|
8 | $wp_cache_blog_charset = get_option( 'blog_charset' );
|
---|
9 |
|
---|
10 | wp_cache_mutex_init();
|
---|
11 | if(function_exists('add_action') && ( !defined( 'WPLOCKDOWN' ) || ( defined( 'WPLOCKDOWN' ) && constant( 'WPLOCKDOWN' ) == '0' ) ) ) {
|
---|
12 | // Post ID is received
|
---|
13 | add_action('publish_post', 'wp_cache_post_edit', 0);
|
---|
14 | add_action('edit_post', 'wp_cache_post_change', 0); // leaving a comment called edit_post
|
---|
15 | add_action('delete_post', 'wp_cache_post_edit', 0);
|
---|
16 | add_action('publish_phone', 'wp_cache_post_edit', 0);
|
---|
17 | // Coment ID is received
|
---|
18 | add_action('trackback_post', 'wp_cache_get_postid_from_comment', 99);
|
---|
19 | add_action('pingback_post', 'wp_cache_get_postid_from_comment', 99);
|
---|
20 | add_action('comment_post', 'wp_cache_get_postid_from_comment', 99);
|
---|
21 | add_action('edit_comment', 'wp_cache_get_postid_from_comment', 99);
|
---|
22 | add_action('wp_set_comment_status', 'wp_cache_get_postid_from_comment', 99);
|
---|
23 | // No post_id is available
|
---|
24 | add_action('delete_comment', 'wp_cache_no_postid', 99);
|
---|
25 | add_action('switch_theme', 'wp_cache_no_postid', 99);
|
---|
26 | add_action('edit_user_profile_update', 'wp_cache_no_postid', 99);
|
---|
27 |
|
---|
28 | add_action('wp_cache_gc','wp_cache_gc_cron');
|
---|
29 |
|
---|
30 | do_cacheaction( 'add_cacheaction' );
|
---|
31 | }
|
---|
32 |
|
---|
33 | if( $wp_cache_not_logged_in && is_user_logged_in() )
|
---|
34 | return false;
|
---|
35 |
|
---|
36 | if( $_SERVER["REQUEST_METHOD"] == 'POST' || get_option('gzipcompression'))
|
---|
37 | return false;
|
---|
38 | $script = basename($_SERVER['PHP_SELF']);
|
---|
39 | if (!in_array($script, $cache_acceptable_files) && wp_cache_is_rejected($wp_cache_request_uri))
|
---|
40 | return false;
|
---|
41 | if (wp_cache_user_agent_is_rejected()) return;
|
---|
42 | if($wp_cache_gzip_encoding)
|
---|
43 | header('Vary: Accept-Encoding, Cookie');
|
---|
44 | else
|
---|
45 | header('Vary: Cookie');
|
---|
46 | ob_start( 'wp_cache_ob_callback' );
|
---|
47 |
|
---|
48 | // restore old supercache file temporarily
|
---|
49 | if( $super_cache_enabled && $cache_rebuild_files ) {
|
---|
50 | $user_info = wp_cache_get_cookies_values();
|
---|
51 | $do_cache = apply_filters( 'do_createsupercache', $user_info );
|
---|
52 | if( $user_info == '' || $do_cache === true ) {
|
---|
53 | $dir = get_current_url_supercache_dir();
|
---|
54 | $files_to_check = array( $dir . 'index.html', $dir . 'index.html.gz' );
|
---|
55 | foreach( $files_to_check as $cache_file ) {
|
---|
56 | if( !@file_exists( $cache_file . '.needs-rebuild' ) )
|
---|
57 | continue;
|
---|
58 | $mtime = @filemtime($cache_file . '.needs-rebuild');
|
---|
59 | if( $mtime && (time() - $mtime) < 30 ) {
|
---|
60 | @rename( $cache_file . '.needs-rebuild', $cache_file );
|
---|
61 | }
|
---|
62 | // cleanup old files or if rename fails
|
---|
63 | if( @file_exists( $cache_file . '.needs-rebuild' ) ) {
|
---|
64 | @unlink( $cache_file . '.needs-rebuild' );
|
---|
65 | }
|
---|
66 | }
|
---|
67 | }
|
---|
68 | }
|
---|
69 |
|
---|
70 | if( !isset( $cache_max_time ) )
|
---|
71 | $cache_max_time = 600;
|
---|
72 | $last_gc = get_option( "wpsupercache_gc_time" );
|
---|
73 |
|
---|
74 | if( !$last_gc ) {
|
---|
75 | update_option( 'wpsupercache_gc_time', time() );
|
---|
76 | }
|
---|
77 | $next_gc = $cache_max_time < 1800 ? $cache_max_time : 600;
|
---|
78 | if( $last_gc < ( time() - $next_gc ) ) {
|
---|
79 | update_option( 'wpsupercache_gc_time', time() );
|
---|
80 |
|
---|
81 | global $wp_cache_shutdown_gc;
|
---|
82 | if( !isset( $wp_cache_shutdown_gc ) || $wp_cache_shutdown_gc == 0 ) {
|
---|
83 | if(!wp_next_scheduled('wp_cache_gc')) wp_schedule_single_event(time() + 10 , 'wp_cache_gc');
|
---|
84 | } else {
|
---|
85 | global $time_to_gc_cache;
|
---|
86 | $time_to_gc_cache = 1; // tell the "shutdown gc" to run!
|
---|
87 | }
|
---|
88 | }
|
---|
89 | }
|
---|
90 |
|
---|
91 | function wp_cache_get_response_headers() {
|
---|
92 | if(function_exists('apache_response_headers')) {
|
---|
93 | flush();
|
---|
94 | $headers = apache_response_headers();
|
---|
95 | } else if(function_exists('headers_list')) {
|
---|
96 | $headers = array();
|
---|
97 | foreach(headers_list() as $hdr) {
|
---|
98 | list($header_name, $header_value) = explode(': ', $hdr, 2);
|
---|
99 | $headers[$header_name] = $header_value;
|
---|
100 | }
|
---|
101 | } else
|
---|
102 | $headers = null;
|
---|
103 |
|
---|
104 | return $headers;
|
---|
105 | }
|
---|
106 |
|
---|
107 | function wp_cache_is_rejected($uri) {
|
---|
108 | global $cache_rejected_uri;
|
---|
109 |
|
---|
110 | $auto_rejected = array( '/wp-admin/', 'xmlrpc.php', 'wp-app.php' );
|
---|
111 | foreach( $auto_rejected as $u ) {
|
---|
112 | if( strstr( $uri, $u ) )
|
---|
113 | return true; // we don't allow caching of wp-admin for security reasons
|
---|
114 | }
|
---|
115 | foreach ($cache_rejected_uri as $expr) {
|
---|
116 | if( $expr != '' && preg_match( "~$expr~", $uri ) )
|
---|
117 | return true;
|
---|
118 | }
|
---|
119 | return false;
|
---|
120 | }
|
---|
121 |
|
---|
122 | function wp_cache_mutex_init() {
|
---|
123 | global $use_flock, $mutex, $cache_path, $mutex_filename, $sem_id, $blog_cache_dir;
|
---|
124 |
|
---|
125 | if(!is_bool($use_flock)) {
|
---|
126 | if(function_exists('sem_get'))
|
---|
127 | $use_flock = false;
|
---|
128 | else
|
---|
129 | $use_flock = true;
|
---|
130 | }
|
---|
131 |
|
---|
132 | $mutex = false;
|
---|
133 | if ($use_flock)
|
---|
134 | $mutex = @fopen($blog_cache_dir . $mutex_filename, 'w');
|
---|
135 | else
|
---|
136 | $mutex = @sem_get($sem_id, 1, 0644 | IPC_CREAT, 1);
|
---|
137 | }
|
---|
138 |
|
---|
139 | function wp_cache_writers_entry() {
|
---|
140 | global $use_flock, $mutex, $cache_path, $mutex_filename, $wp_cache_mutex_disabled;
|
---|
141 |
|
---|
142 | if( isset( $wp_cache_mutex_disabled ) && $wp_cache_mutex_disabled )
|
---|
143 | return true;
|
---|
144 |
|
---|
145 | if( !$mutex )
|
---|
146 | return false;
|
---|
147 |
|
---|
148 | if ($use_flock)
|
---|
149 | flock($mutex, LOCK_EX);
|
---|
150 | else
|
---|
151 | sem_acquire($mutex);
|
---|
152 |
|
---|
153 | return true;
|
---|
154 | }
|
---|
155 |
|
---|
156 | function wp_cache_writers_exit() {
|
---|
157 | global $use_flock, $mutex, $cache_path, $mutex_filename, $wp_cache_mutex_disabled;
|
---|
158 |
|
---|
159 | if( isset( $wp_cache_mutex_disabled ) && $wp_cache_mutex_disabled )
|
---|
160 | return true;
|
---|
161 |
|
---|
162 | if( !$mutex )
|
---|
163 | return false;
|
---|
164 |
|
---|
165 | if ($use_flock)
|
---|
166 | flock($mutex, LOCK_UN);
|
---|
167 | else
|
---|
168 | sem_release($mutex);
|
---|
169 | }
|
---|
170 |
|
---|
171 | function get_current_url_supercache_dir() {
|
---|
172 | global $cached_direct_pages, $cache_path, $wp_cache_request_uri;
|
---|
173 | $uri = preg_replace('/[ <>\'\"\r\n\t\(\)]/', '', str_replace( '/index.php', '/', str_replace( '..', '', preg_replace("/(\?.*)?$/", '', $wp_cache_request_uri ) ) ) );
|
---|
174 | $uri = str_replace( '\\', '', $uri );
|
---|
175 | $dir = strtolower(preg_replace('/:.*$/', '', $_SERVER["HTTP_HOST"])) . $uri; // To avoid XSS attacks
|
---|
176 | $dir = apply_filters( 'supercache_dir', $dir );
|
---|
177 | $dir = trailingslashit( $cache_path . 'supercache/' . $dir );
|
---|
178 | if( is_array( $cached_direct_pages ) && in_array( $_SERVER[ 'REQUEST_URI' ], $cached_direct_pages ) ) {
|
---|
179 | $dir = trailingslashit( ABSPATH . $uri );
|
---|
180 | }
|
---|
181 | $dir = str_replace( '//', '/', $dir );
|
---|
182 | return $dir;
|
---|
183 | }
|
---|
184 |
|
---|
185 | function wp_cache_ob_callback( $buffer ) {
|
---|
186 | if( defined( 'DONOTCACHEPAGE' ) )
|
---|
187 | return $buffer;
|
---|
188 | $buffer = &wp_cache_get_ob( $buffer );
|
---|
189 | wp_cache_shutdown_callback();
|
---|
190 | return $buffer;
|
---|
191 | }
|
---|
192 |
|
---|
193 |
|
---|
194 | function wp_cache_get_ob(&$buffer) {
|
---|
195 | global $cache_path, $cache_filename, $meta_file, $wp_start_time, $supercachedir;
|
---|
196 | global $new_cache, $wp_cache_meta, $file_expired, $blog_id, $cache_compression;
|
---|
197 | global $wp_cache_gzip_encoding, $super_cache_enabled, $cached_direct_pages;
|
---|
198 | global $wp_cache_404, $gzsize, $supercacheonly, $wp_cache_gzip_first, $wp_cache_gmt_offset;
|
---|
199 | global $blog_cache_dir, $wp_cache_request_uri;
|
---|
200 |
|
---|
201 | $new_cache = true;
|
---|
202 | $wp_cache_meta = '';
|
---|
203 |
|
---|
204 | /* Mode paranoic, check for closing tags
|
---|
205 | * we avoid caching incomplete files */
|
---|
206 | if( $wp_cache_404 ) {
|
---|
207 | $new_cache = false;
|
---|
208 | $buffer .= "\n<!-- Page not cached by WP Super Cache. 404. -->\n";
|
---|
209 | }
|
---|
210 |
|
---|
211 | if (!preg_match('/(<\/html>|<\/rss>|<\/feed>)/i',$buffer) ) {
|
---|
212 | $new_cache = false;
|
---|
213 | if( false === strpos( $_SERVER[ 'REQUEST_URI' ], 'robots.txt' ) )
|
---|
214 | $buffer .= "\n<!-- Page not cached by WP Super Cache. No closing HTML tag. Check your theme. -->\n";
|
---|
215 | }
|
---|
216 |
|
---|
217 | if( !$new_cache )
|
---|
218 | return $buffer;
|
---|
219 |
|
---|
220 | $duration = wp_cache_microtime_diff($wp_start_time, microtime());
|
---|
221 | $duration = sprintf("%0.3f", $duration);
|
---|
222 | $buffer .= "\n<!-- Dynamic page generated in $duration seconds. -->\n";
|
---|
223 |
|
---|
224 | if( !wp_cache_writers_entry() ) {
|
---|
225 | $buffer .= "\n<!-- Page not cached by WP Super Cache. Could not get mutex lock. -->\n";
|
---|
226 | return $buffer;
|
---|
227 | }
|
---|
228 |
|
---|
229 | //if( !((!$file_expired && $mtime) || ($mtime && $file_expired && (time() - $mtime) < 5)) ) {
|
---|
230 | $dir = get_current_url_supercache_dir();
|
---|
231 | $supercachedir = $cache_path . 'supercache/' . preg_replace('/:.*$/', '', $_SERVER["HTTP_HOST"]);
|
---|
232 | if( !empty( $_GET ) || is_feed() || ( $super_cache_enabled == true && is_dir( substr( $supercachedir, 0, -1 ) . '.disabled' ) ) )
|
---|
233 | $super_cache_enabled = false;
|
---|
234 |
|
---|
235 | $tmp_wpcache_filename = $cache_path . uniqid( mt_rand(), true ) . '.tmp';
|
---|
236 |
|
---|
237 | // Don't create wp-cache files for anon users
|
---|
238 | $supercacheonly = false;
|
---|
239 | if( $super_cache_enabled && wp_cache_get_cookies_values() == '' )
|
---|
240 | $supercacheonly = true;
|
---|
241 |
|
---|
242 | if( !$supercacheonly ) {
|
---|
243 | if ( !@file_exists( $blog_cache_dir . $cache_filename ) || ( @file_exists( $blog_cache_dir . $cache_filename ) && ( time() - @filemtime( $blog_cache_dir . $cache_filename ) ) > 5 ) ) {
|
---|
244 | $fr = @fopen($tmp_wpcache_filename, 'w');
|
---|
245 | if (!$fr) {
|
---|
246 | $buffer .= "<!-- File not cached! Super Cache Couldn't write to: " . str_replace( ABSPATH, '', $cache_path ) . $cache_filename . " -->\n";
|
---|
247 | return $buffer;
|
---|
248 | }
|
---|
249 | }
|
---|
250 | }
|
---|
251 | if( $super_cache_enabled ) {
|
---|
252 | $user_info = wp_cache_get_cookies_values();
|
---|
253 | $do_cache = apply_filters( 'do_createsupercache', $user_info );
|
---|
254 | if( $user_info == '' || $do_cache === true ) {
|
---|
255 |
|
---|
256 | if( @is_dir( $dir ) == false )
|
---|
257 | @wp_mkdir_p( $dir );
|
---|
258 |
|
---|
259 | $cache_fname = "{$dir}index.html";
|
---|
260 | $tmp_cache_filename = $dir . uniqid( mt_rand(), true ) . '.tmp';
|
---|
261 | if ( !@file_exists( $cache_fname ) || ( @file_exists( $cache_fname ) && ( time() - @filemtime( $blog_cache_dir . $cache_filename ) ) > 5 ) ) {
|
---|
262 | $fr2 = @fopen( $tmp_cache_filename, 'w' );
|
---|
263 | if (!$fr2) {
|
---|
264 | $buffer .= "<!-- File not cached! Super Cache Couldn't write to: " . str_replace( ABSPATH, '', $tmp_cache_filename ) . " -->\n";
|
---|
265 | @fclose( $fr );
|
---|
266 | @unlink( $tmp_wpcache_filename );
|
---|
267 | return $buffer;
|
---|
268 | } elseif( $cache_compression ) {
|
---|
269 | $gz = @fopen( $tmp_cache_filename . ".gz", 'w');
|
---|
270 | if (!$gz) {
|
---|
271 | $buffer .= "<!-- File not cached! Super Cache Couldn't write to: " . str_replace( ABSPATH, '', $tmp_cache_filename ) . ".gz -->\n";
|
---|
272 | @fclose( $fr );
|
---|
273 | @unlink( $tmp_wpcache_filename );
|
---|
274 | @fclose( $fr2 );
|
---|
275 | @unlink( $tmp_cache_filename );
|
---|
276 | return $buffer;
|
---|
277 | }
|
---|
278 | }
|
---|
279 | }
|
---|
280 | }
|
---|
281 | }
|
---|
282 |
|
---|
283 | if (preg_match('/<!--mclude|<!--mfunc/', $buffer)) { //Dynamic content
|
---|
284 | $store = preg_replace('|<!--mclude (.*?)-->(.*?)<!--/mclude-->|is',
|
---|
285 | "<!--mclude-->\n<?php include_once('" . ABSPATH . "$1'); ?>\n<!--/mclude-->", $buffer);
|
---|
286 | $store = preg_replace('|<!--mfunc (.*?)-->(.*?)<!--/mfunc-->|is',
|
---|
287 | "<!--mfunc-->\n<?php $1 ;?>\n<!--/mfunc-->", $store);
|
---|
288 | $store = apply_filters( 'wpsupercache_buffer', $store );
|
---|
289 | $wp_cache_meta[ 'dynamic' ] = true;
|
---|
290 | /* Clean function calls in tag */
|
---|
291 | $buffer = preg_replace('|<!--mclude (.*?)-->|is', '<!--mclude-->', $buffer);
|
---|
292 | $buffer = preg_replace('|<!--mfunc (.*?)-->|is', '<!--mfunc-->', $buffer);
|
---|
293 | if( $fr )
|
---|
294 | fputs($fr, $store);
|
---|
295 | if( $fr2 )
|
---|
296 | fputs($fr2, $store . '<!-- super cache -->' );
|
---|
297 | if( $gz )
|
---|
298 | fputs($gz, gzencode( $store . '<!-- super cache gz -->', 1, FORCE_GZIP ) );
|
---|
299 | } else {
|
---|
300 | $buffer = apply_filters( 'wpsupercache_buffer', $buffer );
|
---|
301 | $buffer .= "<!-- Cached page generated by WP-Super-Cache on " . gmdate('Y-m-d H:i:s', (time() + ( $wp_cache_gmt_offset * 3600))) . " -->\n";
|
---|
302 |
|
---|
303 | if( $gz || $wp_cache_gzip_encoding ) {
|
---|
304 | $gzdata = gzencode( $buffer . "<!-- Compression = gzip -->", 3, FORCE_GZIP );
|
---|
305 | $gzsize = strlen($gzdata);
|
---|
306 | }
|
---|
307 | if ($wp_cache_gzip_encoding) {
|
---|
308 | $wp_cache_meta[ 'headers' ][ 'Content-Encoding' ] = 'Content-Encoding: ' . $wp_cache_gzip_encoding;
|
---|
309 | $wp_cache_meta[ 'headers' ][ 'Vary' ] = 'Vary: Accept-Encoding, Cookie';
|
---|
310 | // Return uncompressed data & store compressed for later use
|
---|
311 | if( $fr )
|
---|
312 | fputs($fr, $gzdata);
|
---|
313 | } else { // no compression
|
---|
314 | $wp_cache_meta[ 'headers' ][ 'Vary' ] = 'Vary: Cookie';
|
---|
315 | if( $fr )
|
---|
316 | fputs($fr, $buffer);
|
---|
317 | }
|
---|
318 | if( $fr2 )
|
---|
319 | fputs($fr2, $buffer . '<!-- super cache -->' );
|
---|
320 | if( $gz )
|
---|
321 | fwrite($gz, $gzdata );
|
---|
322 | $buffer .= $log;
|
---|
323 | }
|
---|
324 | $new_cache = true;
|
---|
325 | if( $fr ) {
|
---|
326 | $supercacheonly = false;
|
---|
327 | fclose($fr);
|
---|
328 | if( !rename( $tmp_wpcache_filename, $blog_cache_dir . $cache_filename ) ) {
|
---|
329 | unlink( $blog_cache_dir . $cache_filename );
|
---|
330 | rename( $tmp_wpcache_filename, $blog_cache_dir . $cache_filename );
|
---|
331 | }
|
---|
332 | }
|
---|
333 | if( $fr2 ) {
|
---|
334 | fclose($fr2);
|
---|
335 | if( !@rename( $tmp_cache_filename, $cache_fname ) ) {
|
---|
336 | @unlink( $cache_fname );
|
---|
337 | @rename( $tmp_cache_filename, $cache_fname );
|
---|
338 | }
|
---|
339 | }
|
---|
340 | if( $gz ) {
|
---|
341 | fclose($gz);
|
---|
342 | if( !@rename( $tmp_cache_filename . '.gz', $cache_fname . '.gz' ) ) {
|
---|
343 | @unlink( $cache_fname . '.gz' );
|
---|
344 | @rename( $tmp_cache_filename . '.gz', $cache_fname . '.gz' );
|
---|
345 | }
|
---|
346 | }
|
---|
347 | //}
|
---|
348 | wp_cache_writers_exit();
|
---|
349 | if ( !headers_sent() && isset( $wp_cache_gzip_first ) && 1 == $wp_cache_gzip_first && $wp_cache_gzip_encoding && $gzdata) {
|
---|
350 | header( 'Content-Encoding: ' . $wp_cache_gzip_encoding );
|
---|
351 | header( 'Vary: Accept-Encoding, Cookie' );
|
---|
352 | header( 'Content-Length: ' . $gzsize );
|
---|
353 | return $gzdata;
|
---|
354 | } else {
|
---|
355 | return $buffer;
|
---|
356 | }
|
---|
357 | }
|
---|
358 |
|
---|
359 | function wp_cache_phase2_clean_cache($file_prefix) {
|
---|
360 | global $cache_path, $blog_cache_dir;
|
---|
361 |
|
---|
362 | if( !wp_cache_writers_entry() )
|
---|
363 | return false;
|
---|
364 | if ( ( $handle = @opendir( $blog_cache_dir ) ) ) {
|
---|
365 | while ( false !== ($file = @readdir($handle))) {
|
---|
366 | if ( preg_match("/^$file_prefix/", $file) )
|
---|
367 | @unlink( $blog_cache_dir . $file );
|
---|
368 | }
|
---|
369 | closedir($handle);
|
---|
370 | }
|
---|
371 | wp_cache_writers_exit();
|
---|
372 | }
|
---|
373 |
|
---|
374 | function prune_super_cache( $directory, $force = false, $rename = false ) {
|
---|
375 | global $cache_max_time, $cache_path, $super_cache_enabled, $cache_rebuild_files, $blog_cache_dir;
|
---|
376 |
|
---|
377 | if( !is_admin() && $super_cache_enabled == 0 )
|
---|
378 | return false;
|
---|
379 |
|
---|
380 | if( !isset( $cache_max_time ) )
|
---|
381 | $cache_max_time = 3600;
|
---|
382 |
|
---|
383 | $now = time();
|
---|
384 |
|
---|
385 | $protected_directories = array( $cache_path . '.htaccess', $cache_path . $blog_cache_dir . 'meta', $cache_path . 'supercache' );
|
---|
386 |
|
---|
387 | $oktodelete = false;
|
---|
388 | if (is_dir($directory)) {
|
---|
389 | if( $dh = @opendir( $directory ) ) {
|
---|
390 | $directory = trailingslashit( $directory );
|
---|
391 | while( ( $entry = @readdir( $dh ) ) !== false ) {
|
---|
392 | if ($entry == '.' || $entry == '..')
|
---|
393 | continue;
|
---|
394 | $entry = $directory . $entry;
|
---|
395 | prune_super_cache( $entry, $force, $rename );
|
---|
396 | // If entry is a directory, AND it's not a protected one, AND we're either forcing the delete, OR the file is out of date,
|
---|
397 | if( is_dir( $entry ) && !in_array( $entry, $protected_directories ) && ( $force || @filemtime( $entry ) + $cache_max_time <= $now ) ) {
|
---|
398 | // if the directory isn't empty can't delete it
|
---|
399 | if( $handle = @opendir( $entry ) ) {
|
---|
400 | $donotdelete = false;
|
---|
401 | while( !$donotdelete && ( $file = @readdir( $handle ) ) !== false ) {
|
---|
402 | if ($file == '.' || $file == '..')
|
---|
403 | continue;
|
---|
404 | $donotdelete = true;
|
---|
405 | }
|
---|
406 | closedir($handle);
|
---|
407 | }
|
---|
408 | if( $donotdelete )
|
---|
409 | continue;
|
---|
410 | if( !$rename )
|
---|
411 | @rmdir( $entry );
|
---|
412 | }
|
---|
413 | }
|
---|
414 | closedir($dh);
|
---|
415 | }
|
---|
416 | } elseif( is_file($directory) && ($force || @filemtime( $directory ) + $cache_max_time <= $now ) ) {
|
---|
417 | $oktodelete = true;
|
---|
418 | if( in_array( $directory, $protected_directories ) )
|
---|
419 | $oktodelete = false;
|
---|
420 | if( $oktodelete && !$rename ) {
|
---|
421 | @unlink( $directory );
|
---|
422 | } elseif( $oktodelete && $rename ) {
|
---|
423 | wp_cache_rebuild_or_delete( $directory );
|
---|
424 | }
|
---|
425 | }
|
---|
426 | }
|
---|
427 |
|
---|
428 | function wp_cache_rebuild_or_delete( $file ) {
|
---|
429 | global $cache_rebuild_files;
|
---|
430 | if( strpos( $file, '?' ) !== false )
|
---|
431 | $file = substr( $file, 0, strpos( $file, '?' ) );
|
---|
432 | if( $cache_rebuild_files && substr( $file, -14 ) != '.needs-rebuild' ) {
|
---|
433 | if( @rename($file, $file . '.needs-rebuild') ) {
|
---|
434 | @touch( $file . '.needs-rebuild' );
|
---|
435 | } else {
|
---|
436 | @unlink( $file );
|
---|
437 | }
|
---|
438 | } else {
|
---|
439 | @unlink( $file );
|
---|
440 | }
|
---|
441 | }
|
---|
442 |
|
---|
443 | function wp_cache_phase2_clean_expired($file_prefix) {
|
---|
444 | global $cache_path, $cache_max_time, $blog_cache_dir;
|
---|
445 |
|
---|
446 | clearstatcache();
|
---|
447 | if( !wp_cache_writers_entry() )
|
---|
448 | return false;
|
---|
449 | $now = time();
|
---|
450 | if ( ( $handle = @opendir( $blog_cache_dir ) ) ) {
|
---|
451 | while ( false !== ($file = readdir($handle))) {
|
---|
452 | if ( preg_match("/^$file_prefix/", $file) &&
|
---|
453 | (@filemtime( $blog_cache_dir . $file) + $cache_max_time) <= $now ) {
|
---|
454 | @unlink( $blog_cache_dir . $file );
|
---|
455 | @unlink( $blog_cache_dir . 'meta/' . str_replace( '.html', '.meta', $file ) );
|
---|
456 | continue;
|
---|
457 | }
|
---|
458 | if($file != '.' && $file != '..') {
|
---|
459 | if( is_dir( $blog_cache_dir . $file ) == false && (@filemtime($blog_cache_dir . $file) + $cache_max_time) <= $now ) {
|
---|
460 | if( substr( $file, -9 ) != '.htaccess' )
|
---|
461 | @unlink($blog_cache_dir . $file);
|
---|
462 | }
|
---|
463 | }
|
---|
464 | }
|
---|
465 | closedir($handle);
|
---|
466 | prune_super_cache( $cache_path . 'supercache' );
|
---|
467 | }
|
---|
468 |
|
---|
469 | wp_cache_writers_exit();
|
---|
470 | return true;
|
---|
471 | }
|
---|
472 |
|
---|
473 | function wp_cache_shutdown_callback() {
|
---|
474 | global $cache_path, $cache_max_time, $file_expired, $file_prefix, $meta_file, $new_cache, $wp_cache_meta, $known_headers, $blog_id, $wp_cache_gzip_encoding, $gzsize, $cache_filename, $supercacheonly, $blog_cache_dir;
|
---|
475 | global $wp_cache_blog_charset, $wp_cache_request_uri;
|
---|
476 |
|
---|
477 | $wp_cache_meta[ 'uri' ] = $_SERVER["SERVER_NAME"].preg_replace('/[ <>\'\"\r\n\t\(\)]/', '', $wp_cache_request_uri); // To avoid XSS attacks
|
---|
478 | $wp_cache_meta[ 'blog_id' ] = $blog_id;
|
---|
479 | $wp_cache_meta[ 'post' ] = wp_cache_post_id();
|
---|
480 |
|
---|
481 | $response = wp_cache_get_response_headers();
|
---|
482 | foreach ($known_headers as $key) {
|
---|
483 | if(isset($response[$key])) {
|
---|
484 | $wp_cache_meta[ 'headers' ][ $key ] = "$key: " . $response[$key];
|
---|
485 | }
|
---|
486 | }
|
---|
487 | if (!isset( $response['Last-Modified'] )) {
|
---|
488 | $value = gmdate('D, d M Y H:i:s') . ' GMT';
|
---|
489 | /* Dont send this the first time */
|
---|
490 | /* @header('Last-Modified: ' . $value); */
|
---|
491 | $wp_cache_meta[ 'headers' ][ 'Last-Modified' ] = "Last-Modified: $value";
|
---|
492 | }
|
---|
493 | if (!$response['Content-Type'] && !$response['Content-type']) {
|
---|
494 | // On some systems, headers set by PHP can't be fetched from
|
---|
495 | // the output buffer. This is a last ditch effort to set the
|
---|
496 | // correct Content-Type header for feeds, if we didn't see
|
---|
497 | // it in the response headers already. -- dougal
|
---|
498 | if (is_feed()) {
|
---|
499 | $type = get_query_var('feed');
|
---|
500 | $type = str_replace('/','',$type);
|
---|
501 | switch ($type) {
|
---|
502 | case 'atom':
|
---|
503 | $value = "application/atom+xml";
|
---|
504 | break;
|
---|
505 | case 'rdf':
|
---|
506 | $value = "application/rdf+xml";
|
---|
507 | break;
|
---|
508 | case 'rss':
|
---|
509 | case 'rss2':
|
---|
510 | default:
|
---|
511 | $value = "application/rss+xml";
|
---|
512 | }
|
---|
513 | } else { // not a feed
|
---|
514 | $value = get_option( 'html_type' );
|
---|
515 | if( $value == '' )
|
---|
516 | $value = 'text/html';
|
---|
517 | }
|
---|
518 | $value .= "; charset=\"" . $wp_cache_blog_charset . "\"";
|
---|
519 |
|
---|
520 | @header("Content-Type: $value");
|
---|
521 | $wp_cache_meta[ 'headers' ][ 'Content-Type' ] = "Content-Type: $value";
|
---|
522 | }
|
---|
523 |
|
---|
524 | if ( ! $supercacheonly && $new_cache ) {
|
---|
525 | if( $wp_cache_gzip_encoding && !in_array( 'Content-Encoding: ' . $wp_cache_gzip_encoding, $wp_cache_meta[ 'headers' ] ) ) {
|
---|
526 | $wp_cache_meta[ 'headers' ][ 'Content-Encoding' ] = 'Content-Encoding: ' . $wp_cache_gzip_encoding;
|
---|
527 | $wp_cache_meta[ 'headers' ][ 'Vary' ] = 'Vary: Accept-Encoding, Cookie';
|
---|
528 | }
|
---|
529 |
|
---|
530 | $serial = serialize($wp_cache_meta);
|
---|
531 | if( wp_cache_writers_entry() ) {
|
---|
532 | $tmp_meta_filename = $blog_cache_dir . 'meta/' . uniqid( mt_rand(), true ) . '.tmp';
|
---|
533 | $fr = @fopen( $tmp_meta_filename, 'w');
|
---|
534 | if( !$fr )
|
---|
535 | @mkdir( $blog_cache_dir . 'meta' );
|
---|
536 | $fr = fopen( $tmp_meta_filename, 'w');
|
---|
537 | fputs($fr, $serial);
|
---|
538 | fclose($fr);
|
---|
539 | @chmod( $tmp_meta_filename, 0666 & ~umask());
|
---|
540 | if( !@rename( $tmp_meta_filename, $blog_cache_dir . 'meta/' . $meta_file ) ) {
|
---|
541 | unlink( $blog_cache_dir . 'meta/' . $meta_file );
|
---|
542 | rename( $tmp_meta_filename, $blog_cache_dir . 'meta/' . $meta_file );
|
---|
543 | }
|
---|
544 | wp_cache_writers_exit();
|
---|
545 | }
|
---|
546 | }
|
---|
547 | global $time_to_gc_cache;
|
---|
548 | if( isset( $time_to_gc_cache ) && $time_to_gc_cache == 1 )
|
---|
549 | do_action( 'wp_cache_gc' );
|
---|
550 | }
|
---|
551 |
|
---|
552 | function wp_cache_no_postid($id) {
|
---|
553 | return wp_cache_post_change(wp_cache_post_id());
|
---|
554 | }
|
---|
555 |
|
---|
556 | function wp_cache_get_postid_from_comment($comment_id) {
|
---|
557 | global $super_cache_enabled, $wp_cache_request_uri;
|
---|
558 | $comment = get_comment($comment_id, ARRAY_A);
|
---|
559 | $postid = $comment['comment_post_ID'];
|
---|
560 | // Do nothing if comment is not moderated
|
---|
561 | // http://ocaoimh.ie/2006/12/05/caching-wordpress-with-wp-cache-in-a-spam-filled-world
|
---|
562 | if( !preg_match('/wp-admin\//', $wp_cache_request_uri) )
|
---|
563 | if( $comment['comment_approved'] == 'spam' ) { // changed from 1 to "spam"
|
---|
564 | return $postid;
|
---|
565 | } elseif( $comment['comment_approved'] == '0' ) {
|
---|
566 | $super_cache_enabled = 0; // don't remove the super cache static file until comment is approved
|
---|
567 | }
|
---|
568 | // We must check it up again due to WP bugs calling two different actions
|
---|
569 | // for delete, for example both wp_set_comment_status and delete_comment
|
---|
570 | // are called when deleting a comment
|
---|
571 | if ($postid > 0)
|
---|
572 | return wp_cache_post_change($postid);
|
---|
573 | else
|
---|
574 | return wp_cache_post_change(wp_cache_post_id());
|
---|
575 | }
|
---|
576 |
|
---|
577 | function wp_cache_post_edit($post_id) {
|
---|
578 | global $wp_cache_clear_on_post_edit, $cache_path, $blog_cache_dir;
|
---|
579 | if( $wp_cache_clear_on_post_edit ) {
|
---|
580 | prune_super_cache( $blog_cache_dir, true );
|
---|
581 | prune_super_cache( $cache_path . 'supercache/', true );
|
---|
582 | } else {
|
---|
583 | wp_cache_post_change( $post_id );
|
---|
584 | }
|
---|
585 | }
|
---|
586 |
|
---|
587 | function wp_cache_post_id_gc( $siteurl, $post_id ) {
|
---|
588 | global $cache_path;
|
---|
589 |
|
---|
590 | $post_id = intval( $post_id );
|
---|
591 | if( $post_id == 0 )
|
---|
592 | return;
|
---|
593 |
|
---|
594 | $permalink = trailingslashit( str_replace( get_option( 'home' ), '', post_permalink( $post_id ) ) );
|
---|
595 | $dir = $cache_path . 'supercache/' . $siteurl;
|
---|
596 | prune_super_cache( $dir . $permalink, true, true );
|
---|
597 | @rmdir( $dir . $permalink );
|
---|
598 | prune_super_cache( $dir . 'page/', true );
|
---|
599 | }
|
---|
600 |
|
---|
601 | function wp_cache_post_change($post_id) {
|
---|
602 | global $file_prefix, $cache_path, $blog_id, $super_cache_enabled, $blog_cache_dir, $blogcacheid;
|
---|
603 | static $last_processed = -1;
|
---|
604 |
|
---|
605 | if ($post_id == $last_processed) return $post_id;
|
---|
606 | $last_processed = $post_id;
|
---|
607 | if( !wp_cache_writers_entry() )
|
---|
608 | return $post_id;
|
---|
609 |
|
---|
610 | $permalink = trailingslashit( str_replace( get_option( 'siteurl' ), '', post_permalink( $post_id ) ) );
|
---|
611 | if( $super_cache_enabled ) {
|
---|
612 | $siteurl = trailingslashit( strtolower( preg_replace( '/:.*$/', '', str_replace( 'http://', '', get_option( 'home' ) ) ) ) );
|
---|
613 | // make sure the front page has a rebuild file
|
---|
614 | prune_super_cache( $cache_path . 'supercache/' . $siteurl . 'index.html', true, true );
|
---|
615 | prune_super_cache( $cache_path . 'supercache/' . $siteurl . 'index.html.gz', true, true );
|
---|
616 | wp_cache_post_id_gc( $siteurl, $post_id );
|
---|
617 | if( get_option( 'show_on_front' ) == 'page' ) {
|
---|
618 | wp_cache_post_id_gc( $siteurl, get_option( 'page_on_front' ) );
|
---|
619 | wp_cache_post_id_gc( $siteurl, get_option( 'page_for_posts' ) );
|
---|
620 | }
|
---|
621 | }
|
---|
622 |
|
---|
623 | $matches = array();
|
---|
624 | if ( ($handle = @opendir( $blog_cache_dir . 'meta/' )) ) {
|
---|
625 | while ( false !== ($file = readdir($handle))) {
|
---|
626 | if ( preg_match("/^({$file_prefix}{$blogcacheid}.*)\.meta/", $file, $matches) ) {
|
---|
627 | $meta_pathname = $blog_cache_dir . 'meta/' . $file;
|
---|
628 | $content_pathname = $blog_cache_dir . $matches[1] . ".html";
|
---|
629 | $meta = unserialize(@file_get_contents($meta_pathname));
|
---|
630 | if( false == is_array( $meta ) ) {
|
---|
631 | @unlink($meta_pathname);
|
---|
632 | @unlink($content_pathname);
|
---|
633 | continue;
|
---|
634 | }
|
---|
635 | if ($post_id > 0 && $meta) {
|
---|
636 | if ($meta[ 'blog_id' ] == $blog_id && (!$meta[ 'post' ] || $meta[ 'post' ] == $post_id) ) {
|
---|
637 | @unlink($meta_pathname);
|
---|
638 | @unlink($content_pathname);
|
---|
639 | @wp_cache_rebuild_or_delete($cache_path . 'supercache/' . trailingslashit( $meta[ 'uri' ] ) . 'index.html');
|
---|
640 | @wp_cache_rebuild_or_delete($cache_path . 'supercache/' . trailingslashit( $meta[ 'uri' ] ) . 'index.html.gz');
|
---|
641 | }
|
---|
642 | } elseif ($meta[ 'blog_id' ] == $blog_id) {
|
---|
643 | @unlink($meta_pathname);
|
---|
644 | @unlink($content_pathname);
|
---|
645 | @wp_cache_rebuild_or_delete($cache_path . 'supercache/' . trailingslashit( $meta[ 'uri' ] ) . 'index.html');
|
---|
646 | @wp_cache_rebuild_or_delete($cache_path . 'supercache/' . trailingslashit( $meta[ 'uri' ] ) . 'index.html.gz');
|
---|
647 | }
|
---|
648 |
|
---|
649 | }
|
---|
650 | }
|
---|
651 | closedir($handle);
|
---|
652 | }
|
---|
653 | wp_cache_writers_exit();
|
---|
654 | return $post_id;
|
---|
655 | }
|
---|
656 |
|
---|
657 | function wp_cache_microtime_diff($a, $b) {
|
---|
658 | list($a_dec, $a_sec) = explode(' ', $a);
|
---|
659 | list($b_dec, $b_sec) = explode(' ', $b);
|
---|
660 | return $b_sec - $a_sec + $b_dec - $a_dec;
|
---|
661 | }
|
---|
662 |
|
---|
663 | function wp_cache_post_id() {
|
---|
664 | global $posts, $comment_post_ID, $post_ID;
|
---|
665 | // We try hard all options. More frequent first.
|
---|
666 | if ($post_ID > 0 ) return $post_ID;
|
---|
667 | if ($comment_post_ID > 0 ) return $comment_post_ID;
|
---|
668 | if (is_single() || is_page()) return $posts[0]->ID;
|
---|
669 | if (isset( $_GET[ 'p' ] ) && $_GET['p'] > 0) return $_GET['p'];
|
---|
670 | if (isset( $_POST[ 'p' ] ) && $_POST['p'] > 0) return $_POST['p'];
|
---|
671 | return 0;
|
---|
672 | }
|
---|
673 |
|
---|
674 | function wp_cache_gc_cron() {
|
---|
675 | global $file_prefix, $cache_max_time;
|
---|
676 |
|
---|
677 | if( !isset( $cache_max_time ) )
|
---|
678 | $cache_max_time = 600;
|
---|
679 |
|
---|
680 | $start = time();
|
---|
681 | if( !wp_cache_phase2_clean_expired($file_prefix ) ) {
|
---|
682 | wp_cache_debug( 'Cache Expiry cron job failed. Probably mutex locked.' );
|
---|
683 | update_option( 'wpsupercache_gc_time', time() - ( $cache_max_time - 10 ) ); // if GC failed then run it again in one minute
|
---|
684 | }
|
---|
685 | if( time() - $start > 30 )
|
---|
686 | wp_cache_debug( "Cache Expiry cron job took more than 30 seconds to execute.\nYou should reduce the Expiry Time in the WP Super Cache admin page\nas you probably have more cache files than your server can handle efficiently." );
|
---|
687 | }
|
---|
688 |
|
---|
689 | ?>
|
---|