 Autor: [Monika Wojciechowska](/autorzy/monika-wojciechowska) Specjalistka SEO i treści webowych · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  PHP Xdebug — profiling

# PHP profiling z Xdebug 3 — cachegrind i KCachegrind

Opublikowano: 10 kwietnia 2026 · Kategoria: Wydajność

WordPress ładuje się powoli, ale nie wiesz która funkcja to powoduje. Xdebug 3 pozwala nagrać każde wywołanie funkcji PHP z czasem wykonania — plik cachegrind otwierasz w KCachegrind i widzisz dokładnie co zajmuje 80% czasu. Ten przewodnik pokazuje instalację, konfigurację trybu profilowania i interpretację wyników. Na końcu porównanie z Blackfire.io.

## Instalacja Xdebug 3

\# Ubuntu / Debian — przez pecl lub apt
sudo apt install -y php-xdebug

# Lub przez pecl (najnowsza wersja)
sudo pecl install xdebug

# Sprawdź zainstalowaną wersję
php -v
# PHP 8.2.x (cli) with Xdebug v3.3.x

# Znajdź plik konfiguracyjny PHP
php --ini | grep "Loaded Configuration"
# Zazwyczaj: /etc/php/8.2/cli/php.ini lub /etc/php/8.2/fpm/php.ini

# Znajdź katalog conf.d
php --ini | grep "additional .ini"
# Zazwyczaj: /etc/php/8.2/fpm/conf.d/

# Sprawdź czy Xdebug jest załadowany
php -m | grep xdebug

## Konfiguracja xdebug.ini — tryby pracy

Xdebug 3 wprowadził fundamentalną zmianę: jeden parametr `xdebug.mode` kontroluje wszystkie funkcje. Nie włączaj wielu trybów jednocześnie bez potrzeby — każdy dodaje narzut. Poniżej konfiguracje dla różnych scenariuszy:

\# /etc/php/8.2/fpm/conf.d/20-xdebug.ini

\[xdebug\]
zend\_extension = xdebug.so

# ============================================================
# TRYB: profiling — nagrywanie wywołań funkcji do cachegrind
# ============================================================
xdebug.mode = profiling
xdebug.output\_dir = /tmp/xdebug        # katalog na pliki cachegrind
xdebug.profiler\_output\_name = cachegrind.out.%p.%r  # %p=PID, %r=random
xdebug.start\_with\_request = trigger    # tylko gdy XDEBUG\_PROFILE=1 w URL/cookie

# ============================================================
# TRYB: debug — step debugger (VS Code, PhpStorm)
# ============================================================
; xdebug.mode = debug
; xdebug.client\_host = 127.0.0.1
; xdebug.client\_port = 9003
; xdebug.start\_with\_request = yes

# ============================================================
# TRYB: coverage — code coverage dla PHPUnit
# ============================================================
; xdebug.mode = coverage

# ============================================================
# TRYB: develop — ulepszone var\_dump, error reporting
# ============================================================
; xdebug.mode = develop

# Kombinacja (np. debug + develop):
; xdebug.mode = debug,develop

\# Utwórz katalog na pliki profilowania i nadaj uprawnienia
sudo mkdir -p /tmp/xdebug
sudo chown www-data:www-data /tmp/xdebug

# Przeładuj PHP-FPM po zmianie konfiguracji
sudo systemctl reload php8.2-fpm

# Weryfikacja: sprawdź czy tryb profiling jest aktywny
php -r "echo xdebug\_info('mode');" 2>/dev/null || php -r "xdebug\_info();" | grep mode

## Uruchamianie profiling — trigger mode

\# Z parametrem URL (GET)
curl "https://mojadomena.pl/?XDEBUG\_PROFILE=1" -o /dev/null

# Z nagłówkiem HTTP (nie modyfikuje URL aplikacji)
curl "https://mojadomena.pl/" \\
  -H "Cookie: XDEBUG\_PROFILE=PHPSTORM" -o /dev/null

# Przez Xdebug Helper (rozszerzenie Chrome/Firefox)
# Kliknij ikonę → wybierz Profile → odśwież stronę

# Sprawdź wygenerowane pliki cachegrind
ls -la /tmp/xdebug/
# -rw-r--r-- 1 www-data www-data 1.8M cachegrind.out.12345.a1b2c3

# Dla CLI (np. profilowanie skryptu PHP)
XDEBUG\_MODE=profiling XDEBUG\_OUTPUT\_DIR=/tmp/xdebug \\
  php moj-skrypt.php

