Cache¶
Minimalistický file-based cache systém. Rychlé, transparentní, bez dependencies.
- Atomic writes (unikátní tmp file + rename)
- Expirace uložena UVNITŘ souboru (ne v
filemtime()) - Hashovaná adresářová struktura (2 úrovně)
- PHP files s
var_export() read()nikdy nemaže – expirované/poškozené soubory uklízí ažpurge()/clear()- OPcache invalidace při každém zápisu/smazání
Proč expirace není v filemtime()¶
Původní implementace řešila TTL přes touch($file, time() + $ttl) a filemtime(). To se
ale tlouklo s OPcache: OPcache cachuje zkompilovaný soubor podle cesty a nesleduje mtime
změny stejným způsobem jako filesystem (zvlášť když je opcache.validate_timestamps=0,
což je v produkci běžné). Výsledkem byl scénář, kdy touch() posunul expiraci, ale OPcache
dál vracel starý zkompilovaný obsah – nebo naopak stat() cache OS/PHP vracela zastaralý
mtime, takže expirace vypadala jinak z pohledu FS a jinak z pohledu OPcache.
Řešení: expirace ($expiresAt) je součástí var_export()-ovaného obsahu souboru
(return [$expiresAt, $value];). include tak vždy dostane expiraci ze stejného zdroje,
který OPcache kompiluje a cachuje – není žádný vedlejší kanál (mtime), který by se s
OPcache mohl rozejít. Zápis navíc vždy volá opcache_invalidate($file, true), takže i
force-reload je explicitní a viditelný v kódu, ne spoléhání na validate_timestamps.