WordPress.org

Make WordPress Core

Ticket #31245: 31245-1.diff

File 31245-1.diff, 7.1 KB (added by tollmanz, 4 years ago)

Refresh of rmccue's patch

  • wp-admin/includes/update-core.php

     
    10851085        // Clear the cache to prevent an update_option() from saving a stale db_version to the cache
    10861086        wp_cache_flush();
    10871087        // (Not all cache backends listen to 'flush')
    1088         wp_cache_delete( 'alloptions', 'options' );
     1088        wp_cache_delete( 'alloptionskeys', 'options' );
    10891089
    10901090        // Remove working directory
    10911091        $wp_filesystem->delete($from, true);
  • wp-includes/cache.php

     
    124124}
    125125
    126126/**
     127 * Retrieve multiple cache items.
     128 *
     129 * @param array $groups Associative array of cache groups to cache keys to fetch.
     130 * @param string $force Whether to force a refetch rather than relying on the local cache (default is false).
     131 * @return false|array False on failure or cache contents on success as an two-level associative array, keyed by group and cache key.
     132 */
     133function wp_cache_get_multi( $groups, $force = false ) {
     134        global $wp_object_cache;
     135
     136        return $wp_object_cache->get_multi( $groups, $force );
     137}
     138
     139/**
    127140 * Increment numeric cache item's value
    128141 *
    129142 * @since 3.3.0
     
    444457        }
    445458
    446459        /**
     460         * Retrieve multiple cache items.
     461         *
     462         * @param array $groups Associative array of cache groups to cache keys to fetch.
     463         * @param string $force Whether to force a refetch rather than relying on the local cache (default is false).
     464         * @return false|array False on failure or cache contents on success as an two-level associative array, keyed by group and cache key.
     465         */
     466        public function get_multi( $groups, $force = false ) {
     467                $data = array();
     468
     469                foreach ( $groups as $group => $keys ) {
     470                        $data[ $group ] = array();
     471
     472                        foreach ( $keys as $key ) {
     473                                $value = $this->get( $key, $group, $force, $found );
     474                                if ( ! $found ) {
     475                                        continue;
     476                                }
     477
     478                                $data[ $group ][ $key ] = $value;
     479                        }
     480                }
     481
     482                return $data;
     483        }
     484
     485        /**
    447486         * Decrements numeric cache item's value.
    448487         *
    449488         * @since 3.3.0
  • wp-includes/load.php

     
    479479}
    480480
    481481/**
     482 * Retrieve multiple cache items.
     483 *
     484 * Note: This should be used only as a fallback if `wp_cache_get_multi` is not
     485 * defined for the current object cache.
     486 *
     487 * @param array $groups Associative array of cache groups to cache keys to fetch.
     488 * @param string $force Whether to force a refetch rather than relying on the local cache (default is false).
     489 * @return false|array False on failure or cache contents on success as an two-level associative array, keyed by group and cache key.
     490 */
     491function _wp_cache_compat_get_multi( $groups, $force = false ) {
     492        $data = array();
     493
     494        foreach ( $groups as $group => $keys ) {
     495                $data[ $group ] = array();
     496
     497                foreach ( $keys as $key ) {
     498                        $value = wp_cache_get( $key, $group, $force );
     499                        if ( ! $value ) {
     500                                continue;
     501                        }
     502
     503                        $data[ $group ][ $key ] = $value;
     504                }
     505        }
     506
     507        return $data;
     508}
     509
     510/**
    482511 * Redirect to the installer if WordPress is not installed.
    483512 *
    484513 * Dies with an error message when Multisite is enabled.
  • wp-includes/option.php

     
    144144 * @param string $option Option name.
    145145 */
    146146function wp_protect_special_option( $option ) {
    147         if ( 'alloptions' === $option || 'notoptions' === $option )
     147        if ( 'alloptions' === $option || 'alloptionskeys' === $option || 'notoptions' === $option )
    148148                wp_die( sprintf( __( '%s is a protected WP option and may not be modified' ), esc_html( $option ) ) );
    149149}
    150150
     
    171171function wp_load_alloptions() {
    172172        global $wpdb;
    173173
    174         if ( ! wp_installing() || ! is_multisite() )
    175                 $alloptions = wp_cache_get( 'alloptions', 'options' );
    176         else
    177                 $alloptions = false;
     174        $alloptions = false;
    178175
     176        if ( !defined( 'WP_INSTALLING' ) || !is_multisite() ) {
     177                $keys = wp_cache_get( 'alloptionskeys', 'options' );
     178                if ( is_array( $keys ) ) {
     179                        if ( function_exists( 'wp_cache_get_multi' ) ) {
     180                                $cached_options = wp_cache_get_multi( array( 'options' => array_keys( $keys ) ) );
     181                        } else {
     182                                $cached_options = _wp_cache_compat_get_multi( array( 'options' => array_keys( $keys ) ) );
     183                        }
     184                        $alloptions = $cached_options['options'];
     185                }
     186        }
     187
    179188        if ( !$alloptions ) {
    180189                $suppress = $wpdb->suppress_errors();
    181190                if ( !$alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'" ) )
     
    182191                        $alloptions_db = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options" );
    183192                $wpdb->suppress_errors($suppress);
    184193                $alloptions = array();
     194                $keys = array();
    185195                foreach ( (array) $alloptions_db as $o ) {
    186196                        $alloptions[$o->option_name] = $o->option_value;
     197                        $keys[ $o->option_name ] = true;
    187198                }
    188                 if ( ! wp_installing() || ! is_multisite() )
    189                         wp_cache_add( 'alloptions', $alloptions, 'options' );
     199
     200                if ( !defined( 'WP_INSTALLING' ) || !is_multisite() ) {
     201                        wp_cache_add( 'alloptionskeys', $keys, 'options' );
     202
     203                        foreach ( $alloptions as $key => $value ) {
     204                                wp_cache_set( $key, $value, 'options' );
     205                        }
     206                }
    190207        }
    191208
    192209        return $alloptions;
     
    333350        }
    334351
    335352        if ( ! wp_installing() ) {
    336                 $alloptions = wp_load_alloptions();
    337                 if ( isset( $alloptions[$option] ) ) {
    338                         $alloptions[ $option ] = $serialized_value;
    339                         wp_cache_set( 'alloptions', $alloptions, 'options' );
    340                 } else {
    341                         wp_cache_set( $option, $serialized_value, 'options' );
    342                 }
     353                wp_cache_set( $option, $serialized_value, 'options' );
    343354        }
    344355
    345356        /**
     
    435446
    436447        if ( ! wp_installing() ) {
    437448                if ( 'yes' == $autoload ) {
    438                         $alloptions = wp_load_alloptions();
    439                         $alloptions[ $option ] = $serialized_value;
    440                         wp_cache_set( 'alloptions', $alloptions, 'options' );
    441                 } else {
    442                         wp_cache_set( $option, $serialized_value, 'options' );
     449                        $alloptionskeys = wp_cache_get( 'alloptionskeys', 'options' );
     450                        $alloptionskeys[ $option ] = true;
     451                        wp_cache_set( 'alloptionskeys', $alloptionskeys, 'options' );
    443452                }
     453
     454                wp_cache_set( $option, $serialized_value, 'options' );
    444455        }
    445456
    446457        // This option exists now
     
    511522        $result = $wpdb->delete( $wpdb->options, array( 'option_name' => $option ) );
    512523        if ( ! wp_installing() ) {
    513524                if ( 'yes' == $row->autoload ) {
    514                         $alloptions = wp_load_alloptions();
    515                         if ( is_array( $alloptions ) && isset( $alloptions[$option] ) ) {
    516                                 unset( $alloptions[$option] );
    517                                 wp_cache_set( 'alloptions', $alloptions, 'options' );
     525                        $alloptionskeys = wp_cache_get( 'alloptionskeys', 'options' );
     526                        if ( is_array( $alloptionskeys ) && isset( $alloptionskeys[$option] ) ) {
     527                                unset( $alloptionskeys[$option] );
     528                                wp_cache_set( 'alloptionskeys', $alloptionskeys, 'options' );
    518529                        }
    519                 } else {
    520                         wp_cache_delete( $option, 'options' );
    521530                }
     531
     532                wp_cache_delete( $option, 'options' );
    522533        }
    523534        if ( $result ) {
    524535