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.

25 minut · PHP a Symfony

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

  1. Otevři stejnou stránku několikrát. První načtení může ovlivnit zahřátí cache, proto si zapisuj více měření.
  2. V profileru se podívej na celkový čas, počet databázových dotazů a pomalé externí volání.
  3. Vyber jednu nejdražší část. Teprve pak měň kód.
php bin/console about
Symfony profiler

2. Oprav databázový dotaz

  1. Najdi opakované dotazy a načítání dat po jednom záznamu. Často jde o problém N+1.
  2. 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áš.
  3. 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

  1. Do cache patří drahý výpočet nebo data, která se chvíli nemění. Ne celý personalizovaný obsah bez rozmyslu.
  2. Pro sdílenou cache můžeš použít Redis. Klíč musí rozlišit jazyk, uživatele nebo filtr, pokud mění výsledek.
  3. 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.

  1. Zopakuj stejné měření

    Porovnej více načtení stejné stránky. Zapiš čas před změnou a po ní.

  2. 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 ...;
  3. 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.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.