Start-/Kategorieseiten bauten nach Ablauf der 5-Minuten-TTL im Besucher- Request neu (~25-30 Archiv-Queries über ~100k PMs) — Long-Tail-Rubriken waren dadurch praktisch bei jedem Aufruf langsam. WebPageCache nutzt jetzt Cache::flexible([300, 3600]): Innerhalb 5 Min frisch wie bisher, danach wird bis zu 1 h sofort der alte Stand serviert und der Neuaufbau läuft nach der Response (deferred). HomePageData/CategoryPageData/TickerData laufen dafür über die gemeinsame WebPageCache-Konvention (Keys unverändert), die Hub-Kennzahlen über flexible([3600, 14400]). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
45 lines
1.7 KiB
PHP
45 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Web;
|
|
|
|
use App\Enums\Portal;
|
|
use App\Models\PressRelease;
|
|
use App\Support\WebPageCache;
|
|
use Illuminate\Support\Str;
|
|
|
|
/**
|
|
* Ad-Hoc-Ticker-Meldungen der Web-Frontends: die jüngsten veröffentlichten
|
|
* Pressemitteilungen des Portals. Zentral hier statt je Seite, damit der
|
|
* Ticker auf allen Unterseiten identisch gefüllt ist; stale-while-revalidate
|
|
* gecacht (WebPageCache), weil der Header auf jeder Seite rendert.
|
|
*/
|
|
class TickerData
|
|
{
|
|
/**
|
|
* @return list<array{time: string, text: string, href: ?string}>
|
|
*/
|
|
public function items(Portal $portal, string $language): array
|
|
{
|
|
$cacheKey = WebPageCache::key('ticker', [$portal->value, $language]);
|
|
|
|
return WebPageCache::remember($cacheKey, function () use ($portal, $language): array {
|
|
return PressRelease::query()
|
|
->forPortalValues([$portal->value, Portal::Both->value])
|
|
->forLanguage($language)
|
|
->visibleInArchive()
|
|
->orderByDesc('published_at')
|
|
->limit(8)
|
|
->get(['id', 'title', 'slug', 'published_at'])
|
|
->map(static fn (PressRelease $release): array => [
|
|
'time' => $release->published_at?->format('H:i') ?? '',
|
|
'text' => Str::limit((string) $release->title, 70),
|
|
// Relativ, damit der gecachte Eintrag host-unabhängig bleibt
|
|
// (der Header rendert auf allen Hosts des Portals identisch).
|
|
'href' => $release->slug
|
|
? route('release.detail', ['slug' => $release->slug, 'edition' => $language], absolute: false)
|
|
: null,
|
|
])
|
|
->all();
|
|
});
|
|
}
|
|
}
|