- 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>
46 lines
1.3 KiB
PHP
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);
|
|
}
|
|
}
|