diff options
Diffstat (limited to 'engine/lib/entities.php')
| -rw-r--r-- | engine/lib/entities.php | 46 | 
1 files changed, 44 insertions, 2 deletions
diff --git a/engine/lib/entities.php b/engine/lib/entities.php index 5cfeca6f8..ac4b4d995 100644 --- a/engine/lib/entities.php +++ b/engine/lib/entities.php @@ -17,6 +17,15 @@ global $ENTITY_CACHE;  $ENTITY_CACHE = array();  /** + * GUIDs of entities banned from the entity cache (during this request) + * + * @global array $ENTITY_CACHE_BANNED_GUIDS + * @access private + */ +global $ENTITY_CACHE_BANNED_GUIDS; +$ENTITY_CACHE_BANNED_GUIDS = array(); + +/**   * Cache subtypes and related class names.   *   * @global array|null $SUBTYPE_CACHE array once populated from DB, initially null @@ -26,6 +35,34 @@ global $SUBTYPE_CACHE;  $SUBTYPE_CACHE = null;  /** + * Ban this entity from the entity cache + * + * @param int $guid The entity guid + * + * @access private + * @todo this is a workaround until #5604 can be implemented + */ +function _elgg_ban_caching_for_entity($guid) { +	global $ENTITY_CACHE_BANNED_GUIDS; + +	_elgg_invalidate_cache_for_entity($guid); +	$ENTITY_CACHE_BANNED_GUIDS[$guid] = true; +} + +/** + * Allow this entity to be stored in the entity cache + * + * @param int $guid The entity guid + * + * @access private + */ +function _elgg_unban_caching_for_entity($guid) { +	global $ENTITY_CACHE_BANNED_GUIDS; + +	unset($ENTITY_CACHE_BANNED_GUIDS[$guid]); +} + +/**   * Invalidate this class's entry in the cache.   *   * @param int $guid The entity guid @@ -57,7 +94,7 @@ function _elgg_invalidate_cache_for_entity($guid) {   * @todo Use an ElggCache object   */  function _elgg_cache_entity(ElggEntity $entity) { -	global $ENTITY_CACHE; +	global $ENTITY_CACHE, $ENTITY_CACHE_BANNED_GUIDS;  	// Don't cache non-plugin entities while access control is off, otherwise they could be  	// exposed to users who shouldn't see them when control is re-enabled. @@ -65,6 +102,11 @@ function _elgg_cache_entity(ElggEntity $entity) {  		return;  	} +	$guid = $entity->getGUID(); +	if (isset($ENTITY_CACHE_BANNED_GUIDS[$guid])) { +		return; +	} +  	// Don't store too many or we'll have memory problems  	// @todo Pick a less arbitrary limit  	if (count($ENTITY_CACHE) > 256) { @@ -79,7 +121,7 @@ function _elgg_cache_entity(ElggEntity $entity) {  		elgg_get_metadata_cache()->clear($random_guid);  	} -	$ENTITY_CACHE[$entity->guid] = $entity; +	$ENTITY_CACHE[$guid] = $entity;  }  /**  | 
