Příklady použití Cache
Praktické příklady práce s vlastní Cache implementací.
Inicializace
Zavolej jednou v bootstrapu:
use Petrovo\Cache\Cache;
// app/bootstrap.php
Cache::init(DIR . '/var/cache');
Základní použití
Uložení a načtení
use Petrovo\Cache\Cache;
// Ulož na 1 hodinu (default)
Cache::set('stats', ['users' => 123, 'posts' => 456]);
// Načti
$stats = Cache::get('stats');
// Vrací: ['users' => 123, 'posts' => 456]
Cache miss
$data = Cache::get('nonexistent');
// Vrací: null
Cachování DB výsledků
Typický pattern
use Petrovo\Cache\Cache;
use DB;
function getActiveUsers() {
$key = 'users_active';
// Zkus cache
$users = Cache::get($key);
if ($users !== null) {
return $users; // HIT
}
// MISS – dotaz
$users = DB::results("SELECT * FROM users WHERE active = 1");
// Ulož na 30 minut (1800 sekund)
Cache::set($key, $users, 1800);
return $users;
}
// Použití
$users = getActiveUsers(); // Při prvním volání z DB
$users = getActiveUsers(); // Později z cache
Invalidace po změně
use Petrovo\Cache\Cache;
use DB;
// UPDATE
DB::query("UPDATE users SET active = 0 WHERE id = ?", [$userId]);
// InvalidujCache
Cache::delete('users_active');
Vlastní TTL
Krátkodobá cache (5 minut)
// Pro data, která se mění často
Cache::set('current_price', $price, 300); // 300 sekund
Dlouhodobá cache (24 hodin)
// Pro stabilní data
Cache::set('menu', $menu, 86400); // 86400 sekund
Default (1 hodina)
// Vynech třetí parametr
Cache::set('key', $data); // Cache::SECONDS = 3600
Cachování YAML souborů
use Petrovo\Cache\Cache;
// První volání – parsuje YAML
$config = Cache::file('config/settings.yaml');
// Druhé volání – z cache
$config = Cache::file('config/settings.yaml');
// Vlastní expiraci
$settings = Cache::file('config/custom.yaml', 'yaml', 86400);
Spravování cache
Smaž jednu položku
Cache::delete('stats');
Smaž expirované položky
// Projdi všechny a smaž staré
Cache::purge();
Smaž VŠECHNO
Cache::clear();
Praktické scénáře
1. Kategorie z DB
function getCategories() {
$key = 'categories_all';
$cats = Cache::get($key);
if ($cats !== null) {
return $cats;
}
$cats = DB::results("SELECT * FROM categories ORDER BY name");
Cache::set($key, $cats, 3600);
return $cats;
}
2. Multi-jazykové menu
function getMenuByLang($lang) {
$key = "menu_$lang";
$menu = Cache::get($key);
if ($menu !== null) {
return $menu;
}
$menu = DB::results(
"SELECT * FROM menu WHERE lang = ? AND active = 1",
[$lang]
);
Cache::set($key, $menu);
return $menu;
}
// Různé jazyky, různá cache
$cz = getMenuByLang('cs');
$en = getMenuByLang('en');
3. API response cache
function getExternalData() {
$key = 'api_weather';
$data = Cache::get($key);
if ($data !== null) {
return $data;
}
// Velké API volání
$json = file_get_contents('https://api.example.com/data');
$data = json_decode($json, true);
// Cachuj na 15 minut
Cache::set($key, $data, 900);
return $data;
}
4. Složité počítání
function getStats() {
$key = 'dashboard_stats';
$stats = Cache::get($key);
if ($stats !== null) {
return $stats;
}
// Drahé výpočty
$stats = [
'total_users' => DB::var("SELECT COUNT(*) FROM users"),
'active_posts' => DB::var("SELECT COUNT(*) FROM posts WHERE active = 1"),
'avg_rating' => DB::var("SELECT AVG(rating) FROM ratings"),
];
Cache::set($key, $stats, 3600);
return $stats;
}
Cache klíče – konvence
Používej hierarchické klíče oddělené podtržítkem:
// ✓ Dobré
Cache::set('users_active', $data);
Cache::set('posts_published_2024', $data);
Cache::set('menu_en', $data);
Cache::set('category_5_items', $data);
// ✓ Taky OK – s MD5 pro dotazy
$query = "SELECT * FROM users WHERE age > 30";
Cache::set('db_' . md5($query), $data);
Performance tips
✓ Dobré
// Zkus cache PŘED DB dotazem
$data = Cache::get('key');
if ($data === null) {
$data = DB::results("SELECT ...");
Cache::set('key', $data);
}
return $data;
✗ Špatné
// Vždycky query, pak cachování
$data = DB::results("SELECT ...");
Cache::set('key', $data); // Zbytečné – už data máš
return $data;
✓ Invalidace
// Po UPDATE – vždycky invaliduj
DB::query("UPDATE users SET status = ? WHERE id = ?", [$status, $id]);
Cache::delete('users_active');
✗ Zapomenutá invalidace
// Nebezpečné – cache obsahuje staré data
DB::query("UPDATE users SET status = ? WHERE id = ?", [$status, $id]);
// Bez Cache::delete() → cache miss později
File format
Cache soubory jsou čitelné PHP:
// var/cache/ab/cd/abcdefg1234567890.php
<?php
return array (
'id' => 1,
'name' => 'John',
'roles' =>
array (
0 => 'admin',
1 => 'user',
),
);
mtime = expiration time:
$ stat var/cache/ab/cd/abcdefg1234567890.php
Modify: 2026-03-06 15:30:45 # Unix timestamp when expires
Správa cache z CLI
Console příkazy
# Purge expirované cache
./console cron:purge-cache
# Output: The cache has been purged
# Smaž VŠECHNO
./console cron:clear-cache
# Output: The cache has been deleted
Cron skripty
# Purge – PHP skript
./app/cron/purge-cache.php
# Output: The cache has been purged
# Clear – PHP skript
./app/cron/clear-cache.php
# Output: The cache has been deleted
Crontab integrace
# Purge cache každou hodinu (z expirovaných)
0 * * * * ./app/cron/purge-cache.php
# Úplná čistka jednou denně v 2:00
0 2 * * * ./app/cron/clear-cache.php
Ladění
Podívej se do cache
ls -la var/cache/
find var/cache -name "*.php" | head -20
cat var/cache/ab/cd/hash.php
Smaž vše pro test
rm -rf var/cache/*
Manuální purge v PHP
Cache::purge(); // Smaž expirované
Cache::clear(); // Smaž všechno