Proč optimalizovat výkon PHP aplikací
Výkon PHP aplikací rozhoduje o uživatelské zkušenosti, infrastrukturních nákladech i obchodních výsledcích. Moderní PHP (8.x) přináší JIT, vylepšení engine a rozsáhlý ekosystém optimalizačních nástrojů. Cílem je dosáhnout nízké latence, vysoké propustnosti a stabilního chování pod zátěží při zachování bezpečnosti a udržovatelnosti kódu.
Strategie: měřit → analyzovat → optimalizovat
- Měření: APM nástroje (OpenTelemetry, New Relic, Datadog), metriky z
php-fpm status, Nginx/Apache logy (p95/p99), business KPI. - Profilace: produkčně bezpečné profilery (Blackfire, Tideways), vývojářsky Xdebug (mimo produkci), sampling vs. tracing.
- Testování: load/stress testy (k6, JMeter, Gatling, wrk), performance budgety v CI/CD, regresní testy.
Upgrade na moderní PHP 8.x
- Výkon jádra: výrazná zlepšení v opcache, garbage collection a bytecode optimizacích.
- JIT: pro čistě CPU-bound úlohy může pomoci; pro typickou I/O webovou zátěž má efekt omezený. Měřte per workload.
- Nové funkce: typy, readonly, fibers, lepší
json, optimalizovanéarrayoperace.
OPcache: základní kámen výkonu
- Bytecode cache: eliminuje opakovanou kompilaci skriptů; snižuje latenci a CPU.
- Doporučené nastavení (produkce):
opcache.enable=1,opcache.enable_cli=0(případně 1 pro dlouho běžící CLI služby).opcache.validate_timestamps=0a řízený opcache reset při release (immutable buildy).opcache.memory_consumption256–1024 MB dle kódu,opcache.interned_strings_buffer16–128 MB.opcache.max_accelerated_filesdle počtu skriptů (např. 20000–100000).opcache.preloadaopcache.preload_userpro preload často používaných tříd/funkcí.
- Realpath cache:
realpath_cache_size256k–4M,realpath_cache_ttl300+ pro minimalizaci stat().
Composer a autoloading
- Optimalizace autoloaderu:
composer dump-autoload -o(classmap authoritative), minimalizuje disk I/O. - Redukce závislostí: audit balíčků, nahrazení těžkých knihoven lehčí alternativou, odstranění nepoužívaných.
- PSR-4 mapování přizpůsobit struktuře; vyhnout se hlubokým stromům složek.
PHP-FPM: ladění procesního manažeru
- Model: FPM používá pro každý požadavek worker; cílem je optimální počet workerů bez swapu.
- Klíčové parametry:
pm = dynamic|ondemand,pm.max_children,pm.max_requests,pm.process_idle_timeout. - Postup: změřit RSS jednoho workera při špičce → spočítat
max_children ≈ (RAM - rezerva) / RSS. - Slowlog:
request_slowlog_timeoutaslowlogpro stacktrace blokujících volání.
Webový server a HTTP vrstva
- Nginx + FPM: udržujte malé a rychlé
fastcgi_buffers, správnéfastcgi_read_timeout, vyhnout se velkýmclient_max_body_sizebez důvodu. - Komprese: Gzip/Brotli pro textové assety; na PHP odpovědích používat na reverzním proxy, ne v PHP.
- Cache:
Cache-Control,ETag,Last-Modified; u API dle idempotence a frekvence změn. - fastcgi_cache pro plně cacheovatelné stránky (anon obsah), invalidace přes klíče.
Databáze: nejčastější úzké hrdlo
- Indexy: pravidelný audit pomalých dotazů, přidání kompozitních indexů dle přístupových vzorů.
- N+1 problém: eliminovat eager/fetch joiny, batchování dotazů, využít datové přenosy v jedné rundě.
- ORM: omezit hydration, selektivní výběr sloupců, 2nd level cache (Redis/Memcached), vyhnout se těžkým transformacím v PHP.
- Připojení: persistentní propojení v PDO s rozvahou; u FPM může dojít k držení připojení bez užitku.
- Read replicas: rozdělení read/write, idempotence a konzistence (lag-aware router).
Cache vrstvy a serializace
- APCu: in-proc cache pro výsledek výpočtů, konfiguraci a malé lookupy (pozor na invalidaci při deployi).
- Redis/Memcached: sdílená cache pro session, výsledky dotazů, fragmenty renderu; používejte TTL a namespacy.
- Serializer: igbinary nebo msgpack snižují objem a CPU proti nativní serializaci.
- HTTP cache: reverse proxy (Varnish/Nginx) pro celé stránky, ESI pro fragmenty.
Sessions a souběh
- Locking: defaultní file-based session uzamyká požadavky; po přečtení volat
session_write_close(). - Úložiště: Redis s locking a krátkým TTL; vyhnout se sdílení session napříč doménami pokud to není nutné.
Asynchronní zpracování a škálování
- Fronty: dlouhé operace přes job queue (RabbitMQ, Redis, SQS, Beanstalkd), event-driven architektura.
- Dlouho běžící runtime: Swoole/AMPHP/ReactPHP, RoadRunner, Laravel Octane – omezuje FPM overhead, vyžaduje pečlivou správu stavu.
- Offloading: generování PDF, obrázků a exportů mimo web worker (workers, serverless).
Optimalizace kódu a datových struktur
- Minimální alokace: preferovat
foreachnadarray_mappro čitelnost i výkon; vyhnout se zbytečným kopím polí. - Řetězce: používat
.=s rezervou bufferu neboimplode; minimalizovat regex, preferovatstrposapod. - JSON:
json_encodes vhodnými volbami (JSON_UNESCAPED_UNICODE,JSON_INVALID_UTF8_SUBSTITUTE), nepřenášet nadbytečná pole. - Výpočty: pro velká čísla preferovat
ext-gmppředbc*funkcemi. - Collections: u velkých datasetů využít generátory (
yield) a iterátory místo úplného načtení do paměti.
Šablonování a rendering
- Cache šablon: Twig/Latte Blade – zapnout kompilaci a cache, minimalizovat dynamiku v šablonách.
- Fragment cache: cachovat části stránky s invalidací na základě klíčů (uživatel, jazyk, verze dat).
Bez I/O navíc: souborový systém a sítě
- Minimalizace stat(): absolutní cesty, realpath cache, vypnout nepotřebné
open_basedirrestrikce, pokud brzdí. - HTTP klient: reuse TCP/TLS (pooling v Guzzle přes Curl handler), timeouts a circuit breakers.
- Externí služby: bulk operace, batch API, idempotentní návrh.
Bezpečnost vs. výkon
- Zakázat Xdebug v produkci,
assert.active=0, vypnoutzend.assertions> 0. - expose_php=0, vhodné
session.cookie_secure,SameSitea HTTPOnly bez negativního dopadu na výkon. - Rate limiting na reverse proxy, nikoli v PHP, snižuje CPU.
Konfigurace runtime a OS
- Huge pages pro OPcache (když stabilní), pinning CPU pouze po testu.
- Disk: SSD/NVMe pro logy a dočasná data, rotace logů, žádné synchronní zápisy v requestu.
- Kontejnerizace: build-time kompilace závislostí, immutable artefakty, warmup opcache v entrypointu.
Monitoring, alerting a observabilita
- Metriky: latence (p50/p95/p99), throughput (RPS), error rate, saturace (CPU, paměť, I/O), FPM queue length.
- Traces: distribuované trasování (OpenTelemetry) přes web → PHP → DB → cache.
- Logy: strukturované (JSON), korelace s trace-id, sampling v klidu a plné logy při incidentech.
Framework-specifické poznámky
- Symfony: prod cache,
opcache.preload,composer dump-env prod, vypnout debug bundle, HTTP cache s HttpCache nebo CDN. - Laravel:
config:cache,route:cache,view:cache, Horizon pro queue, Octane pro dlouho běžící runtime. - Nette: production mode, cache šablon Latte, DI container dump a opcache warmup.
- Doctrine: query cache a result cache, omezit hydratační režimy, explicitní
SELECTsloupců.
Tabulka: rychlá mapovací příručka optimalizací
| Symptom | Možná příčina | Doporučený krok |
|---|---|---|
| Vysoká CPU, nízký RPS | Chybějící OPcache, těžké šablony | Zapnout OPcache, cache šablon, profilace |
| Pomalé p95/p99 | N+1 dotazy, I/O na externí API | Batchování, cache, timeouts a retries s backoff |
| Fronta ve FPM | Nízký max_children, vysoké RSS |
Navýšit RAM/optimalizovat kód, přepočítat max_children |
| Variabilní latence | GC, cold start, opcache reset | Warmup po deployi, stabilní release strategie |
| Blokující požadavky | Session lock, file I/O | session_write_close(), přesun session do Redis |
Release management a spolehlivost
- Blue/Green a Canary nasazení s metrikami a automatickým rollbackem.
- Imutabilní artefakty: žádné změny na serveru po deployi; warmup cache a opcache.
- Feature flagy: řízení zatížení a postupné zapínání náročných funkcí.
Checklist: minimální produkční baseline
- Zapnutý a správně dimenzovaný OPcache včetně realpath cache.
- Optimalizovaný Composer autoloader a audit závislostí.
- Vyladěný PHP-FPM (
pm.max_children, slowlog, status page). - HTTP cache headers, komprese na reverse proxy, fastcgi_cache pro anon obsah.
- DB indexy, odstraněné N+1, cachování opakovaných dotazů.
- APCu/Redis pro runtime cache a session bez locků.
- Monitoring p95/p99, APM traces a alerty, load test v CI.
Závěr
Optimalizace výkonu PHP je kontinuální disciplína kombinující změny v architektuře, konfiguraci runtime, databázové vrstvě i kódu. Systematickým měřením, profilací a automatizovaným testováním získáte stabilní latenci, lepší škálování a nižší náklady. Moderní PHP 8.x s OPcache, pečlivě vyladěným FPM, využitím cache vrstev a promyšlenou prací s I/O poskytuje excelentní základ pro rychlé a spolehlivé webové aplikace.