Výkon PHP aplikací

Výkon PHP aplikací

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é array operace.

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=0 a řízený opcache reset při release (immutable buildy).
    • opcache.memory_consumption 256–1024 MB dle kódu, opcache.interned_strings_buffer 16–128 MB.
    • opcache.max_accelerated_files dle počtu skriptů (např. 20000–100000).
    • opcache.preload a opcache.preload_user pro preload často používaných tříd/funkcí.
  • Realpath cache: realpath_cache_size 256k–4M, realpath_cache_ttl 300+ 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_timeout a slowlog pro 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ým client_max_body_size bez 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 foreach nad array_map pro čitelnost i výkon; vyhnout se zbytečným kopím polí.
  • Řetězce: používat .= s rezervou bufferu nebo implode; minimalizovat regex, preferovat strpos apod.
  • JSON: json_encode s vhodnými volbami (JSON_UNESCAPED_UNICODE, JSON_INVALID_UTF8_SUBSTITUTE), nepřenášet nadbytečná pole.
  • Výpočty: pro velká čísla preferovat ext-gmp před bc* 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_basedir restrikce, 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, vypnout zend.assertions > 0.
  • expose_php=0, vhodné session.cookie_secure, SameSite a 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í SELECT sloupců.

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.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *