Přeskočit obsah

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.