DLA PROGRAMISTÓW PHP

Xdebug nie pojedzie na produkcji.
Zmierzyliśmy, ile kosztuje.

Znasz ten układ: coś zwalnia na produkcji, lokalnie nie da się tego odtworzyć, a profilera, którego masz, nie wolno tam włączyć. Więc sypiesz microtime() po kodzie, czytasz slow query log i zgadujesz.

Dlaczego nie wolno go tam włączyć

xdebug.mode czyta się z php.ini przy starcie — to nie jest przełącznik na jedno żądanie. „Włączę profiler na ten wolny koszyk" znaczy więc: włączam go każdemu żądaniu na tym workerze, a potem restartuję PHP, żeby wyłączyć.

Dokumentacja Xdebuga podaje jedną liczbę o narzucie: tryb off daje „close to 0 overhead". O pozostałych trybach nie mówi nic. Więc zmierzyliśmy sami, na prawdziwej stronie WordPress renderowanej w około 48 ms, i opublikowaliśmy metodę razem z surowymi liczbami.

bez żadnego narzędzia40 ms
xdebug.mode=profile1012 ms  — 25× wolniej
PHPRay, zapis każdego żądania40,7 ms  — wobec 40,2 ms odniesienia

Pięć przeplatanych serii. Rozrzut wyniku Xdebuga: 999–1034 ms, rozrzut odniesienia: 39,5–40,8 ms. Sześćdziesiąt żądań zapisało przy tym 1,2 GB plików cachegrind — około 40 MB na jedno profilowane żądanie. Na obciążonej stronie zapełni to dysk, zanim znajdziesz to jedno żądanie, którego szukasz.

Co robi PHPRay zamiast tego

Zapisuje każde żądanie, cały czas, i to zostaje: czas, CPU, pamięć, odciski zapytań SQL z wyciętymi wartościami, wywołania HTTP na zewnątrz, błędy PHP i wzorce N+1. Otwierasz wczorajsze wolne żądanie, zamiast próbować je dziś odtworzyć.

Szczegółowa atrybucja per funkcja — czyli to, co najbardziej przypomina profiler Xdebuga — chodzi na próbce i kosztuje około 4% na tej samej stronie. Na mikroteście kosztowała 27% i ten wiersz też opublikowaliśmy, bo jest niewygodny.

# jedna linia, potem patrzysz, co się dzieje teraz
curl -fsSL https://phpray.dev/install.sh -o phpray-install.sh
less phpray-install.sh        # pyta o roota, przeczytaj go wcześniej
sudo bash phpray-install.sh && phpray top

Co zostaje przy Xdebugu

Nie udajemy, że zastępujemy go w całości — do tych rzeczy zostaw go u siebie:

Obie rzeczy mogą stać na jednej maszynie: xdebug.mode=off na produkcji, gdzie kosztuje prawie nic, a zapis zostawiasz PHPRayowi.

Zmierz to na własnej stronie

Instalacja lokalna to jedna linia — otwarty kod, Apache-2.0, bez konta i bez karty. Albo najpierw obejrzyj dane w panelu demo: prawdziwy ruch, tylko do odczytu.

Zainstaluj lokalnie Otwórz demo

Dalej