Nejdřív měř
Jak zrychlit pomalou PHP/Symfony aplikaci
Nehádej, co je pomalé. Najdi jedno úzké místo, oprav ho a znovu změř výsledek.
Nejdřív stručně
Proč je aplikace pomalá?
Pomalost často nezpůsobuje samotné PHP. Může ji udělat jedna zbytečná SQL query, vzdálené API nebo práce opakovaná při každém načtení stránky.
Začni konkrétní adresou a stejným scénářem. Symfony profiler ti ukáže čas, dotazy i další volání. V produkci používej bezpečné monitorování, ne veřejný debug panel.
Připrav si
Co budeš potřebovat
Měř před změnou i po ní. Jinak nepoznáš, jestli oprava opravdu pomohla.
- Jednu pomalou stránku nebo API požadavek, který umíš opakovat se stejnými daty.
- Vývojové prostředí se Symfony profilerem nebo bezpečně nastavené aplikační měření v produkci.
- Přístup k pomalým SQL dotazům a plánům jejich vykonání.
- Možnost vyčistit a kontrolovat cache, abys neměřil náhodně starý výsledek.
Krok 1
Hledej příčinu v tomto pořadí
Nedělej deset optimalizací najednou. Každý krok musí mít měřitelný důvod.
1. Změř konkrétní požadavek
- Otevři stejnou stránku několikrát. První načtení může ovlivnit zahřátí cache, proto si zapisuj více měření.
- V profileru se podívej na celkový čas, počet databázových dotazů a pomalé externí volání.
- Vyber jednu nejdražší část. Teprve pak měň kód.
php bin/console about Symfony profiler 2. Oprav databázový dotaz
- Najdi opakované dotazy a načítání dat po jednom záznamu. Často jde o problém N+1.
- Pusť plán nad konkrétním SQL dotazem. Index přidej jen tehdy, když odpovídá filtrům a řazení, které skutečně používáš.
- Po změně porovnej dobu i počet načtených řádků. Indexy mají také cenu při zápisu.
EXPLAIN SELECT ...; PostgreSQL: EXPLAIN 3. Cacheuj opakovanou práci
- Do cache patří drahý výpočet nebo data, která se chvíli nemění. Ne celý personalizovaný obsah bez rozmyslu.
- Pro sdílenou cache můžeš použít Redis. Klíč musí rozlišit jazyk, uživatele nebo filtr, pokud mění výsledek.
- Když se zdrojová data změní, cache cíleně smaž. Tomu se říká invalidace cache.
php bin/console cache:pool:list Symfony Cache Krok 2
Ověř, že se zrychlilo správné místo
Rychlejší číslo nestačí. Výsledek musí zůstat správný i pro běžného uživatele.
-
Zopakuj stejné měření
Porovnej více načtení stejné stránky. Zapiš čas před změnou a po ní.
-
Zkontroluj dotazy
Ve profileru ověř nižší počet dotazů nebo lepší plán. Index bez skutečného využití problém neřeší.
EXPLAIN ANALYZE SELECT ...; -
Otestuj chování bez cache
Cache vyčisti, proveď změnu dat a znovu otevři stránku. Uživatel nesmí dostat starý nebo cizí obsah.
php bin/console cache:pool:clear cache.app
Když to zlobí
Nejčastější chyby
Přidal jsem cache a stránka je pořád pomalá
Zkontroluj, jestli vůbec vzniká cache hit. Můžeš mít pokaždé jiný klíč, krátkou dobu platnosti nebo pomalý kód ještě před cache.
Nový index nepomohl
Podívej se na plán přes EXPLAIN. Dotaz možná filtruje jiný sloupec, vrací většinu tabulky nebo potřebuje jiný tvar SQL.
V produkci zapnu profiler pro každého
Nedělej to. Profiler může ukazovat citlivá data a přidává režii. Použij omezené monitorování a přístup jen pro tým.
Po optimalizaci se ukazují stará data
Doplň jasné pravidlo pro invalidaci cache. Čisti jen klíče související se změnou, ne naslepo vše při každém zápisu.
Hotovo
Aplikace má méně práce.
Teď máš postup, který můžeš opakovat: změřit, najít úzké místo, upravit jednu věc a ověřit výsledek.