*
  • {@link ezcCacheStackLruReplacementStrategy}
  • *
  • {@link ezcCacheStackLfuReplacementStrategy}
  • * * are both only wrappers around this class, which implement a different {@link * checkMetaData()}, since both strategies use different meta data structures. * * The (normally abstract static) method * checkMetaData( ezcCacheStackMetaData $metaData ); * must also be implemented by deriving classes. It must check if the given * $metaData is an instance of the correct class. In other cases, an {@link * ezcCacheInvalidMetaDataException} must be throwen. * * For more information on replacement strategies please refer to {@see * http://en.wikipedia.org/wiki/Cache_algorithms}. * * @package Cache * @version 1.4beta1 * * @access private */ abstract class ezcCacheStackBaseReplacementStrategy implements ezcCacheStackReplacementStrategy { /** * Stores the given $itemData in the storage given in $conf. * * This method stores the given $itemData assigned to $itemId and * optionally $itemAttributes in the {@link ezcCacheStackableStorage} given * in $conf. In case the storage has reached the $itemLimit defined in * $conf, it must be freed according to $freeRate {@link * ezcCacheStackStorageConfiguration}. * * The freeing of items from the storage must first happen via {@link * ezcCacheStackableStorage::purge()}, which removes outdated items from * the storage and returns the affected IDs. In case this does not last to * free the desired number of items, the replacement strategy specific * algorithm for freeing takes effect. * * After the necessary freeing process has been performed, the item is * stored in the storage and the $metaData is updated accordingly. * * @param ezcCacheStackStorageConfiguration $conf * @param ezcCacheStackMetaData $metaData * @param string $itemId * @param mixed $itemData * @param array(string=>string) $itemAttributes */ public static function store( ezcCacheStackStorageConfiguration $conf, ezcCacheStackMetaData $metaData, $itemId, $itemData, $itemAttributes = array() ) { if ( !$metaData->hasItem( $conf->id, $itemId ) && $metaData->reachedItemLimit( $conf->id, $conf->itemLimit ) ) { self::freeData( $conf, $metaData, // Number of items to remove, round() returns float (int) round( $conf->freeRate * $conf->itemLimit ) ); } $conf->storage->store( $itemId, $itemData, $itemAttributes ); $metaData->addItem( $conf->id, $itemId ); } /** * Frees $freeNum number of item slots in $storage. * * This method first purges outdated items from the storage inside * $conf using {@link ezcCacheStackableStorage::purge()}. * If this does not free $freeNum items, least recently used items * (determined from {@link ezcCacheStackMetaData}) will be removed from the * storage using {@link ezcCacheStackableStorage::delete()}. * * @param ezcCacheStackStorageConfiguration $conf * @param ezcCacheStackMetaData $metaData * @param int $freeNum */ private static function freeData( ezcCacheStackStorageConfiguration $conf, ezcCacheStackMetaData $metaData, $freeNum ) { $purgedIds = $conf->storage->purge(); // Unset purged items in meta data foreach ( $purgedIds as $purgedId ) { $metaData->removeItem( $conf->id, $purgedId ); } $freeNum = $freeNum - count( $purgedIds ); // Not enough items have been purged, remove manually if ( $freeNum > 0 ) { $purgeOrder = $metaData->getReplacementItems(); foreach ( $purgeOrder as $id => $replacementData ) { // Purge only if available in the current storage if ( $metaData->hasItem( $conf->id, $id ) ) { // Purge all items with this ID, no matter which // attributes, therefore: $search = true. $deletedIds = $conf->storage->delete( $id, null, true ); $metaData->removeItem( $conf->id, $id ); // Purged enough? if ( --$freeNum == 0 ) { break; } } } } } /** * Restores the data with the given $dataId from the storage given in $conf. * * This method takes care of restoring the item with ID $itemId and * optionally $itemAttributes from the {@link ezcCacheStackableStorage} * given in $conf. The parameters $itemId, $itemAttributes and $search are * forwarded to {@link ezcCacheStackableStorage::restore()}, the returned * value (item data on successful restore, otherwise false) are returned by * this method. * * The method must take care that the restore process is reflected in * $metaData according to the spcific replacement strategy implementation. * * @param ezcCacheStackStorageConfiguration $conf * @param ezcCacheStackMetaData $metaData * @param string $itemId * @param array(string=>string) $itemAttributes * @param bool $search * * @return mixed Restored data or false. * @throws ezcCacheInvalidMetaDataException * if the given $metaData is not processable by this replacement * strategy. */ public static function restore( ezcCacheStackStorageConfiguration $conf, ezcCacheStackMetaData $metaData, $itemId, $itemAttributes = array(), $search = false ) { $item = $conf->storage->restore( $itemId, $itemAttributes, $search ); // Update item meta data if ( $item === false ) { // Item has been purged / got outdated $metaData->removeItem( $conf->id, $itemId ); } else { // Updates the use time $metaData->addItem( $conf->id, $itemId ); } return $item; } /** * Deletes the data with the given $itemId from the given $storage. * * This method takes care about deleting the item identified by $itemId and * optionally $itemAttributes from the {@link ezcCacheStackableStorage} * give in $conf. The parameters $itemId, $itemAttributes and $search are * therefore forwarded to {@link ezcCacheStackableStorage::delete()}. This * method returns a list of all item IDs that have been deleted by the * call. The method reflects these changes in $metaData. * * @param ezcCacheStackStorageConfiguration $conf * @param ezcCacheStackMetaData $metaData * @param string $itemId * @param array(string=>string) $itemAttributes * @param bool $search * * @return array(string) Deleted item IDs. * @throws ezcCacheInvalidMetaDataException * if the given $metaData is not processable by this replacement * strategy. */ public static function delete( ezcCacheStackStorageConfiguration $conf, ezcCacheStackMetaData $metaData, $itemId, $itemAttributes = array(), $search = false ) { $deletedIds = $conf->storage->delete( $itemId, $itemAttributes, $search ); // Possibly deleted multiple items foreach ( $deletedIds as $id ) { $metaData->removeItem( $conf->id, $id ); } return $deletedIds; } /** * Pseudo implementation. * * This method would normally be declared abstract. However, PHP does not * allow abstract static methods. * * Deriving classes must check inside this method, if the given $metaData * is appropriate for them. If not, an {@link * ezcCacheInvalidMetaDataException} must be throwen. * * @param ezcCacheStackMetaData $metaData * * @throws ezcCacheInvalidMetaDataException * if the given $metaData is not processable by this replacement * strategy. */ /* abstract protected static function checkMetaData( ezcCacheStackMetaData $metaData ) */ } ?>