# Profilowanie konkretnej strony WordPress
XDEBUG\_MODE=profiling php /var/www/wordpress/wp-cron.php

## Analiza w KCachegrind / QCachegrind

KCachegrind (Linux) i QCachegrind (Windows/macOS) to graficzne narzędzia do analizy plików cachegrind. Otwórz plik z `/tmp/xdebug/` i skup się na trzech widokach:

\# Instalacja KCachegrind (Linux)
sudo apt install kcachegrind

# Instalacja QCachegrind (Windows — dostępny jako portable binary)
# Pobierz z: https://github.com/KDE/kcachegrind

# Otwórz plik cachegrind
kcachegrind /tmp/xdebug/cachegrind.out.12345.a1b2c3

# Kluczowe widoki i kolumny:
# Flat Profile — sortuj po "Self" (czas w tej funkcji, bez wywołań)
#   → Szukaj funkcji z Self > 5% — to kandydaci do optymalizacji
#
# Call Graph — wizualizacja grafu wywołań
#   → Grube strzałki = gorące ścieżki wywołań
#
# Callee Map (treemap) — proporcjonalna mapa funkcji według czasu
#   → Duże prostokąty = funkcje z największym kosztem

# Alternatywa online: wgrep plik cachegrind na
# https://www.speedscope.app (format cachegrind obsługiwany)

## WordPress — typowe wąskie gardła

\# Profiling WordPress — szukaj tych problemów w KCachegrind:

# 1. Zbyt wiele zapytań SQL
#    Funkcja: wpdb::query — duże Self Time, setki wywołań
#    Fix: cache WP\_Query, używaj transients, ogranicz pętle WP\_Query

# 2. Nieoptymalne WP\_Query / get\_posts
#    Fix: dodaj 'no\_found\_rows' => true (wyłącza SQL\_CALC\_FOUND\_ROWS)
#         'update\_post\_meta\_cache' => false (gdy nie potrzebujesz meta)
#         'update\_post\_term\_cache' => false (gdy nie potrzebujesz taksonomii)

# Przykład optymalnego WP\_Query:
# $args = array(
#   'posts\_per\_page'         => 10,
#   'no\_found\_rows'          => true,
#   'update\_post\_meta\_cache' => false,
#   'update\_post\_term\_cache' => false,
# );

# 3. Niebuforowane opcje WordPress (wp\_options z autoload=yes)
#    Sprawdź przez: SELECT option\_name, LENGTH(option\_value)
#    FROM wp\_options WHERE autoload='yes' ORDER BY LENGTH(option\_value) DESC;
#    Fix: usuń autoload dla dużych opcji pluginów

# 4. Zewnętrzne HTTP w hookach
#    Funkcja: WP\_HTTP::request lub curl\_exec — duże czasy oczekiwania
#    Fix: cache odpowiedzi API przez set\_transient()

# 5. Powolne pluginy w wp\_head / wp\_footer
#    Sprawdź hook: do\_action('wp\_head') — czas Self vs Inclusive
#    Fix: usuń zbędne pluginy, lazy-load przez wp\_enqueue\_scripts

## Blackfire.io — alternatywa do profilowania produkcji

Cecha

Xdebug 3

Blackfire.io

Cena

Darmowy (open-source)

Darmowy plan (1 środowisko) + płatne

Narzut wydajności

2-5x wolniej (profilowanie)

<5% (zoptymalizowany do produkcji)

UI / wizualizacja

KCachegrind (lokalne) lub speedscope

Wbudowany UI w przeglądarce, timeline

CI/CD integracja

Manualna (phpunit --coverage)

Natywna (GitHub Actions, GitLab CI)

Alerty anomalii

Brak

Automatyczne alerty (regresje wydajności)

Wsparcie dla produkcji

Trigger mode (ograniczone)

Tak (stały monitoring z minimalnym narzutem)

Najlepszy dla

Lokalne dev, step debugger, code coverage

Produkcja, CI/CD, porównywanie wersji

\# Instalacja Blackfire agent i PHP extension
curl -sS https://packages.blackfire.io/gpg.key | sudo gpg --dearmor \\
  -o /usr/share/keyrings/blackfire.gpg
echo "deb \[signed-by=/usr/share/keyrings/blackfire.gpg\] http://packages.blackfire.io/debian any main" \\
  | sudo tee /etc/apt/sources.list.d/blackfire.list
