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ędzia | 40 ms |
xdebug.mode=profile | 1012 ms — 25× wolniej |
| PHPRay, zapis każdego żądania | 40,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:
- Debugowanie krokowe z punktami przerwania w edytorze. Nic w PHP nie robi tego lepiej.
- Pełny graf wywołań żądania, które umiesz odtworzyć lokalnie.
- Pokrycie kodu dla PHPUnit.
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 demoDalej
- Pełny pomiar z metodą i sprzętem (po angielsku).
- Ile kosztuje zapis każdego żądania — łącznie z 4%, których się nie spodziewaliśmy.
- Cennik — lokalny rdzeń za $0, Cloud opcjonalny.