Jak działa

mycache to natywne rozszerzenie PHP napisane w C++, które zastępuje sieciowy object cache (Redis/Memcached) lokalnym cache w RAM o bardzo niskich opóźnieniach. Integruje się z WordPressem jako drop-in object-cache.php i jest projektowane pod obciążenia WooCommerce.

1) WordPress wywołuje wp_cache_*

WordPress i WooCommerce odczytują i zapisują obiekty przez standardowe API wp_cache_get(), wp_cache_set(). mycache zachowuje pełną kompatybilność dzięki drop-in.

2) Drop-in kieruje do rozszerzenia

Drop-in trzyma cache w trakcie żądania (pamięć) i — jeśli rozszerzenie jest dostępne — persystuje dane przez funkcje natywne (mycache_get, mycache_set, itd.).

3) Rozszerzenie używa storage w RAM

Obiekty persystentne są zapisywane jako małe pliki w katalogu w RAM (zwykle /dev/shm), bez TCP, bez jitteru sieci i bez zewnętrznych usług.

Sedno: „pliki w pamięci współdzielonej”

mycache persystuje każdy wpis cache jako kompaktowy plik binarny w katalogu, który żyje w RAM (na Linuxie zazwyczaj /dev/shm). Dzięki temu odczyty i zapisy są lokalne i szybkie.

  • Bez Redis, bez Memcached, bez socketów i bez narzutu TCP
  • Niskie opóźnienia pod obciążeniem (idealne dla WooCommerce)
  • Zapisy atomowe (bezpieczne między procesami)
  • TTL per wpis i garbage collection
Gdzie są dane
  • Domyślnie: /dev/shm/mycache (konfigurowalne)
  • Multi-tenant: osobne katalogi per host / strona
  • Fanout: podkatalogi dla szybkich operacji plikowych
  • Bezpieczeństwo: kontrolowane uprawnienia (chmod_mode, SGID na katalogach)

Szybkie mapowanie klucz → plik

Klucze są haszowane (FNV-1a 64-bit) i mapowane na stałą liczbę podkatalogów (fanout). To eliminuje problem spadków wydajności przy ogromnych pojedynczych katalogach.

  • Fanout: potęga 2, typowo 256 (konfigurowalne)
  • Ścieżka: base/subdir/mc-<hash>.bin
  • Nagłówek: zawiera TTL (timestamp wygaśnięcia) i długość klucza
  • Weryfikacja: klucz jest zapisany w pliku i porównywany przy odczycie

Zapisy atomowe i bezpieczna współbieżność

Zapis jest wykonywany atomowo przez plik tymczasowy i rename. Odczyty używają locków współdzielonych, aktualizacje — locków wyłącznych. To utrzymuje spójność cache przy wysokim concurrency.

  • Ścieżka zapisu: mkstemp → write → fdatasync → rename → fsync(dir)
  • Lock odczytu: flock(LOCK_SH)
  • Lock zapisu: flock(LOCK_EX) (np. incr/decr)
  • Odporność na crash: niepełny plik tymczasowy nigdy nie jest serwowany

Integracja z WordPress jako drop-in

mycache dostarcza kompatybilny object-cache.php. Przekierowuje standardowe wywołania WordPress Object Cache do rozszerzenia, zachowując jednocześnie in-request cache dla maksymalnej szybkości.

  • Drop-in: wp-content/object-cache.php
  • Obsługa multisite i global groups
  • Opcjonalnie igbinary (jeśli dostępny)
  • Opcjonalna kompresja większych obiektów
Zachowanie „produkcyjne”
  • Negatywny cache missów: krótkie cache dla „brak”, aby ograniczyć powtarzane IO
  • Fallback: gdy brak rozszerzenia, działa tryb niepersystentny (tylko pamięć)
  • Namespace: szybki flush przez podbicie namespace (bez czyszczenia katalogów)
  • Prefiksy per blog: izolacja cache w multisite

Konfiguracja (INI)

mycache możesz konfigurować globalnie w php.ini albo per-request przez ini_set(). Drop-in używa tego do bezpiecznego powiązania hosta z własnym katalogiem cache (izolacja multi-tenant).

Ustawienie Domyślnie Znaczenie
mycache.dir /dev/shm/mycache Katalog bazowy dla plików cache w RAM
mycache.fanout 256 Liczba podkatalogów (potęga 2, max 4096)
mycache.chmod_mode 504 (octal 0770) Uprawnienia katalogów/plików (katalogi dostają SGID dla dziedziczenia grupy)
mycache.max_bytes 0 Limit rozmiaru (0 = brak limitu); best-effort eviction po przekroczeniu
Wskazówka: na shared hostingu, jeśli /dev/shm jest ograniczone, użyj prywatnego katalogu cache w obrębie konta.

Kluczowe operacje

  • mycache_set(key, value, ttl) — zapis z opcjonalnym TTL
  • mycache_get(key) — odczyt (null przy miss)
  • mycache_exists(key) — szybkie sprawdzenie istnienia
  • mycache_delete(key) — usunięcie klucza
  • mycache_flush() — pełny flush (drop-in może preferować namespace bump)
  • mycache_gc(ttlGrace) — usuwanie expired/uszkodzonych wpisów
  • mycache_incr/decr(key) — atomowe operacje na liczbach (lock na pliku)
  • mycache_stats() — statystyki w JSON

Dlaczego to działa szybko w WooCommerce

WooCommerce generuje bardzo dużo powtarzalnych odczytów obiektów (opcje, dane produktów, lookup, sesje). mycache zmniejsza obciążenie bazy i usuwa opóźnienia sieciowe z warstwy cache.

Bez round-trip TCP

Odczyty cache to lokalne operacje na plikach w RAM. Brak narzutu socketów i ogona opóźnień sieciowych.

Mniej blokad w DB

Mniej powtarzanych zapytań SQL o opcje, transienty, lookup i obiekty wyliczane. Najbardziej widać to na katalogu, produktach i checkout.

Bezpiecznie pod concurrency

Zapisy atomowe + locki plikowe utrzymują spójność między workerami PHP-FPM nawet przy dużym ruchu.

Chcesz wdrożyć mycache produkcyjnie?

Sprawdź cennik, wybierz plan i zainstaluj drop-in. Z aktywną licencją masz aktualizacje i wsparcie techniczne.

Zobacz cennik Instrukcja instalacji