Ladění PHP (debugging)
Ladící nástroje
- + debugger, profiller
- + podpora PhpStorm
- - zpomaluje běh, někdy výrazně: composer
- - nevhodné na produkci
Ladící nástroje
- + lighweight and fast
- - PhpStorm does not support it (https://youtrack.jetbrains.com/issue/WI-21414)
XDebug - instalace
- Windows
- předkompilované moduly
- all-in-one řešení XAMP apod.
- Mac OS
- Homebrew
php@7.1
či obdobné novější + PECL:pecl install xdebug
- Homebrew
- Linux
- ze zdrojových kódů/PECL
- z balíčkovacího systému -
apt-get
,yum
…
XDebug - instalace
$ php -v
PHP 8.3.11 (cli) (built: Sep 4 2024 23:01:15) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.11, Copyright (c) Zend Technologies
with Xdebug v3.3.2, Copyright (c) 2002-2024, by Derick Rethans
$ php -i | grep -i xdebug
/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini,
with Xdebug v3.3.2, Copyright (c) 2002-2024, by Derick Rethans
xdebug
...
xdebug.auto_trace => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.cli_color => 0 => 0
xdebug.client_discovery_header => HTTP_X_FORWARDED_FOR,REMOTE_ADDR => HTTP_X_FORWARDED_FOR,REMOTE_ADDR
xdebug.client_host => localhost => localhost
xdebug.client_port => 9003 => 9003
...
XDebug - DBGp
- protokol DBGp
- textový/XML
- PHP aplikace se chová jako klient a připojuje se např. k IDE (server)
XDebug - vzdálené ladění
- v případě pevné/známé IP
xdebug.client_host
- kam se má XDebug připojovat
- v případě více uživatelů ze stejné IP adresy (vývojáři x dev-server)
- DBGp proxy nebo
xdebug.discover_client_host
- DBGp proxy nebo
- Communication set-up
- Debugging with multiple users
XDebug - konfigurace
xdebug.mode
- režim práce s XDebugem, možno uvést více módů oddělené čárkoucoverage
- povolení počítání code coveragedebug
- povolení krokováníprofile
- povolení profilování- Další viz dokumentace.
xdebug.client_host
- adresa serveru (IDE), např.localhost
- Občas může být potřeba nastavit dle prostředí, kde je debugování prováděno.
- Na Windows a Mac Docker obsahuje doménu
host.docker.internal
(na Linuxu je možné zprovoznění stejné domény nastavit)
xdebug.client_port
- port serveru, výchozí9003
xdebug.output_dir
- cesta pro uložení výstupních dat (zejména profilování); výchozí/tmp
Všechny hodnoty nastavení jsou k dispozici v dokumentaci k XDebug
XDebug - příklad konfigurace
[xdebug]
zend_extension="xdebug.so"
xdebug.mode="debug,profile,coverage"
; xdebug.client_host = "adresa"
Momentální hodnoty nastavení je možné zobrazit pomocí funkce phpinfo()
, případně skrz php -i
. Vhodné ke kontrole nastavení. Pozor, hodnoty nastavení se mohou lišit v rámci CLI a v rámci webového prohlížeče.
XDebug - ladění v příkazové řádce
export XDEBUG_CONFIG="idekey=phpstorm"
příp. víc proměnných
export XDEBUG_CONFIG="idekey=session_name client_host=host.docker.internal mode=debug"
Spuštění ladění v příkazové řádce:
XDEBUG_SESSION=phpstorm PHP_IDE_CONFIG="serverName=localhost" php -dxdebug.mode=debug -dxdebug.client_port=9003 -dxdebug.client_host=host.docker.internal test.php
Xdebug - ladění v prohlížeči
Profilování v PHP (profiling)
- integrováno v XDebug
- XHprof (Facebook), Tideways…
Profilování
- analýza výkonosti
- analýza rizik, bottle-neck
- během profilování se vytvoří velký soubor s podrobnostmi o počtu a délce volání funkcí
- prohlížení např. v
- webgrind
- KCacheGrind
- PHPStorm - Tools/Analyze XDebug Profiler Snapshot…
Profilování - metriky
- time - čas strávený ve funkci a odtud volaných funkcích
- own time - čas strávený v samotné funkci
- calls - počet volání / % z celku
Časté chyby
- cyklus nebo rekurze s I/O operacemi
- výpočty uvnitř cyklu, které šlo provést jednorázově předem
- blokující operace (čekání)
Optimalizace
Program optimization or software optimization is the process of modifying a software system to make some aspect of it work more efficiently or use fewer resources. (Robert Sedgewick, Algorithms, 1984, p. 84)
Premature optimization is the root of all evil. (Donald E. Knuth)
Škálování (scalability)
- vertikální
- rychlejší procesor, víc RAM…
- snadné, ale prodraží se
- horizontální
- více počítačů, paralelizace
- vyžaduje přípravu předem