presseportale/app/Support/WebPageCache.php
Kevin Adametz 22975e762e performance: Caching, deferred Tracking & externe Timeouts (H7, M12, M13)
- Navigations-Chrome (CategoryNavigation), Suche- und Newsroom-Seitendaten
  300s gecacht; gemeinsamer WebPageCache-Helper (eine TTL/Key-Konvention).
- Cache-Poisoning über ?page= geschlossen (Key an Paginator ausgerichtet,
  kein withQueryString im Cache); Newsrooms cachet nur den ungefilterten
  Fall und die ersten Seiten (kein unbegrenzter Key-Raum).
- Detailseiten schreiben Hits/View-Events deferred nach der Response
  (M12); OpenAI-/Markt-/USt-ID-Aufrufe mit Connect-Timeouts und
  begrenzten Retries; Admin-Memo-Caches konsistent invalidiert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 13:49:47 +00:00

46 lines
1.3 KiB
PHP

<?php
namespace App\Support;
use Closure;
use Illuminate\Support\Facades\Cache;
/**
* Gemeinsame Cache-Konvention der öffentlichen Web-Seitendaten (HomePageData,
* CategoryPageData, NewsroomDetail/NewsroomsPageData, SuchePageData,
* CategoryNavigation). Bündelt die einheitliche TTL und den `web.`-Präfix an
* einer Stelle, statt vier verschiedene Konstanten/Magic-Numbers zu pflegen.
*/
class WebPageCache
{
/**
* Einheitliche Cache-Dauer der Web-Seitendaten in Sekunden.
*/
public const TtlSeconds = 300;
/**
* Baut einen `web.`-Cache-Key aus Segmenten (leere Segmente entfallen).
*
* @param array<int, string|int> $segments
*/
public static function key(string $group, array $segments = []): string
{
$parts = array_filter(
array_map(static fn (string|int $segment): string => (string) $segment, $segments),
static fn (string $segment): bool => $segment !== '',
);
return implode('.', array_merge(['web', $group], $parts));
}
/**
* @template TValue
*
* @param Closure(): TValue $callback
* @return TValue
*/
public static function remember(string $key, Closure $callback): mixed
{
return Cache::remember($key, self::TtlSeconds, $callback);
}
}