Skip to content

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;
}