Skip to content

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