Příklady použití Cache
Tato sekce ukazuje běžné scénáře práce s cache v aplikaci.
Základní použití
Uložení a načtení dat
Nejjednodušší případ – uložit libovolná data do cache na 1 hodinu:
use Petrovo\Cache\Cache;
// Uložení
$data = ['users' => 123, 'posts' => 456];
Cache::saveItem('stats', $data);
// Načtení
$cachedData = Cache::getItem('stats');
// Výstup: ['users' => 123, 'posts' => 456]
Cache miss
Když cache položka neexistuje nebo vypršela:
use Petrovo\Cache\Cache;
$data = Cache::getItem('nonexistent');
// Vrací: []
Cachování výsledků databázových dotazů
Typický scénář
Dotazy, které se opakují, cachuj pro zvýšení výkonu:
use Petrovo\Cache\Cache;
use DB;
$cacheKey = 'all_active_users';
// Zkus cache nejdřív
$users = Cache::getDb($cacheKey);
if (empty($users)) {
// Cache miss – spusť dotaz
$users = DB::results("SELECT * FROM users WHERE active = 1");
// Ulož do cache (30 minut)
Cache::saveDb($cacheKey, $users, 1800);
}
// Teď máš uživatele (z cache nebo DB)
foreach ($users as $user) {
echo $user->name;
}
Invalidace cache po změně
Když se data změní (INSERT, UPDATE, DELETE), smaž cache:
use Petrovo\Cache\Cache;
use DB;
// Nějaká operace
DB::query("UPDATE users SET active = 0 WHERE id = ?", [$userId]);
// Invaliduj cache
Cache::delete('all_active_users');
Cache::delete('user_' . $userId);
Cachování YAML souborů
Načtení a automatické cachování
YAML soubory se cachují automaticky:
use Petrovo\Cache\Cache;
// První volání: parsuje YAML a cachuje (1 hodina)
$config = Cache::file('app/config/settings.yaml');
// Následující volání: vrací z cache
$config = Cache::file('app/config/settings.yaml');
Cache klíč pro YAML
Cache klíč se vytvoří z cesty:
// Soubor: /data/www-data/_petrovoCMS/config/routes.yaml
// Cache klíč: config/routes.yaml
Vlastní expirační časy
Krátkodobá cache (5 minut)
Pro data, která se často mění:
use Petrovo\Cache\Cache;
// Ulož na 5 minut (300 sekund)
Cache::saveItem('current_weather', $weatherData, 300);
Dlouhodobá cache (24 hodin)
Pro stabilní data:
use Petrovo\Cache\Cache;
// Ulož na 24 hodin (86400 sekund)
Cache::saveItem('menu_structure', $menuData, 86400);
Výchozí čas (1 hodina)
use Petrovo\Cache\Cache;
// Vynech trzetí parametr – použije se Cache::seconds (3600s)
Cache::saveItem('key', $data);
Smart purge – automatická údržba cache
Automatické čištění cache
Purge obvykle spouštíš jednou za čas (např. v cronjob nebo middleware):
use Petrovo\Cache\Cache;
// Purge jen pokud uplynulo 60 minut od poslední purge
Cache::checkAndPurge(60);
Jak funguje:
- Prvním voláním se provede purge a uloží se čas
- Následující volání se neprovedou, dokud neuplyne 60 minut
- Efektivní pro cyklické spouštění bez zbytečné zátěže
Ruční čištění – konkrétní položka
Smaž jednu položku z cache:
use Petrovo\Cache\Cache;
Cache::delete('stats');
Ruční čištění – všechny položky
Vymaž všechno:
use Petrovo\Cache\Cache;
Cache::clear();
Ruční čištění – vymaž staré položky
Odstrani expiované a stálé položky:
use Petrovo\Cache\Cache;
Cache::purge();
Běžné scénáře
1. Cache kategoriálních dat
use Petrovo\Cache\Cache;
use DB;
function getCategories(): array {
$key = 'categories_all';
// Zkus cache
$categories = Cache::getDb($key);
if (!empty($categories)) {
return $categories;
}
// Cache miss – načti z DB
$categories = DB::results("SELECT * FROM categories ORDER BY name");
Cache::saveDb($key, $categories, 3600);
return $categories;
}
// Použití
$cats = getCategories(); // První volání: z DB
$cats = getCategories(); // Druhé: z cache
2. Invalidace cache na UPDATE
use Petrovo\Cache\Cache;
use DB;
function updateCategory($id, $data): void {
DB::query("UPDATE categories SET name = ? WHERE id = ?", [
$data['name'],
$id
]);
// Invaliduj cache
Cache::delete('categories_all');
Cache::delete('category_' . $id);
}
3. Cache s multi-jazykostí
use Petrovo\Cache\Cache;
use DB;
function getMenuForLang($lang): array {
$key = "menu_{$lang}";
$menu = Cache::getDb($key);
if (!empty($menu)) {
return $menu;
}
$menu = DB::results(
"SELECT * FROM menu WHERE lang = ? AND active = 1",
[$lang]
);
Cache::saveDb($key, $menu);
return $menu;
}
// Různé jazyky = různé cache
$cz_menu = getMenuForLang('cs'); // cache: menu_cs
$en_menu = getMenuForLang('en'); // cache: menu_en
4. Cache s TTL podle typu dat
use Petrovo\Cache\Cache;
use DB;
$cache_times = [
'users' => 3600, // 1 hodina
'posts' => 1800, // 30 minut
'settings' => 86400, // 24 hodin
'counters' => 300, // 5 minut
];
function getCachedData($type, $query, $params = []): array {
global $cache_times;
$key = $type . '_' . md5($query);
// Zkus cache
$data = Cache::getDb($key);
if (!empty($data)) {
return $data;
}
// DB volání
$data = DB::results($query, $params);
Cache::saveDb($key, $data, $cache_times[$type] ?? 3600);
return $data;
}
Performance tipy
Správně
// Cache miss? Zkus cache PŘED DB dotazem
$data = Cache::getDb('key');
if (empty($data)) {
$data = DB::results("SELECT ...");
Cache::saveDb('key', $data);
}
Špatně
// Vždycky spouštíš DB dotaz
$data = DB::results("SELECT ...");
Cache::saveDb('key', $data); // Poté cachování = zbytečné
Správně – Invalidace
// Po každé změně smaž relevantní cache
DB::query("UPDATE ...");
Cache::delete('affected_key');
Špatně
// Zapomenuješ invalidovat – cache je stará
DB::query("UPDATE ...");
// Bez Cache::delete()
Integrace s cronjobem
Automatické čištění cache s intervalem:
// app/commands/CachePurge.php
use Petrovo\Cache\Cache;
class CachePurgeCommand {
public function handle(): void {
// Purge jen pokud uplynulo 120 minut
Cache::checkAndPurge(120);
echo "Cache purge check completed.\n";
}
}
Spuštění jednou za hodinu:
0 * * * * /path/to/console cache:purge
Debugging
Co je v cache?
Podívej se do souboru:
ls -la var/cache/
Smaž vše pro testing
rm -rf var/cache/*
Loguj cache hit/miss
Přidej logování do cache operací:
use Petrovo\Cache\Cache;
use Petrovo\Logger\Logger;
function getCachedUsers() {
$key = 'all_users';
$data = Cache::getDb($key);
if (!empty($data)) {
Logger::info('Cache HIT', ['key' => $key]);
return $data;
}
Logger::info('Cache MISS', ['key' => $key]);
$data = DB::results("SELECT * FROM users");
Cache::saveDb($key, $data);
return $data;
}