2005-11-07 22:56:03 +01:00
< ? php
2008-01-03 05:35:47 +01:00
/**
* Object Cache API
*
* @ package WordPress
* @ subpackage Cache
*/
/**
* wp_cache_add () - Adds data to the cache , if the cache key doesn ' t aleady exist
*
* @ since 2.0
* @ uses $wp_object_cache Object Cache Class
* @ see WP_Object_Cache :: add ()
*
* @ param int | string $key The cache ID to use for retrieval later
* @ param mixed $data The data to add to the cache store
* @ param string $flag The group to add the cache to
* @ param int $expire When the cache data should be expired
* @ return unknown
*/
2005-11-07 22:56:03 +01:00
function wp_cache_add ( $key , $data , $flag = '' , $expire = 0 ) {
global $wp_object_cache ;
return $wp_object_cache -> add ( $key , $data , $flag , $expire );
}
2008-01-03 05:35:47 +01:00
/**
* wp_cache_close () - Closes the cache
*
* This function has ceased to do anything since WordPress 2.5 .
* The functionality was removed along with the rest of the
* persistant cache .
*
* @ since 2.0
*
* @ return bool Always returns True
*/
2005-11-07 22:56:03 +01:00
function wp_cache_close () {
2008-01-03 00:03:25 +01:00
return true ;
2005-11-07 22:56:03 +01:00
}
2008-01-03 05:35:47 +01:00
/**
* wp_cache_delete () - Removes the cache contents matching ID and flag
*
* @ since 2.0
* @ uses $wp_object_cache Object Cache Class
* @ see WP_Object_Cache :: delete ()
*
* @ param int | string $id What the contents in the cache are called
* @ param string $flag Where the cache contents are grouped
* @ return bool True on successful removal , false on failure
*/
2005-11-07 22:56:03 +01:00
function wp_cache_delete ( $id , $flag = '' ) {
global $wp_object_cache ;
return $wp_object_cache -> delete ( $id , $flag );
}
2008-01-03 05:35:47 +01:00
/**
* wp_cache_flush () - Removes all cache items
*
* @ since 2.0
* @ uses $wp_object_cache Object Cache Class
* @ see WP_Object_Cache :: flush ()
*
* @ return bool Always returns true
*/
2005-11-07 22:56:03 +01:00
function wp_cache_flush () {
global $wp_object_cache ;
2005-11-14 23:32:03 +01:00
2005-11-14 23:10:28 +01:00
return $wp_object_cache -> flush ();
2005-11-07 22:56:03 +01:00
}
2008-01-03 05:35:47 +01:00
/**
* wp_cache_get () - Retrieves the cache contents from the cache by ID and flag
*
* @ since 2.0
* @ uses $wp_object_cache Object Cache Class
* @ see WP_Object_Cache :: get ()
*
* @ param int | string $id What the contents in the cache are called
* @ param string $flag Where the cache contents are grouped
* @ return bool | mixed False on failure to retrieve contents or the cache contents on success
*/
2005-11-07 22:56:03 +01:00
function wp_cache_get ( $id , $flag = '' ) {
global $wp_object_cache ;
return $wp_object_cache -> get ( $id , $flag );
}
2008-01-03 05:35:47 +01:00
/**
* wp_cache_init () - Sets up Object Cache Global and assigns it
*
* @ since 2.0
* @ global WP_Object_Cache $wp_object_cache WordPress Object Cache
*/
2005-11-07 22:56:03 +01:00
function wp_cache_init () {
2006-11-19 01:12:57 +01:00
$GLOBALS [ 'wp_object_cache' ] =& new WP_Object_Cache ();
2005-11-07 22:56:03 +01:00
}
2008-01-03 05:35:47 +01:00
/**
* wp_cache_replace () - Replaces the contents of the cache with new data
*
* @ since 2.0
* @ uses $wp_object_cache Object Cache Class
* @ see WP_Object_Cache :: replace ()
*
* @ param int | string $id What to call the contents in the cache
* @ param mixed $data The contents to store in the cache
* @ param string $flag Where to group the cache contents
* @ param int $expire When to expire the cache contents
* @ return bool False if cache ID and group already exists , true on success
*/
2005-11-07 22:56:03 +01:00
function wp_cache_replace ( $key , $data , $flag = '' , $expire = 0 ) {
global $wp_object_cache ;
return $wp_object_cache -> replace ( $key , $data , $flag , $expire );
}
2008-01-03 05:35:47 +01:00
/**
* wp_cache_set () - Saves the data to the cache
*
* @ since 2.0
* @ uses $wp_object_cache Object Cache Class
* @ see WP_Object_Cache :: set ()
*
* @ param int | string $id What to call the contents in the cache
* @ param mixed $data The contents to store in the cache
* @ param string $flag Where to group the cache contents
* @ param int $expire When to expire the cache contents
* @ return bool False if cache ID and group already exists , true on success
*/
2005-11-07 22:56:03 +01:00
function wp_cache_set ( $key , $data , $flag = '' , $expire = 0 ) {
global $wp_object_cache ;
return $wp_object_cache -> set ( $key , $data , $flag , $expire );
}
2008-01-03 05:35:47 +01:00
/**
* WordPress Object Cache
*
* The WordPress Object Cache is used to save on trips to the database .
* The Object Cache stores all of the cache data to memory and makes the
* cache contents available by using a key , which is used to name and
* later retrieve the cache contents .
*
* The Object Cache can be replaced by other caching mechanisms by placing
* files in the wp - content folder which is looked at in wp - settings . If
* that file exists , then this file will not be included .
*
* @ package WordPress
* @ subpackage Cache
* @ since 2.0
*/
2005-11-07 22:56:03 +01:00
class WP_Object_Cache {
2008-01-03 05:35:47 +01:00
/**
* Holds the cached objects
*
* @ var array
* @ access private
* @ since 2.0
*/
2005-11-07 22:56:03 +01:00
var $cache = array ();
2008-01-03 05:35:47 +01:00
/**
* Cache objects that do not exist in the cache
*
* @ var array
* @ access private
* @ since 2.0
*/
2005-11-14 23:32:03 +01:00
var $non_existant_objects = array ();
2008-01-03 05:35:47 +01:00
/**
* Object caches that are global
*
* @ var array
* @ access private
* @ since 2.0
*/
2005-12-19 20:14:22 +01:00
var $global_groups = array ( 'users' , 'userlogins' , 'usermeta' );
2008-01-03 05:35:47 +01:00
/**
* The amount of times the cache data was already stored in the cache .
*
* @ since 2.5
* @ access private
* @ var int
*/
2008-01-02 23:13:16 +01:00
var $cache_hits = 0 ;
2008-01-03 05:35:47 +01:00
/**
* Amount of times the cache did not have the request in cache
*
* @ var int
* @ access public
* @ since 2.0
*/
2005-11-07 22:56:03 +01:00
var $cache_misses = 0 ;
2006-01-14 01:05:22 +01:00
2008-01-03 05:35:47 +01:00
/**
* Adds data to the cache if it doesn ' t already exist .
*
* @ uses WP_Object_Cache :: get Checks to see if the cache already has data .
* @ uses WP_Object_Cache :: set Sets the data after the checking the cache contents existance .
*
* @ since 2.0
*
* @ param int | string $id What to call the contents in the cache
* @ param mixed $data The contents to store in the cache
* @ param string $group Where to group the cache contents
* @ param int $expire When to expire the cache contents
* @ return bool False if cache ID and group already exists , true on success
*/
2005-11-07 22:56:03 +01:00
function add ( $id , $data , $group = 'default' , $expire = '' ) {
2005-11-14 23:32:03 +01:00
if ( empty ( $group ))
2005-11-07 22:56:03 +01:00
$group = 'default' ;
2005-11-14 23:32:03 +01:00
if ( false !== $this -> get ( $id , $group , false ))
2005-11-07 22:56:03 +01:00
return false ;
return $this -> set ( $id , $data , $group , $expire );
}
2008-01-03 05:35:47 +01:00
/**
* Remove the contents of the cache ID in the group
*
* If the cache ID does not exist in the group and $force parameter
* is set to false , then nothing will happen . The $force parameter
* is set to false by default .
*
* On success the group and the id will be added to the
* $non_existant_objects property in the class .
*
* @ since 2.0
*
* @ param int | string $id What the contents in the cache are called
* @ param string $group Where the cache contents are grouped
* @ param bool $force Optional . Whether to force the unsetting of the cache ID in the group
* @ return bool False if the contents weren ' t deleted and true on success
*/
2005-11-14 22:29:30 +01:00
function delete ( $id , $group = 'default' , $force = false ) {
2005-11-14 23:32:03 +01:00
if ( empty ( $group ))
2005-11-07 22:56:03 +01:00
$group = 'default' ;
2005-11-14 23:32:03 +01:00
if ( ! $force && false === $this -> get ( $id , $group , false ))
2005-11-07 22:56:03 +01:00
return false ;
unset ( $this -> cache [ $group ][ $id ]);
2005-11-09 12:10:34 +01:00
$this -> non_existant_objects [ $group ][ $id ] = true ;
2005-11-07 22:56:03 +01:00
return true ;
}
2008-01-03 05:35:47 +01:00
/**
* Clears the object cache of all data
*
* @ since 2.0
*
* @ return bool Always returns true
*/
2005-11-14 23:10:28 +01:00
function flush () {
2005-11-14 23:32:03 +01:00
$this -> cache = array ();
2006-01-14 01:05:22 +01:00
2005-11-14 23:32:03 +01:00
return true ;
2005-11-14 23:10:28 +01:00
}
2005-11-14 23:32:03 +01:00
2008-01-03 05:35:47 +01:00
/**
* Retrieves the cache contents , if it exists
*
* The contents will be first attempted to be retrieved by searching
* by the ID in the cache group . If the cache is hit ( success ) then
* the contents are returned .
*
* On failure , the $non_existant_objects property is checked and if
* the cache group and ID exist in there the cache misses will not be
* incremented . If not in the nonexistant objects property , then the
* cache misses will be incremented and the cache group and ID will
* be added to the nonexistant objects .
*
* @ since 2.0
*
* @ param int | string $id What the contents in the cache are called
* @ param string $group Where the cache contents are grouped
* @ return bool | mixed False on failure to retrieve contents or the cache contents on success
*/
2008-01-02 23:13:16 +01:00
function get ( $id , $group = 'default' ) {
2005-11-14 23:32:03 +01:00
if ( empty ( $group ))
2005-11-07 22:56:03 +01:00
$group = 'default' ;
if ( isset ( $this -> cache [ $group ][ $id ])) {
2008-01-02 23:13:16 +01:00
$this -> cache_hits += 1 ;
2005-11-07 22:56:03 +01:00
return $this -> cache [ $group ][ $id ];
}
2008-01-02 23:13:16 +01:00
if ( isset ( $this -> non_existant_objects [ $group ][ $id ]) )
2005-11-07 22:56:03 +01:00
return false ;
2006-11-19 08:56:05 +01:00
2008-01-02 23:13:16 +01:00
$this -> non_existant_objects [ $group ][ $id ] = true ;
$this -> cache_misses += 1 ;
return false ;
2006-01-14 01:05:22 +01:00
}
2008-01-03 05:35:47 +01:00
/**
* Replace the contents in the cache , if contents already exist
*
* @ since 2.0
* @ see WP_Object_Cache :: set ()
*
* @ param int | string $id What to call the contents in the cache
* @ param mixed $data The contents to store in the cache
* @ param string $group Where to group the cache contents
* @ param int $expire When to expire the cache contents
* @ return bool False if not exists , true if contents were replaced
*/
2005-11-07 22:56:03 +01:00
function replace ( $id , $data , $group = 'default' , $expire = '' ) {
2005-11-14 23:32:03 +01:00
if ( empty ( $group ))
2005-11-07 22:56:03 +01:00
$group = 'default' ;
2005-11-14 23:32:03 +01:00
if ( false === $this -> get ( $id , $group , false ))
2005-11-07 22:56:03 +01:00
return false ;
return $this -> set ( $id , $data , $group , $expire );
}
2008-01-03 05:35:47 +01:00
/**
* Sets the data contents into the cache
*
* The cache contents is grouped by the $group parameter followed
* by the $id . 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
*
* @ param int | string $id What to call the contents in the cache
* @ param mixed $data The contents to store in the cache
* @ param string $group Where to group the cache contents
* @ param int $expire Not Used
* @ return bool Always returns true
*/
2005-11-07 22:56:03 +01:00
function set ( $id , $data , $group = 'default' , $expire = '' ) {
2005-11-14 23:32:03 +01:00
if ( empty ( $group ))
2005-11-07 22:56:03 +01:00
$group = 'default' ;
2007-10-14 03:08:07 +02:00
if ( NULL === $data )
2005-11-09 12:10:34 +01:00
$data = '' ;
2005-11-07 22:56:03 +01:00
$this -> cache [ $group ][ $id ] = $data ;
2008-02-02 19:42:09 +01:00
if ( isset ( $this -> non_existant_objects [ $group ][ $id ]))
unset ( $this -> non_existant_objects [ $group ][ $id ]);
2006-01-14 01:05:22 +01:00
return true ;
2005-11-07 22:56:03 +01:00
}
2008-01-03 05:35:47 +01:00
/**
* Echos the stats of the caching .
*
* Gives the cache hits , and cache misses . Also prints every cached
* group , key and the data .
*
* @ since 2.0
*/
2005-11-07 22:56:03 +01:00
function stats () {
echo " <p> " ;
2008-01-02 23:13:16 +01:00
echo " <strong>Cache Hits:</strong> { $this -> cache_hits } <br /> " ;
2007-08-14 05:12:24 +02:00
echo " <strong>Cache Misses:</strong> { $this -> cache_misses } <br /> " ;
2005-11-07 22:56:03 +01:00
echo " </p> " ;
foreach ( $this -> cache as $group => $cache ) {
echo " <p> " ;
2007-08-14 05:12:24 +02:00
echo " <strong>Group:</strong> $group <br /> " ;
2005-11-07 22:56:03 +01:00
echo " <strong>Cache:</strong> " ;
echo " <pre> " ;
print_r ( $cache );
echo " </pre> " ;
}
}
2008-01-03 05:35:47 +01:00
/**
* PHP4 constructor ; Calls PHP 5 style constructor
*
* @ since 2.0
*
* @ return WP_Object_Cache
*/
2005-11-07 22:56:03 +01:00
function WP_Object_Cache () {
2007-01-07 00:36:51 +01:00
return $this -> __construct ();
}
2007-02-27 16:24:54 +01:00
2008-01-03 05:35:47 +01:00
/**
* Sets up object properties ; PHP 5 style constructor
*
* @ since 2.0 . 8
* @ return null | WP_Object_Cache If cache is disabled , returns null .
*/
2007-01-07 00:36:51 +01:00
function __construct () {
2008-01-03 05:35:47 +01:00
register_shutdown_function ( array ( & $this , " __destruct " )); /** @todo This should be moved to the PHP4 style constructor, PHP5 already calls __destruct() */
2005-11-07 22:56:03 +01:00
}
2007-01-07 00:36:51 +01:00
2008-01-03 05:35:47 +01:00
/**
* Will save the object cache before object is completely destroyed .
*
* Called upon object destruction , which should be when PHP ends .
*
* @ since 2.0 . 8
*
* @ return bool True value . Won ' t be used by PHP
*/
2007-01-07 00:36:51 +01:00
function __destruct () {
2007-02-27 16:24:54 +01:00
return true ;
2007-01-07 00:36:51 +01:00
}
2005-11-07 22:56:03 +01:00
}
2005-12-19 20:14:22 +01:00
?>