Smart HTTP cache clearing refers to the ability to clear cache for Locations/content that is in relation with the content being currently cleared.
When published, any Content item usually has at least one Location, identified by its URL. Therefore, HTTP cache being bound to URLs, if a Content item is updated (a new version is published), we want HTTP cache for all its Locations to be cleared, so the content itself can be updated everywhere it is supposed to be displayed. Sometimes, clearing cache for the content's Locations is not sufficient. You can, for instance, have an excerpt of it displayed in a list from the parent Location, or from within a relation. In this case, cache for the parent Location and/or the relation need to be cleared as well (at least if an ESI is not used).
Smart HTTP cache clearing is an event-based mechanism. Whenever a content item needs its cache cleared, the cache purger service sends an ezpublish.cache_clear.content
event (also identified by eZ\Publish\Core\MVC\Symfony\MVCEvents::CACHE_CLEAR_CONTENT
constant) and passes an eZ\Publish\Core\MVC\Symfony\Event\ContentCacheClearEvent
event object. This object contains the ContentInfo object we need to clear the cache for. Every listener for this event can add Location objects to the cache clear list.
Once the event is dispatched, the purger passes collected Location objects to the purge client, which will effectively send the cache BAN
request.
The event is dispatched with a dedicated event dispatcher, ezpublish.http_cache.event_dispatcher . |
By default, following Locations will be added to the cache clear list:
AssignedLocationsListener
)ParentLocationsListener
)RelatedLocationsListener
)By design, smart HTTP cache clearing is extensible. One can easily implement an event listener/subscriber to the ezpublish.cache_clear.content
event and add Locations to the cache clear list.
Here's a very simple custom listener example, adding an arbitrary Location to the list.
Cache clear listener services must be tagged as ezpublish.http_cache.event_subscriber or ezpublish.http_cache.event_listener . |
namespace Acme\AcmeTestBundle\EventListener; use eZ\Publish\API\Repository\LocationService; use eZ\Publish\Core\MVC\Symfony\Event\ContentCacheClearEvent; use eZ\Publish\Core\MVC\Symfony\MVCEvents; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class ArbitraryLocationsListener implements EventSubscriberInterface { /** * @var LocationService */ private $locationService; public function __construct( LocationService $locationService ) { $this->locationService = $locationService; } public static function getSubscribedEvents() { return [MVCEvents::CACHE_CLEAR_CONTENT => ['onContentCacheClear', 100]]; } public function onContentCacheClear( ContentCacheClearEvent $event ) { // $contentInfo is the ContentInfo object for the content being cleared. // You can extract information from it (e.g. ContentType from its contentTypeId), using appropriate Repository services. $contentInfo = $event->getContentInfo(); // Adding arbitrary locations to the cache clear list. $event->addLocationToClear( $this->locationService->loadLocation( 123 ) ); $event->addLocationToClear( $this->locationService->loadLocation( 456 ) ); } } |
parameters: acme.cache_clear.arbitrary_locations_listener.class: Acme\AcmeTestBundle\EventListener\ArbitraryLocationsListener services: acme.cache_clear.arbitrary_locations_listener: class: %acme.cache_clear.arbitrary_locations_listener.class% arguments: [@ezpublish.api.service.location] tags: - { name: ezpublish.http_cache.event_subscriber } |