]> scripts.mit.edu Git - autoinstalls/wordpress.git/blobdiff - wp-includes/cache.php
Wordpress 2.3.3
[autoinstalls/wordpress.git] / wp-includes / cache.php
index 4dd396d7e96aac94d45b33bdd458f50afb6cbf84..ce7184d92996bc3ddd767646978a15de43cb77c1 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 function wp_cache_add($key, $data, $flag = '', $expire = 0) {
        global $wp_object_cache;
+       $data = unserialize(serialize($data));
 
        return $wp_object_cache->add($key, $data, $flag, $expire);
 }
@@ -8,6 +9,8 @@ function wp_cache_add($key, $data, $flag = '', $expire = 0) {
 function wp_cache_close() {
        global $wp_object_cache;
 
+       if ( ! isset($wp_object_cache) )
+               return;
        return $wp_object_cache->save();
 }
 
@@ -30,25 +33,25 @@ function wp_cache_get($id, $flag = '') {
 }
 
 function wp_cache_init() {
-       global $wp_object_cache;
-
-       $wp_object_cache = new WP_Object_Cache();
+       $GLOBALS['wp_object_cache'] =& new WP_Object_Cache();
 }
 
 function wp_cache_replace($key, $data, $flag = '', $expire = 0) {
        global $wp_object_cache;
+       $data = unserialize(serialize($data));
 
        return $wp_object_cache->replace($key, $data, $flag, $expire);
 }
 
 function wp_cache_set($key, $data, $flag = '', $expire = 0) {
        global $wp_object_cache;
+       $data = unserialize(serialize($data));
 
        return $wp_object_cache->set($key, $data, $flag, $expire);
 }
 
-define('CACHE_SERIAL_HEADER', "<?php\n//");
-define('CACHE_SERIAL_FOOTER', "\n?".">");
+define('CACHE_SERIAL_HEADER', "<?php\n/*");
+define('CACHE_SERIAL_FOOTER', "*/\n?".">");
 
 class WP_Object_Cache {
        var $cache_dir;
@@ -60,13 +63,15 @@ class WP_Object_Cache {
        var $dirty_objects = array ();
        var $non_existant_objects = array ();
        var $global_groups = array ('users', 'userlogins', 'usermeta');
+       var $non_persistent_groups = array('comment');
        var $blog_id;
        var $cold_cache_hits = 0;
        var $warm_cache_hits = 0;
        var $cache_misses = 0;
+       var $secret = '';
 
        function acquire_lock() {
-               // Acquire a write lock. 
+               // Acquire a write lock.
                $this->mutex = @fopen($this->cache_dir.$this->flock_filename, 'w');
                if ( false == $this->mutex)
                        return false;
@@ -103,12 +108,12 @@ class WP_Object_Cache {
 
                if ( ! $this->acquire_lock() )
                        return false;
-               
+
                $this->rm_cache_dir();
                $this->cache = array ();
                $this->dirty_objects = array ();
                $this->non_existant_objects = array ();
-               
+
                $this->release_lock();
 
                return true;
@@ -142,7 +147,7 @@ class WP_Object_Cache {
                        return false;
                }
 
-               $cache_file = $this->cache_dir.$this->get_group_dir($group)."/".md5($id.DB_PASSWORD).'.php';
+               $cache_file = $this->cache_dir.$this->get_group_dir($group)."/".$this->hash($id).'.php';
                if (!file_exists($cache_file)) {
                        $this->non_existant_objects[$group][$id] = true;
                        $this->cache_misses += 1;
@@ -158,7 +163,7 @@ class WP_Object_Cache {
                        return false;
                }
 
-               $this->cache[$group][$id] = unserialize(substr(@ file_get_contents($cache_file), strlen(CACHE_SERIAL_HEADER), -strlen(CACHE_SERIAL_FOOTER)));
+               $this->cache[$group][$id] = unserialize(base64_decode(substr(@ file_get_contents($cache_file), strlen(CACHE_SERIAL_HEADER), -strlen(CACHE_SERIAL_FOOTER))));
                if (false === $this->cache[$group][$id])
                        $this->cache[$group][$id] = '';
 
@@ -173,40 +178,16 @@ class WP_Object_Cache {
                return "{$this->blog_id}/$group";
        }
 
-       function load_group_from_db($group) {
-               global $wpdb;
-
-               if ('category' == $group) {
-                       $this->cache['category'] = array ();
-                       if ($dogs = $wpdb->get_results("SELECT * FROM $wpdb->categories")) {
-                               foreach ($dogs as $catt)
-                                       $this->cache['category'][$catt->cat_ID] = $catt;
-
-                               foreach ($this->cache['category'] as $catt) {
-                                       $curcat = $catt->cat_ID;
-                                       $fullpath = '/'.$this->cache['category'][$catt->cat_ID]->category_nicename;
-                                       while ($this->cache['category'][$curcat]->category_parent != 0) {
-                                               $curcat = $this->cache['category'][$curcat]->category_parent;
-                                               $fullpath = '/'.$this->cache['category'][$curcat]->category_nicename.$fullpath;
-                                       }
-                                       $this->cache['category'][$catt->cat_ID]->fullpath = $fullpath;
-                               }
-                       }
-               } else
-                       if ('options' == $group) {
-                               $wpdb->hide_errors();
-                               if (!$options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'")) {
-                                       $options = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options");
-                               }
-                               $wpdb->show_errors();
-
-                               if ( ! $options )
-                                       return;
+       function hash($data) {
+               if ( function_exists('hash_hmac') ) {
+                       return hash_hmac('md5', $data, $this->secret);
+               } else {
+                       return md5($data . $this->secret);
+               }
+       }
 
-                               foreach ($options as $option) {
-                                       $this->cache['options'][$option->option_name] = $option->option_value;
-                               }
-                       }
+       function load_group_from_db($group) {
+               return;
        }
 
        function make_group_dir($group, $perms) {
@@ -240,15 +221,15 @@ class WP_Object_Cache {
                while ($index < count($stack)) {
                        # Get indexed directory from stack
                        $dir = $stack[$index];
-      
+
                        $dh = @ opendir($dir);
                        if (!$dh)
                                return false;
-      
+
                        while (($file = @ readdir($dh)) !== false) {
                                if ($file == '.' or $file == '..')
                                        continue;
-                                       
+
                                if (@ is_dir($dir . DIRECTORY_SEPARATOR . $file))
                                        $stack[] = $dir . DIRECTORY_SEPARATOR . $file;
                                else if (@ is_file($dir . DIRECTORY_SEPARATOR . $file))
@@ -328,11 +309,14 @@ class WP_Object_Cache {
                // Loop over dirty objects and save them.
                $errors = 0;
                foreach ($this->dirty_objects as $group => $ids) {
+                       if ( in_array($group, $this->non_persistent_groups) )
+                               continue;
+
                        $group_dir = $this->make_group_dir($group, $dir_perms);
 
                        $ids = array_unique($ids);
                        foreach ($ids as $id) {
-                               $cache_file = $group_dir.md5($id.DB_PASSWORD).'.php';
+                               $cache_file = $group_dir.$this->hash($id).'.php';
 
                                // Remove the cache file if the key is not set.
                                if (!isset ($this->cache[$group][$id])) {
@@ -342,7 +326,7 @@ class WP_Object_Cache {
                                }
 
                                $temp_file = tempnam($group_dir, 'tmp');
-                               $serial = CACHE_SERIAL_HEADER.serialize($this->cache[$group][$id]).CACHE_SERIAL_FOOTER;
+                               $serial = CACHE_SERIAL_HEADER.base64_encode(serialize($this->cache[$group][$id])).CACHE_SERIAL_FOOTER;
                                $fd = @fopen($temp_file, 'w');
                                if ( false === $fd ) {
                                        $errors++;
@@ -351,10 +335,9 @@ class WP_Object_Cache {
                                fputs($fd, $serial);
                                fclose($fd);
                                if (!@ rename($temp_file, $cache_file)) {
-                                       if (@ copy($temp_file, $cache_file))
-                                               @ unlink($temp_file);
-                                       else
-                                               $errors++;      
+                                       if (!@ copy($temp_file, $cache_file))
+                                               $errors++;
+                                       @ unlink($temp_file);
                                }
                                @ chmod($cache_file, $file_perms);
                        }
@@ -363,7 +346,7 @@ class WP_Object_Cache {
                $this->dirty_objects = array();
 
                $this->release_lock();
-               
+
                if ( $errors )
                        return false;
 
@@ -372,14 +355,14 @@ class WP_Object_Cache {
 
        function stats() {
                echo "<p>";
-               echo "<strong>Cold Cache Hits:</strong> {$this->cold_cache_hits}<br/>";
-               echo "<strong>Warm Cache Hits:</strong> {$this->warm_cache_hits}<br/>";
-               echo "<strong>Cache Misses:</strong> {$this->cache_misses}<br/>";
+               echo "<strong>Cold Cache Hits:</strong> {$this->cold_cache_hits}<br />";
+               echo "<strong>Warm Cache Hits:</strong> {$this->warm_cache_hits}<br />";
+               echo "<strong>Cache Misses:</strong> {$this->cache_misses}<br />";
                echo "</p>";
 
                foreach ($this->cache as $group => $cache) {
                        echo "<p>";
-                       echo "<strong>Group:</strong> $group<br/>";
+                       echo "<strong>Group:</strong> $group<br />";
                        echo "<strong>Cache:</strong>";
                        echo "<pre>";
                        print_r($cache);
@@ -395,11 +378,20 @@ class WP_Object_Cache {
        }
 
        function WP_Object_Cache() {
+               return $this->__construct();
+       }
+
+       function __construct() {
                global $blog_id;
 
+               register_shutdown_function(array(&$this, "__destruct"));
+
                if (defined('DISABLE_CACHE'))
                        return;
 
+               if ( ! defined('ENABLE_CACHE') )
+                       return;
+
                // Disable the persistent cache if safe_mode is on.
                if ( ini_get('safe_mode') && ! defined('ENABLE_CACHE') )
                        return;
@@ -421,7 +413,17 @@ class WP_Object_Cache {
                if (defined('CACHE_EXPIRATION_TIME'))
                        $this->expiration_time = CACHE_EXPIRATION_TIME;
 
-               $this->blog_id = md5($blog_id);
+               if ( defined('WP_SECRET') )
+                       $this->secret = WP_SECRET;
+               else
+                       $this->secret = DB_PASSWORD . DB_USER . DB_NAME . DB_HOST . ABSPATH;
+
+               $this->blog_id = $this->hash($blog_id);
+       }
+
+       function __destruct() {
+               $this->save();
+               return true;
        }
 }
 ?>