Jdi na navigaci předmětu

Ladění PHP (debugging)

Ladící nástroje

XDebug

  • + debugger, profiller
  • + podpora PhpStorm
  • - zpomaluje běh, někdy výrazně: composer
  • - nevhodné na produkci

Ladící nástroje

phpdbg

XDebug - instalace

  • Windows
  • Mac OS
    • Homebrew php@7.1 či obdobné novější + PECL: pecl install xdebug
  • 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
  • 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é čárkou
  • 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

Starting the debugger

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

  • GET/POST parametr XDEBUG_SESSION_START=session_name
  • cookie XDEBUG_SESSION
  • rozšíření do prohlížečů (XDebug helper) - nastaví cookie

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