From 6f3fcdcb4b0abee50f3352f0a7b1b5b3fbaa30fe Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Fri, 11 Feb 2022 18:49:03 +0000 Subject: [PATCH] Cache API: Reorder object cache functions and methods for consistency. The original order was alphabetical, which became less obvious as newer functions got added, resulting in a somewhat random order. This commits aims to organize the functions and related `WP_Object_Cache` methods in a more predictable order: * `wp_cache_init()` * `wp_cache_add()` * `wp_cache_add_multiple()` * `wp_cache_replace()` * `wp_cache_set()` * `wp_cache_set_multiple()` * `wp_cache_get()` * `wp_cache_get_multiple()` * `wp_cache_delete()` * `wp_cache_delete_multiple()` * `wp_cache_incr()` * `wp_cache_decr()` * `wp_cache_flush()` * `wp_cache_close()` * `wp_cache_add_global_groups()` * `wp_cache_add_non_persistent_groups()` * `wp_cache_switch_to_blog()` * `wp_cache_reset()` Follow-up to [3011], [6543], [7986], [13066], [18580], [21403], [47938], [52700], [52703-52705]. See #54728, #54574. Built from https://develop.svn.wordpress.org/trunk@52706 git-svn-id: http://core.svn.wordpress.org/trunk@52295 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/cache-compat.php | 109 ++++---- wp-includes/cache.php | 382 +++++++++++++------------- wp-includes/class-wp-object-cache.php | 364 ++++++++++++------------ wp-includes/version.php | 2 +- 4 files changed, 428 insertions(+), 429 deletions(-) diff --git a/wp-includes/cache-compat.php b/wp-includes/cache-compat.php index f715a5eb97..da4b9adee7 100644 --- a/wp-includes/cache-compat.php +++ b/wp-includes/cache-compat.php @@ -8,61 +8,6 @@ * @subpackage Cache */ -if ( ! function_exists( 'wp_cache_get_multiple' ) ) : - /** - * Retrieves multiple values from the cache in one call. - * - * Compat function to mimic wp_cache_get_multiple(). - * - * @ignore - * @since 5.5.0 - * - * @see wp_cache_get_multiple() - * - * @param array $keys Array of keys under which the cache contents are stored. - * @param string $group Optional. Where the cache contents are grouped. Default empty. - * @param bool $force Optional. Whether to force an update of the local cache - * from the persistent cache. Default false. - * @return array Array of values organized into groups. - */ - function wp_cache_get_multiple( $keys, $group = '', $force = false ) { - $values = array(); - - foreach ( $keys as $key ) { - $values[ $key ] = wp_cache_get( $key, $group, $force ); - } - - return $values; - } -endif; - -if ( ! function_exists( 'wp_cache_delete_multiple' ) ) : - /** - * Deletes multiple values from the cache in one call. - * - * Compat function to mimic wp_cache_delete_multiple(). - * - * @ignore - * @since 6.0.0 - * - * @see wp_cache_delete_multiple() - * - * @param array $keys Array of keys under which the cache to deleted. - * @param string $group Optional. Where the cache contents are grouped. Default empty. - * @return array Array of return values. - */ - function wp_cache_delete_multiple( array $keys, $group = '' ) { - $values = array(); - - foreach ( $keys as $key ) { - $values[ $key ] = wp_cache_delete( $key, $group ); - } - - return $values; - } -endif; - - if ( ! function_exists( 'wp_cache_add_multiple' ) ) : /** * Adds multiple values to the cache in one call, if the cache keys don't already exist. @@ -120,3 +65,57 @@ if ( ! function_exists( 'wp_cache_set_multiple' ) ) : return $values; } endif; + +if ( ! function_exists( 'wp_cache_get_multiple' ) ) : + /** + * Retrieves multiple values from the cache in one call. + * + * Compat function to mimic wp_cache_get_multiple(). + * + * @ignore + * @since 5.5.0 + * + * @see wp_cache_get_multiple() + * + * @param array $keys Array of keys under which the cache contents are stored. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param bool $force Optional. Whether to force an update of the local cache + * from the persistent cache. Default false. + * @return array Array of values organized into groups. + */ + function wp_cache_get_multiple( $keys, $group = '', $force = false ) { + $values = array(); + + foreach ( $keys as $key ) { + $values[ $key ] = wp_cache_get( $key, $group, $force ); + } + + return $values; + } +endif; + +if ( ! function_exists( 'wp_cache_delete_multiple' ) ) : + /** + * Deletes multiple values from the cache in one call. + * + * Compat function to mimic wp_cache_delete_multiple(). + * + * @ignore + * @since 6.0.0 + * + * @see wp_cache_delete_multiple() + * + * @param array $keys Array of keys under which the cache to deleted. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @return array Array of return values. + */ + function wp_cache_delete_multiple( array $keys, $group = '' ) { + $values = array(); + + foreach ( $keys as $key ) { + $values[ $key ] = wp_cache_delete( $key, $group ); + } + + return $values; + } +endif; diff --git a/wp-includes/cache.php b/wp-includes/cache.php index 06c8647ef9..67b791c584 100644 --- a/wp-includes/cache.php +++ b/wp-includes/cache.php @@ -11,6 +11,17 @@ /** WP_Object_Cache class */ require_once ABSPATH . WPINC . '/class-wp-object-cache.php'; +/** + * Sets up Object Cache Global and assigns it. + * + * @since 2.0.0 + * + * @global WP_Object_Cache $wp_object_cache + */ +function wp_cache_init() { + $GLOBALS['wp_object_cache'] = new WP_Object_Cache(); +} + /** * Adds data to the cache, if the cache key doesn't already exist. * @@ -33,137 +44,6 @@ function wp_cache_add( $key, $data, $group = '', $expire = 0 ) { return $wp_object_cache->add( $key, $data, $group, (int) $expire ); } -/** - * Closes the cache. - * - * This function has ceased to do anything since WordPress 2.5. The - * functionality was removed along with the rest of the persistent cache. - * - * This does not mean that plugins can't implement this function when they need - * to make sure that the cache is cleaned up after WordPress no longer needs it. - * - * @since 2.0.0 - * - * @return true Always returns true. - */ -function wp_cache_close() { - return true; -} - -/** - * Decrements numeric cache item's value. - * - * @since 3.3.0 - * - * @see WP_Object_Cache::decr() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param int|string $key The cache key to decrement. - * @param int $offset Optional. The amount by which to decrement the item's value. - * Default 1. - * @param string $group Optional. The group the key is in. Default empty. - * @return int|false The item's new value on success, false on failure. - */ -function wp_cache_decr( $key, $offset = 1, $group = '' ) { - global $wp_object_cache; - - return $wp_object_cache->decr( $key, $offset, $group ); -} - -/** - * Removes the cache contents matching key and group. - * - * @since 2.0.0 - * - * @see WP_Object_Cache::delete() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param int|string $key What the contents in the cache are called. - * @param string $group Optional. Where the cache contents are grouped. Default empty. - * @return bool True on successful removal, false on failure. - */ -function wp_cache_delete( $key, $group = '' ) { - global $wp_object_cache; - - return $wp_object_cache->delete( $key, $group ); -} - -/** - * Removes all cache items. - * - * @since 2.0.0 - * - * @see WP_Object_Cache::flush() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @return bool True on success, false on failure. - */ -function wp_cache_flush() { - global $wp_object_cache; - - return $wp_object_cache->flush(); -} - -/** - * Retrieves the cache contents from the cache by key and group. - * - * @since 2.0.0 - * - * @see WP_Object_Cache::get() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param int|string $key The key under which the cache contents are stored. - * @param string $group Optional. Where the cache contents are grouped. Default empty. - * @param bool $force Optional. Whether to force an update of the local cache - * from the persistent cache. Default false. - * @param bool $found Optional. Whether the key was found in the cache (passed by reference). - * Disambiguates a return of false, a storable value. Default null. - * @return mixed|false The cache contents on success, false on failure to retrieve contents. - */ -function wp_cache_get( $key, $group = '', $force = false, &$found = null ) { - global $wp_object_cache; - - return $wp_object_cache->get( $key, $group, $force, $found ); -} - -/** - * Retrieves multiple values from the cache in one call. - * - * @since 5.5.0 - * - * @see WP_Object_Cache::get_multiple() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param array $keys Array of keys under which the cache contents are stored. - * @param string $group Optional. Where the cache contents are grouped. Default empty. - * @param bool $force Optional. Whether to force an update of the local cache - * from the persistent cache. Default false. - * @return array Array of values organized into groups. - */ -function wp_cache_get_multiple( $keys, $group = '', $force = false ) { - global $wp_object_cache; - - return $wp_object_cache->get_multiple( $keys, $group, $force ); -} - -/** - * Deletes multiple values from the cache in one call. - * - * @since 6.0.0 - * - * @see WP_Object_Cache::delete_multiple() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param array $keys Array of keys under which the cache to deleted. - * @param string $group Optional. Where the cache contents are grouped. Default empty. - * @return array Array of return values. - */ -function wp_cache_delete_multiple( array $keys, $group = '' ) { - global $wp_object_cache; - - return $wp_object_cache->delete_multiple( $keys, $group ); -} - /** * Adds multiple values to the cache in one call. * @@ -184,57 +64,6 @@ function wp_cache_add_multiple( array $data, $group = '', $expire = 0 ) { return $wp_object_cache->add_multiple( $data, $group, $expire ); } -/** - * Sets multiple values to the cache in one call. - * - * @since 6.0.0 - * - * @see WP_Object_Cache::set_multiple() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param array $data Array of keys and values to be set. - * @param string $group Optional. Where the cache contents are grouped. Default empty. - * @param int $expire Optional. When to expire the cache contents, in seconds. - * Default 0 (no expiration). - * @return array Array of return values. - */ -function wp_cache_set_multiple( array $data, $group = '', $expire = 0 ) { - global $wp_object_cache; - - return $wp_object_cache->set_multiple( $data, $group, $expire ); -} - -/** - * Increments numeric cache item's value. - * - * @since 3.3.0 - * - * @see WP_Object_Cache::incr() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param int|string $key The key for the cache contents that should be incremented. - * @param int $offset Optional. The amount by which to increment the item's value. - * Default 1. - * @param string $group Optional. The group the key is in. Default empty. - * @return int|false The item's new value on success, false on failure. - */ -function wp_cache_incr( $key, $offset = 1, $group = '' ) { - global $wp_object_cache; - - return $wp_object_cache->incr( $key, $offset, $group ); -} - -/** - * Sets up Object Cache Global and assigns it. - * - * @since 2.0.0 - * - * @global WP_Object_Cache $wp_object_cache - */ -function wp_cache_init() { - $GLOBALS['wp_object_cache'] = new WP_Object_Cache(); -} - /** * Replaces the contents of the cache with new data. * @@ -282,21 +111,174 @@ function wp_cache_set( $key, $data, $group = '', $expire = 0 ) { } /** - * Switches the internal blog ID. + * Sets multiple values to the cache in one call. * - * This changes the blog id used to create keys in blog specific groups. + * @since 6.0.0 * - * @since 3.5.0 - * - * @see WP_Object_Cache::switch_to_blog() + * @see WP_Object_Cache::set_multiple() * @global WP_Object_Cache $wp_object_cache Object cache global instance. * - * @param int $blog_id Site ID. + * @param array $data Array of keys and values to be set. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return array Array of return values. */ -function wp_cache_switch_to_blog( $blog_id ) { +function wp_cache_set_multiple( array $data, $group = '', $expire = 0 ) { global $wp_object_cache; - $wp_object_cache->switch_to_blog( $blog_id ); + return $wp_object_cache->set_multiple( $data, $group, $expire ); +} + +/** + * Retrieves the cache contents from the cache by key and group. + * + * @since 2.0.0 + * + * @see WP_Object_Cache::get() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int|string $key The key under which the cache contents are stored. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param bool $force Optional. Whether to force an update of the local cache + * from the persistent cache. Default false. + * @param bool $found Optional. Whether the key was found in the cache (passed by reference). + * Disambiguates a return of false, a storable value. Default null. + * @return mixed|false The cache contents on success, false on failure to retrieve contents. + */ +function wp_cache_get( $key, $group = '', $force = false, &$found = null ) { + global $wp_object_cache; + + return $wp_object_cache->get( $key, $group, $force, $found ); +} + +/** + * Retrieves multiple values from the cache in one call. + * + * @since 5.5.0 + * + * @see WP_Object_Cache::get_multiple() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param array $keys Array of keys under which the cache contents are stored. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param bool $force Optional. Whether to force an update of the local cache + * from the persistent cache. Default false. + * @return array Array of values organized into groups. + */ +function wp_cache_get_multiple( $keys, $group = '', $force = false ) { + global $wp_object_cache; + + return $wp_object_cache->get_multiple( $keys, $group, $force ); +} + +/** + * Removes the cache contents matching key and group. + * + * @since 2.0.0 + * + * @see WP_Object_Cache::delete() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int|string $key What the contents in the cache are called. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @return bool True on successful removal, false on failure. + */ +function wp_cache_delete( $key, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->delete( $key, $group ); +} + +/** + * Deletes multiple values from the cache in one call. + * + * @since 6.0.0 + * + * @see WP_Object_Cache::delete_multiple() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param array $keys Array of keys under which the cache to deleted. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @return array Array of return values. + */ +function wp_cache_delete_multiple( array $keys, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->delete_multiple( $keys, $group ); +} + +/** + * Increments numeric cache item's value. + * + * @since 3.3.0 + * + * @see WP_Object_Cache::incr() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int|string $key The key for the cache contents that should be incremented. + * @param int $offset Optional. The amount by which to increment the item's value. + * Default 1. + * @param string $group Optional. The group the key is in. Default empty. + * @return int|false The item's new value on success, false on failure. + */ +function wp_cache_incr( $key, $offset = 1, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->incr( $key, $offset, $group ); +} + +/** + * Decrements numeric cache item's value. + * + * @since 3.3.0 + * + * @see WP_Object_Cache::decr() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int|string $key The cache key to decrement. + * @param int $offset Optional. The amount by which to decrement the item's value. + * Default 1. + * @param string $group Optional. The group the key is in. Default empty. + * @return int|false The item's new value on success, false on failure. + */ +function wp_cache_decr( $key, $offset = 1, $group = '' ) { + global $wp_object_cache; + + return $wp_object_cache->decr( $key, $offset, $group ); +} + +/** + * Removes all cache items. + * + * @since 2.0.0 + * + * @see WP_Object_Cache::flush() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @return bool True on success, false on failure. + */ +function wp_cache_flush() { + global $wp_object_cache; + + return $wp_object_cache->flush(); +} + +/** + * Closes the cache. + * + * This function has ceased to do anything since WordPress 2.5. The + * functionality was removed along with the rest of the persistent cache. + * + * This does not mean that plugins can't implement this function when they need + * to make sure that the cache is cleaned up after WordPress no longer needs it. + * + * @since 2.0.0 + * + * @return true Always returns true. + */ +function wp_cache_close() { + return true; } /** @@ -327,7 +309,25 @@ function wp_cache_add_non_persistent_groups( $groups ) { } /** - * Reset internal cache keys and structures. + * Switches the internal blog ID. + * + * This changes the blog id used to create keys in blog specific groups. + * + * @since 3.5.0 + * + * @see WP_Object_Cache::switch_to_blog() + * @global WP_Object_Cache $wp_object_cache Object cache global instance. + * + * @param int $blog_id Site ID. + */ +function wp_cache_switch_to_blog( $blog_id ) { + global $wp_object_cache; + + $wp_object_cache->switch_to_blog( $blog_id ); +} + +/** + * Resets internal cache keys and structures. * * If the cache back end uses global blog or site IDs as part of its cache keys, * this function instructs the back end to reset those keys and perform any cleanup diff --git a/wp-includes/class-wp-object-cache.php b/wp-includes/class-wp-object-cache.php index da32611974..cc7b5850c5 100644 --- a/wp-includes/class-wp-object-cache.php +++ b/wp-includes/class-wp-object-cache.php @@ -129,6 +129,19 @@ class WP_Object_Cache { unset( $this->$name ); } + /** + * Serves as a utility function to determine whether a key exists in the cache. + * + * @since 3.4.0 + * + * @param int|string $key Cache key to check for existence. + * @param string $group Cache group for the key existence check. + * @return bool Whether the key exists in the cache for the given group. + */ + protected function _exists( $key, $group ) { + return isset( $this->cache[ $group ] ) && ( isset( $this->cache[ $group ][ $key ] ) || array_key_exists( $key, $this->cache[ $group ] ) ); + } + /** * Adds data to the cache if it doesn't already exist. * @@ -167,100 +180,115 @@ class WP_Object_Cache { } /** - * Sets the list of global cache groups. + * Adds multiple values to the cache in one call. * - * @since 3.0.0 + * @since 6.0.0 * - * @param string|string[] $groups List of groups that are global. + * @param array $data Array of keys and values to be added. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return array Array of return values. */ - public function add_global_groups( $groups ) { - $groups = (array) $groups; + public function add_multiple( array $data, $group = '', $expire = 0 ) { + $values = array(); - $groups = array_fill_keys( $groups, true ); - $this->global_groups = array_merge( $this->global_groups, $groups ); + foreach ( $data as $key => $value ) { + $values[ $key ] = $this->add( $key, $value, $group, $expire ); + } + + return $values; } /** - * Decrements numeric cache item's value. + * Replaces the contents in the cache, if contents already exist. * - * @since 3.3.0 + * @since 2.0.0 * - * @param int|string $key The cache key to decrement. - * @param int $offset Optional. The amount by which to decrement the item's value. - * Default 1. - * @param string $group Optional. The group the key is in. Default 'default'. - * @return int|false The item's new value on success, false on failure. + * @see WP_Object_Cache::set() + * + * @param int|string $key What to call the contents in the cache. + * @param mixed $data The contents to store in the cache. + * @param string $group Optional. Where to group the cache contents. Default 'default'. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return bool True if contents were replaced, false if original value does not exist. */ - public function decr( $key, $offset = 1, $group = 'default' ) { + public function replace( $key, $data, $group = 'default', $expire = 0 ) { if ( empty( $group ) ) { $group = 'default'; } + $id = $key; if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { - $key = $this->blog_prefix . $key; + $id = $this->blog_prefix . $key; } - if ( ! $this->_exists( $key, $group ) ) { + if ( ! $this->_exists( $id, $group ) ) { return false; } - if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) { - $this->cache[ $group ][ $key ] = 0; - } - - $offset = (int) $offset; - - $this->cache[ $group ][ $key ] -= $offset; - - if ( $this->cache[ $group ][ $key ] < 0 ) { - $this->cache[ $group ][ $key ] = 0; - } - - return $this->cache[ $group ][ $key ]; + return $this->set( $key, $data, $group, (int) $expire ); } /** - * Removes the contents of the cache key in the group. + * Sets the data contents into the cache. * - * If the cache key does not exist in the group, then nothing will happen. - * - * @since 2.0.0 - * - * @param int|string $key What the contents in the cache are called. - * @param string $group Optional. Where the cache contents are grouped. Default 'default'. - * @param bool $deprecated Optional. Unused. Default false. - * @return bool True on success, false if the contents were not deleted. - */ - public function delete( $key, $group = 'default', $deprecated = false ) { - if ( empty( $group ) ) { - $group = 'default'; - } - - if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { - $key = $this->blog_prefix . $key; - } - - if ( ! $this->_exists( $key, $group ) ) { - return false; - } - - unset( $this->cache[ $group ][ $key ] ); - return true; - } - - /** - * Clears the object cache of all data. + * The cache contents are grouped by the $group parameter followed by the + * $key. This allows for duplicate IDs in unique groups. Therefore, naming of + * the group should be used with care and should follow normal function + * naming guidelines outside of core WordPress usage. + * + * The $expire parameter is not used, because the cache will automatically + * expire for each time a page is accessed and PHP finishes. The method is + * more for cache plugins which use files. * * @since 2.0.0 * + * @param int|string $key What to call the contents in the cache. + * @param mixed $data The contents to store in the cache. + * @param string $group Optional. Where to group the cache contents. Default 'default'. + * @param int $expire Optional. Not used. * @return true Always returns true. */ - public function flush() { - $this->cache = array(); + public function set( $key, $data, $group = 'default', $expire = 0 ) { + if ( empty( $group ) ) { + $group = 'default'; + } + if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { + $key = $this->blog_prefix . $key; + } + + if ( is_object( $data ) ) { + $data = clone $data; + } + + $this->cache[ $group ][ $key ] = $data; return true; } + /** + * Sets multiple values to the cache in one call. + * + * @since 6.0.0 + * + * @param array $data Array of key and value to be set. + * @param string $group Optional. Where the cache contents are grouped. Default empty. + * @param int $expire Optional. When to expire the cache contents, in seconds. + * Default 0 (no expiration). + * @return array Array of return values. + */ + public function set_multiple( array $data, $group = '', $expire = 0 ) { + $values = array(); + + foreach ( $data as $key => $value ) { + $values[ $key ] = $this->set( $key, $value, $group, $expire ); + } + + return $values; + } + /** * Retrieves the cache contents, if it exists. * @@ -325,6 +353,35 @@ class WP_Object_Cache { return $values; } + /** + * Removes the contents of the cache key in the group. + * + * If the cache key does not exist in the group, then nothing will happen. + * + * @since 2.0.0 + * + * @param int|string $key What the contents in the cache are called. + * @param string $group Optional. Where the cache contents are grouped. Default 'default'. + * @param bool $deprecated Optional. Unused. Default false. + * @return bool True on success, false if the contents were not deleted. + */ + public function delete( $key, $group = 'default', $deprecated = false ) { + if ( empty( $group ) ) { + $group = 'default'; + } + + if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { + $key = $this->blog_prefix . $key; + } + + if ( ! $this->_exists( $key, $group ) ) { + return false; + } + + unset( $this->cache[ $group ][ $key ] ); + return true; + } + /** * Deletes multiple values from the cache in one call. * @@ -344,48 +401,6 @@ class WP_Object_Cache { return $values; } - /** - * Adds multiple values to the cache in one call. - * - * @since 6.0.0 - * - * @param array $data Array of keys and values to be added. - * @param string $group Optional. Where the cache contents are grouped. Default empty. - * @param int $expire Optional. When to expire the cache contents, in seconds. - * Default 0 (no expiration). - * @return array Array of return values. - */ - public function add_multiple( array $data, $group = '', $expire = 0 ) { - $values = array(); - - foreach ( $data as $key => $value ) { - $values[ $key ] = $this->add( $key, $value, $group, $expire ); - } - - return $values; - } - - /** - * Sets multiple values to the cache in one call. - * - * @since 6.0.0 - * - * @param array $data Array of key and value to be set. - * @param string $group Optional. Where the cache contents are grouped. Default empty. - * @param int $expire Optional. When to expire the cache contents, in seconds. - * Default 0 (no expiration). - * @return array Array of return values. - */ - public function set_multiple( array $data, $group = '', $expire = 0 ) { - $values = array(); - - foreach ( $data as $key => $value ) { - $values[ $key ] = $this->set( $key, $value, $group, $expire ); - } - - return $values; - } - /** * Increments numeric cache item's value. * @@ -426,34 +441,83 @@ class WP_Object_Cache { } /** - * Replaces the contents in the cache, if contents already exist. + * Decrements numeric cache item's value. * - * @since 2.0.0 + * @since 3.3.0 * - * @see WP_Object_Cache::set() - * - * @param int|string $key What to call the contents in the cache. - * @param mixed $data The contents to store in the cache. - * @param string $group Optional. Where to group the cache contents. Default 'default'. - * @param int $expire Optional. When to expire the cache contents, in seconds. - * Default 0 (no expiration). - * @return bool True if contents were replaced, false if original value does not exist. + * @param int|string $key The cache key to decrement. + * @param int $offset Optional. The amount by which to decrement the item's value. + * Default 1. + * @param string $group Optional. The group the key is in. Default 'default'. + * @return int|false The item's new value on success, false on failure. */ - public function replace( $key, $data, $group = 'default', $expire = 0 ) { + public function decr( $key, $offset = 1, $group = 'default' ) { if ( empty( $group ) ) { $group = 'default'; } - $id = $key; if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { - $id = $this->blog_prefix . $key; + $key = $this->blog_prefix . $key; } - if ( ! $this->_exists( $id, $group ) ) { + if ( ! $this->_exists( $key, $group ) ) { return false; } - return $this->set( $key, $data, $group, (int) $expire ); + if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) { + $this->cache[ $group ][ $key ] = 0; + } + + $offset = (int) $offset; + + $this->cache[ $group ][ $key ] -= $offset; + + if ( $this->cache[ $group ][ $key ] < 0 ) { + $this->cache[ $group ][ $key ] = 0; + } + + return $this->cache[ $group ][ $key ]; + } + + /** + * Clears the object cache of all data. + * + * @since 2.0.0 + * + * @return true Always returns true. + */ + public function flush() { + $this->cache = array(); + + return true; + } + + /** + * Sets the list of global cache groups. + * + * @since 3.0.0 + * + * @param string|string[] $groups List of groups that are global. + */ + public function add_global_groups( $groups ) { + $groups = (array) $groups; + + $groups = array_fill_keys( $groups, true ); + $this->global_groups = array_merge( $this->global_groups, $groups ); + } + + /** + * Switches the internal blog ID. + * + * This changes the blog ID used to create keys in blog specific groups. + * + * @since 3.5.0 + * + * @param int $blog_id Blog ID. + */ + public function switch_to_blog( $blog_id ) { + $blog_id = (int) $blog_id; + $this->blog_prefix = $this->multisite ? $blog_id . ':' : ''; } /** @@ -475,43 +539,6 @@ class WP_Object_Cache { } } - /** - * Sets the data contents into the cache. - * - * The cache contents are grouped by the $group parameter followed by the - * $key. This allows for duplicate IDs in unique groups. Therefore, naming of - * the group should be used with care and should follow normal function - * naming guidelines outside of core WordPress usage. - * - * The $expire parameter is not used, because the cache will automatically - * expire for each time a page is accessed and PHP finishes. The method is - * more for cache plugins which use files. - * - * @since 2.0.0 - * - * @param int|string $key What to call the contents in the cache. - * @param mixed $data The contents to store in the cache. - * @param string $group Optional. Where to group the cache contents. Default 'default'. - * @param int $expire Optional. Not used. - * @return true Always returns true. - */ - public function set( $key, $data, $group = 'default', $expire = 0 ) { - if ( empty( $group ) ) { - $group = 'default'; - } - - if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) { - $key = $this->blog_prefix . $key; - } - - if ( is_object( $data ) ) { - $data = clone $data; - } - - $this->cache[ $group ][ $key ] = $data; - return true; - } - /** * Echoes the stats of the caching. * @@ -531,31 +558,4 @@ class WP_Object_Cache { } echo ''; } - - /** - * Switches the internal blog ID. - * - * This changes the blog ID used to create keys in blog specific groups. - * - * @since 3.5.0 - * - * @param int $blog_id Blog ID. - */ - public function switch_to_blog( $blog_id ) { - $blog_id = (int) $blog_id; - $this->blog_prefix = $this->multisite ? $blog_id . ':' : ''; - } - - /** - * Serves as a utility function to determine whether a key exists in the cache. - * - * @since 3.4.0 - * - * @param int|string $key Cache key to check for existence. - * @param string $group Cache group for the key existence check. - * @return bool Whether the key exists in the cache for the given group. - */ - protected function _exists( $key, $group ) { - return isset( $this->cache[ $group ] ) && ( isset( $this->cache[ $group ][ $key ] ) || array_key_exists( $key, $this->cache[ $group ] ) ); - } } diff --git a/wp-includes/version.php b/wp-includes/version.php index 57d2a6f61c..efc0924872 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.0-alpha-52705'; +$wp_version = '6.0-alpha-52706'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.