Zum Inhalt springen

Architektur

Eine schnelle Referenz, was im Plugin steckt — nützlich für Theme-Entwickler, Plugin-Autoren und alle, die unerwartetes Verhalten diagnostizieren.

P2Lab\Cache\
├── Api/ REST-Controller (Admin-Endpoints)
├── Command/ Symfony-Konsolenbefehle
├── Decorator/ Decorators um Core-Services von Shopware
├── DependencyInjection/
├── Entity/ DAL-Definitionen für eigene Tabellen
├── Enum/ Modus- / Strategie-Konstanten
├── Factory/ Cache-Adapter-Factory
├── Framework/ Cache-Store-Implementierung
├── Helper/
├── Message/ Async-Messages, die das Plugin dispatcht
├── MessageHandler/ Handler für diese Messages
├── Migration/ Datenbankmigrationen
├── P2LabCache.php Plugin-Einstiegspunkt (Lifecycle)
├── Resources/
├── ScheduledTask/ Drei nächtliche Aufräumtasks (+ Handler)
├── Service/ Domain-Services (Großteil der Logik)
├── Storefront/
├── Subscriber/ Event-Subscriber, die in Shopware einklinken
└── ValueObject/
ServiceWas er tut
CacheEntryServiceLiest / schreibt die Metadaten-Tabelle p2lab_cache_entry
CacheInvalidationServiceTop-Level-Invalidierungs-API — clearAll(), clearAllProducts() usw.
CacheWarmupServiceFindet cachefähige URLs, erzeugt Fortschrittseinträge, batcht sie
CacheSizeServiceMeldet Cache-Gesamtgröße (Festplatte für Filesystem; Datenbank für Redis / APCu)
SmartInvalidationAnalyzerFeld-zu-Tag-Mapping für den Smart-Invalidierungsmodus
CacheInvalidationLogServicePersistiert Zeilen in p2lab_cache_invalidation_log
ReverseProxyLogServicePersistiert Zeilen in p2lab_cache_reverse_proxy_log, plus Analyse-Queries
CacheTagServiceBaut das Tag-Set für eine gegebene Antwort
TagParserServiceParst Tag-Namen zurück in Entitätsreferenzen für die Log-Ansichten
RequestServiceInspiziert Anfragen, um Cachefähigkeit und Cache-Key zu bestimmen
SettingsServiceLiest system_config-Werte mit Pro-Sales-Channel-Fallback
DecoriertZweck
SalesChannelContextFactoryGecachter Sales-Channel-Context für Warmup-Worker
ReverseProxyGatewayFügt xkey-Strategie + Blocklist + Splitting / Verkürzung vor dem Senden von Purges an Varnish hinzu
SubscriberHört aufWas er tut
CacheEntryFlushSubscriberKernelEvents::TERMINATEPersistiert Metadaten neu geschriebener Einträge nach dem Senden der Antwort
CacheInvalidationSubscriberEntity-written-EventsTriggert die Invalidierungspipeline (Manual / Basic / Extended / Precise / Smart)
CacheResponseSubscriberKernelEvents::RESPONSESpeichert die Antwort im Backend, wenn cachefähig; setzt Cache-Control-Header
NotificationMessageSubscriberEigene Plugin-EventsPusht Admin-Benachrichtigungen (Warmup-Abschluss usw.)
TagCollectionSubscriberEntity-loaded-EventsSammelt das Tag-Set, das eine Antwort tragen soll
XkeySubscriberPre-Purge-EventWendet Blocklist, Splitting und Verkürzung auf ausgehende xkey-Header an
MessageHandlerZweck
CacheWarmupStartMessageCacheWarmupStartHandlerStartet einen Warmup-Lauf; spawn’t Batch-Messages
CacheWarmupBatchMessageCacheWarmupBatchHandlerVerarbeitet einen Batch URLs
TaskStandard-IntervallWas er tut
p2lab_cache.cleanup_cache_entries24 hEntfernt verwaiste p2lab_cache_entry-Zeilen
p2lab_cache.cleanup_invalidation_log24 hEntfernt Invalidierungslog-Zeilen älter als 30 Tage
p2lab_cache.cleanup_reverse_proxy_log24 hEntfernt Reverse-Proxy-Log-Zeilen älter als 30 Tage

Siehe Geplante Tasks.

TabelleZweck
p2lab_cache_entryMetadaten für jeden Cache-Eintrag (Größe, Typ, Generierungs- / Hit-Zeit)
p2lab_cache_invalidation_logJedes Invalidierungsereignis
p2lab_cache_reverse_proxy_logJeder an Varnish gesendete xkey-Purge
p2lab_cache_warmup_progressEine Zeile pro Warmup-Lauf; trackt Offset und Zähler
p2lab_cache_warmup_failed_urlURLs, die während eines Warmups fehlgeschlagen sind

Vom Plugin erzeugte Cache-Tags beginnen alle mit p2c-. Die Konventionen:

  • p2c-product-<id> — volles Produkt-Tag (jede Feldänderung purged)
  • p2c-product-<id>.<field> — feldbezogenes Tag im Smart-Modus (z. B. .price, .stock)
  • p2c-product-stock_<id> — reines Bestands-Tag, separat exponiert, damit die product_stock-Blocklist-Kategorie es isolieren kann
  • p2c-category-<id> — volles Kategorie-Tag
  • p2c-listing-<categoryId> — Listing-Tag (gepurged, wenn sich ein listing-relevantes Feld eines Mitglieds-Produkts ändert)
  • p2c-cms-page-<id> — CMS-Seiten-Tag
  • p2c-buybox-<productId> — Async-Buybox-Tag

Diese Tags werden per xkey an Varnish gesendet und treiben auch das lokale Invalidierungs-Lookup.

  • Neuen Cache-Typ hinzufügen: Auf KernelEvents::RESPONSE subscriben, Typ über das Response-Objekt setzen und einen Tag-Prefix hinzufügen. getCacheStatsByType() ergänzen, damit es davon weiß.
  • Feld zum Smart-Mapping hinzufügen: SmartInvalidationAnalyzer decoraten und analyzeProductChange() oder analyzeCategoryChange() überschreiben.
  • xkey-Blocklist-Kategorie hinzufügen: xkeyTagBlocklist-Config erweitern + passendes Muster in XkeySubscriber ergänzen.