sudo apt update && sudo apt install -y blackfire blackfire-php

# Skonfiguruj agenta (klucze z blackfire.io/my/settings/credentials)
sudo blackfire agent:config

# Przeładuj PHP-FPM
sudo systemctl reload php8.2-fpm

# Profiluj przez CLI
blackfire curl https://mojadomena.pl/

# Profiluj przez przeglądarkę
# Zainstaluj Blackfire Companion (Chrome/Firefox)
# Kliknij ikonę → Profile → otwórz wyniki na blackfire.io

## Najczęstsze pytania

Czym różni się Xdebug od Blackfire.io? +

Xdebug to darmowe rozszerzenie PHP open-source. Obsługuje debugowanie krok-po-kroku (step debugger), profiling i code coverage. Generuje pliki cachegrind do analizy w KCachegrind/QCachegrind. Blackfire.io to komercyjny profiler (darmowy plan dla developerów) z wbudowanym UI w przeglądarce, automatycznym wykrywaniem anomalii i integracją z CI/CD. Blackfire jest łatwiejszy w użyciu i ma lepsze UI, ale Xdebug jest darmowy i doskonały do lokalnego profilowania. Na produkcji zdecydowanie Blackfire — Xdebug profiling znacząco spowalnia PHP.

Jak skonfigurować Xdebug 3 do profilowania (nie debugowania)? +

W Xdebug 3 tryb jest wybierany przez xdebug.mode = profiling (nie debugowania jak w wersji 2). Dodaj do php.ini lub xdebug.ini: xdebug.mode = profiling oraz xdebug.output\_dir = /tmp/xdebug. Profiling uruchamia się przez parametr URL XDEBUG\_PROFILE=1 lub przez xdebug.start\_with\_request = trigger (tylko gdy parametr w URL) albo yes (każde żądanie — uwaga: bardzo wolne). Pliki cachegrind trafiają do output\_dir i można je otworzyć w KCachegrind.

Jak znaleźć wąskie gardła w WordPress przez Xdebug? +

Uruchom żądanie z XDEBUG\_PROFILE=1, otwórz wygenerowany plik cachegrind w KCachegrind. Szukaj funkcji z najwyższym Self Time (czas spędzony w tej funkcji) i Inclusive Time (z wywołaniami potomnymi). Typowe wąskie gardła WordPress: zbyt wiele zapytań SQL (wpdb->query), nieoptymalne pętle WP\_Query z get\_posts(), brak cache dla opcji autoload (wp\_options), wolne pluginy wywoływane w hookach wp\_head/wp\_footer, niebuforowane żądania HTTP do zewnętrznych API przez wp\_remote\_get.

Czy można używać Xdebug na serwerze produkcyjnym? +

Xdebug profiling spowalnia PHP 2-5x — absolutnie nie nadaje się do włączenia na produkcji dla wszystkich żądań. Możesz go użyć tymczasowo na produkcji (lub staging) z xdebug.start\_with\_request = trigger — wtedy profiler aktywuje się tylko gdy w żądaniu jest parametr XDEBUG\_PROFILE=1 lub cookie XDEBUG\_PROFILE. Przy tym ustawieniu normalni użytkownicy nie odczuwają spowolnienia. Na produkcji do stałego monitorowania lepiej użyć Blackfire.io lub Tideways — są zoptymalizowane do ciągłego profilowania z minimalnym narzutem.

## Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.

Contabo

VPS z pełną kontrolą PHP — zainstaluj Xdebug i profiluj własne aplikacje

VPS

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

Mikr.us

Budżetowy VPS do nauki Xdebug i testów PHP profiling

Dev/Test

[Aktywuj rabat →](/out/mikrus)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

LH.pl

Hosting WordPress z PHP 8.x — sprawdź opcje zarządzanego hostingu

Hosting WP

[Aktywuj rabat →](/out/lh-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/lh-pl)

## Powiązane strony

-   [PHP-FPM — konfiguracja i optymalizacja](/baza-wiedzy/php-fpm-konfiguracja-optymalizacja)
-   [Nginx FastCGI Cache — konfiguracja i WordPress](/baza-wiedzy/nginx-fastcgi-cache)
-   [WordPress — optymalizacja na hostingu](/baza-wiedzy/wordpress-optymalizacja-hosting)
-   [Testowanie wydajności serwera — k6 i ApacheBench](/baza-wiedzy/load-testing-k6-ab)
-   [Wszystkie artykuły](/baza-wiedzy/)