WordPress.org

Make WordPress Core

Changeset 21403


Ignore:
Timestamp:
08/02/12 18:31:14 (3 years ago)
Author:
ryan
Message:

Introduce wp_cache_switch_to_blog() and WP_Object_Cache::switch_to_blog() as a lighter/faster way to switch the cache to a new blog id.

Add the blog id to the cache keys for multisite installs.

Use wp_cache_switch_to_blog() instead of wp_cache_init() in switch_to_blog().

Use wp_cache_switch_to_blog() instead of wp_cache_reset() in wp_start_object_cache().

Deprecate wp_cache_reset().

This avoids the many queries needed to re-prime the cache after switch_to_blog() on multisite installs using the default cache backend.

fixes #21434

Location:
trunk/wp-includes
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/cache.php

    r21294 r21403  
    181181 
    182182/** 
     183 * Switch the interal blog id. 
     184 * 
     185 * This changes the blog id used to create keys in blog specific groups. 
     186 * 
     187 * @param int $blog_id Blog ID 
     188 */ 
     189function wp_cache_switch_to_blog( $blog_id ) { 
     190    global $wp_object_cache; 
     191 
     192    return $wp_object_cache->switch_to_blog( $blog_id ); 
     193} 
     194 
     195/** 
    183196 * Adds a group or set of groups to the list of global groups. 
    184197 * 
     
    190203    global $wp_object_cache; 
    191204 
    192     return $wp_object_cache->add_global_groups($groups); 
     205    return $wp_object_cache->add_global_groups( $groups ); 
    193206} 
    194207 
     
    210223 * 
    211224 * @since 2.6.0 
     225 * @deprecated 3.5.0 
    212226 */ 
    213227function wp_cache_reset() { 
     228    _deprecated_function( __FUNCTION__, '3.5', 'wp_cache_switch_to_blog()' ); 
     229 
    214230    global $wp_object_cache; 
    215231 
     
    270286     */ 
    271287    var $global_groups = array(); 
     288 
     289    /** 
     290     * The blog prefix to prepend to keys in non-global groups. 
     291     * 
     292     * @var int 
     293     * @access private 
     294     * @since 3.5.0 
     295     */ 
     296    var $blog_prefix; 
    272297 
    273298    /** 
     
    293318            $group = 'default'; 
    294319 
    295         if ( $this->_exists($key, $group) ) 
     320        $id = $key; 
     321        if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) 
     322            $id = $this->blog_prefix . $key; 
     323 
     324        if ( $this->_exists( $id, $group ) ) 
    296325            return false; 
    297326 
     
    309338        $groups = (array) $groups; 
    310339 
    311         $this->global_groups = array_merge($this->global_groups, $groups); 
    312         $this->global_groups = array_unique($this->global_groups); 
     340        $groups = array_fill_keys( $groups, true ); 
     341        $this->global_groups = array_merge( $this->global_groups, $groups ); 
    313342    } 
    314343 
     
    326355        if ( empty( $group ) ) 
    327356            $group = 'default'; 
    328          
     357 
     358        if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) 
     359            $key = $this->blog_prefix . $key; 
     360 
    329361        if ( ! $this->_exists( $key, $group ) ) 
    330362            return false; 
     
    362394            $group = 'default'; 
    363395 
     396        if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) 
     397            $key = $this->blog_prefix . $key; 
     398 
    364399        if ( ! $force && ! $this->_exists( $key, $group ) ) 
    365400            return false; 
     
    402437        if ( empty( $group ) ) 
    403438            $group = 'default'; 
     439 
     440        if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) 
     441            $key = $this->blog_prefix . $key; 
    404442 
    405443        if ( $this->_exists( $key, $group ) ) { 
     
    431469            $group = 'default'; 
    432470 
     471        if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) 
     472            $key = $this->blog_prefix . $key; 
     473 
    433474        if ( ! $this->_exists( $key, $group ) ) 
    434475            return false; 
     
    459500     * @return bool False if not exists, true if contents were replaced 
    460501     */ 
    461     function replace($key, $data, $group = 'default', $expire = '') { 
     502    function replace( $key, $data, $group = 'default', $expire = '' ) { 
    462503        if ( empty( $group ) ) 
    463504            $group = 'default'; 
    464505 
    465         if ( ! $this->_exists( $key, $group ) ) 
     506        $id = $key; 
     507        if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) 
     508            $id = $this->blog_prefix . $key; 
     509 
     510        if ( ! $this->_exists( $id, $group ) ) 
    466511            return false; 
    467512 
    468         return $this->set($key, $data, $group, $expire); 
     513        return $this->set( $key, $data, $group, $expire ); 
    469514    } 
    470515 
     
    473518     * 
    474519     * @since 3.0.0 
     520     * @deprecated 3.5.0 
    475521     */ 
    476522    function reset() { 
     523        _deprecated_function( __FUNCTION__, '3.5', 'switch_to_blog()' ); 
     524 
    477525        // Clear out non-global caches since the blog ID has changed. 
    478         foreach ( array_keys($this->cache) as $group ) { 
    479             if ( !in_array($group, $this->global_groups) ) 
    480                 unset($this->cache[$group]); 
     526        foreach ( array_keys( $this->cache ) as $group ) { 
     527            if ( ! isset( $this->global_groups[ $group ] ) ) 
     528                unset( $this->cache[ $group ] ); 
    481529        } 
    482530    } 
     
    506554            $group = 'default'; 
    507555 
    508         if ( is_object($data) ) 
     556        if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) 
     557            $key = $this->blog_prefix . $key; 
     558 
     559        if ( is_object( $data ) ) 
    509560            $data = clone $data; 
    510561 
     
    534585 
    535586    /** 
     587     * Switch the interal blog id. 
     588     * 
     589     * This changes the blog id used to create keys in blog specific groups. 
     590     * 
     591     * @param int $blog_id Blog ID 
     592     */ 
     593    function switch_to_blog( $blog_id ) { 
     594        $blog_id = (int) $blog_id; 
     595        $this->blog_prefix = $this->multisite ? $blog_id . ':' : ''; 
     596    } 
     597 
     598    /** 
    536599     * Utility function to determine whether a key exists in the cache. 
    537600     * 
     
    551614     */ 
    552615    function __construct() { 
     616        global $blog_id; 
     617 
     618        $this->multisite = is_multisite(); 
     619        $this->blog_prefix =  $this->multisite ? $blog_id . ':' : ''; 
     620         
     621 
    553622        /** 
    554623         * @todo This should be moved to the PHP4 style constructor, PHP5 
    555624         * already calls __destruct() 
    556625         */ 
    557         register_shutdown_function(array(&$this, "__destruct")); 
     626        register_shutdown_function( array( &$this, '__destruct' ) ); 
    558627    } 
    559628 
  • trunk/wp-includes/load.php

    r21363 r21403  
    382382 */ 
    383383function wp_start_object_cache() { 
    384     global $_wp_using_ext_object_cache; 
     384    global $_wp_using_ext_object_cache, $blog_id; 
    385385 
    386386    $first_init = false; 
     
    404404    // Reset signals to the cache that global IDs have changed and it may need to update keys 
    405405    // and cleanup caches. 
    406     if ( !$first_init && function_exists('wp_cache_reset') ) 
    407         wp_cache_reset(); 
     406    if ( ! $first_init && function_exists( 'wp_cache_switch_to_blog' ) ) 
     407        wp_cache_switch_to_blog( $blog_id ); 
    408408    else 
    409409        wp_cache_init(); 
  • trunk/wp-includes/ms-blogs.php

    r21378 r21403  
    488488    } 
    489489 
    490     if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) 
    491         $global_groups = $wp_object_cache->global_groups; 
    492     else 
    493         $global_groups = false; 
    494  
    495     wp_cache_init(); 
    496     if ( function_exists('wp_cache_add_global_groups') ) { 
    497         if ( is_array( $global_groups ) ) 
    498             wp_cache_add_global_groups( $global_groups ); 
     490    if ( function_exists( 'wp_cache_switch_to_blog' ) ) { 
     491        wp_cache_switch_to_blog( $blog_id ); 
     492    } else { 
     493        if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) 
     494            $global_groups = $wp_object_cache->global_groups; 
    499495        else 
    500             wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) ); 
    501         wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' )); 
     496            $global_groups = false; 
     497     
     498        wp_cache_init(); 
     499        if ( function_exists('wp_cache_add_global_groups') ) { 
     500            if ( is_array( $global_groups ) ) 
     501                wp_cache_add_global_groups( $global_groups ); 
     502            else 
     503                wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) ); 
     504            wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' )); 
     505        } 
    502506    } 
    503507 
     
    552556    } 
    553557 
    554     if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) 
    555         $global_groups = $wp_object_cache->global_groups; 
    556     else 
    557         $global_groups = false; 
    558  
    559     wp_cache_init(); 
    560     if ( function_exists('wp_cache_add_global_groups') ) { 
    561         if ( is_array( $global_groups ) ) 
    562             wp_cache_add_global_groups( $global_groups ); 
     558    if ( function_exists( 'wp_cache_switch_to_blog' ) ) { 
     559        wp_cache_switch_to_blog( $blog_id ); 
     560    } else { 
     561        if ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) ) 
     562            $global_groups = $wp_object_cache->global_groups; 
    563563        else 
    564             wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) ); 
    565         wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' )); 
     564            $global_groups = false; 
     565     
     566        wp_cache_init(); 
     567        if ( function_exists('wp_cache_add_global_groups') ) { 
     568            if ( is_array( $global_groups ) ) 
     569                wp_cache_add_global_groups( $global_groups ); 
     570            else 
     571                wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts' ) ); 
     572            wp_cache_add_non_persistent_groups(array( 'comment', 'counts', 'plugins' )); 
     573        } 
    566574    } 
    567575 
Note: See TracChangeset for help on using the changeset viewer.