Xdebug adalah standar de facto untuk debugging PHP. Hampir semua tutorial, dokumentasi IDE, dan setup Laravel development mengandalkannya. Tapi ada satu masalah yang sering dikeluhkan developer: overhead performa. Saat Xdebug dimuat tapi tidak aktif pun, performa PHP bisa turun signifikan — sesuatu yang terasa menyakitkan di proyek yang besar.
Di sinilah PHP Debugger masuk. Proyek ini adalah fork dari Xdebug yang dikerjakan oleh Roman Pronskiy, dengan satu tujuan: membuang semua fitur selain debugging murni, lalu mengoptimalkan sisanya habis-habisan. Hasilnya adalah ekstensi dengan overhead hanya +4% saat dimuat tapi tidak aktif — dibandingkan +324% dari Xdebug. Angka yang cukup mengejutkan untuk dua alat yang bekerja dengan cara yang pada dasarnya sama.
Kita akan bahas apa itu PHP Debugger, bagaimana cara kerjanya, dan kapan masuk akal untuk beralih dari Xdebug.
Mengapa Overhead Xdebug Jadi Masalah
Xdebug adalah alat yang luar biasa. Ia mendukung step debugging, code coverage untuk testing, profiling, dan tracing eksekusi. Kumpulan fitur itu kuat — tapi juga jadi beban. Setiap kali PHP memuat Xdebug sebagai zend_extension, seluruh infrastruktur itu ikut dimuat ke memori, terlepas dari apakah kita sedang aktif men-debug atau tidak.
Di environment development yang sering di-reload (misalnya saat menjalankan test suite, atau Laravel Artisan dengan hot reload), perbedaan +324% versus +4% bisa terasa nyata. Server development jadi lebih lamban, test berjalan lebih lama, dan workflow iterasi terhambat — padahal kita hanya butuh breakpoint dan step-through, bukan coverage atau profiling.
PHP Debugger tidak menggantikan Xdebug sepenuhnya. Jika kamu butuh code coverage untuk PHPUnit atau profiling, Xdebug tetap menjadi pilihan yang tepat. PHP Debugger ditujukan untuk developer yang hanya butuh debugging interaktif.
Apa Itu PHP Debugger
PHP Debugger adalah ekstensi PHP bertipe zend_extension yang mengimplementasikan protokol DBGp — protokol yang sama yang digunakan Xdebug. Artinya, ia bekerja langsung dengan PhpStorm, VS Code (via PHP Debug extension), dan IDE atau editor apapun yang mendukung DBGp.
| Fitur | PHP Debugger | Xdebug |
|---|---|---|
| Step debugging (breakpoint, step in/out/over) | Ya | Ya |
| Code coverage | Tidak | Ya |
| Profiling | Tidak | Ya |
| Tracing eksekusi | Tidak | Ya |
| Overhead saat tidak aktif | ~4% | ~324% |
| Kompatibilitas DBGp | Penuh | Penuh |
Konfigurasi xdebug.* | Didukung | Native |
Ekstensi ini masih dalam tahap awal pengembangan, tapi sudah fungsional untuk debugging sehari-hari. Proyek ini dilisensikan dengan The Xdebug License versi 1.03.
Instalasi PHP Debugger
PHP Debugger mendukung PHP 8.2, 8.3, 8.4, dan 8.5. Untuk sekarang, instalasi dilakukan secara manual dengan mengunduh binary dari halaman Releases.
Instalasi Manual di Linux
Unduh file .so yang sesuai dengan versi PHP yang digunakan, lalu salin ke direktori ekstensi PHP.
# Cek versi PHP dan direktori ekstensi
php -r "echo ini_get('extension_dir');"
Output-nya akan menunjukkan path seperti /usr/lib/php/20230831. Salin file binary ke direktori tersebut:
# Contoh untuk PHP 8.3 di Debian/Ubuntu
sudo cp php_debugger-php8.3-linux-x86_64.so /usr/lib/php/20230831/php_debugger.so
Setelah itu, tambahkan baris berikut ke file php.ini aktif. Gunakan php --ini untuk menemukan path file konfigurasi yang tepat.
; php.ini
zend_extension=php_debugger.so
Verifikasi bahwa ekstensi berhasil dimuat:
php -m | grep debugger
Konfigurasi di php.ini
PHP Debugger mendukung dua prefix konfigurasi: php_debugger.* (native) dan xdebug.* (kompatibilitas). Ini memungkinkan kita menggunakan ulang konfigurasi Xdebug yang sudah ada tanpa perubahan apapun.
; php.ini — konfigurasi untuk debugging on-demand
php_debugger.mode = debug
php_debugger.client_host = 127.0.0.1
php_debugger.client_port = 9003
php_debugger.start_with_request = trigger
Opsi start_with_request = trigger berarti debugger hanya aktif saat ada request yang menyertakan cookie XDEBUG_SESSION atau query parameter XDEBUG_SESSION_START. Ini penting untuk menjaga overhead tetap minimal di luar sesi debugging.
Jika sebelumnya sudah pakai Xdebug, konfigurasi xdebug.* di php.ini langsung terbaca oleh PHP Debugger. Tidak perlu mengubah baris konfigurasi yang sudah ada.
Menggunakan PHP Debugger dengan VS Code
Untuk VS Code, kita butuh ekstensi PHP Debug dari Xdebug. Ekstensi ini berbicara via protokol DBGp, sehingga bekerja dengan PHP Debugger tanpa perubahan apapun.
Buat file konfigurasi launch di dalam proyek:
// .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug PHP",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": {
"/var/www/html": "${workspaceFolder}"
}
}
]
}
Blok pathMappings diperlukan jika kode berjalan di dalam container Docker — pastikan path di sisi kiri sesuai dengan path di dalam container.
Untuk memulai sesi debugging, jalankan request dengan header atau cookie yang tepat. Ekstensi browser Xdebug Helper untuk Chrome bekerja tanpa perubahan konfigurasi.
Menggunakan PHP Debugger dengan PhpStorm
PhpStorm mendukung DBGp secara native. Konfigurasi server debugging di Settings > PHP > Debug. Pastikan port sesuai dengan yang ada di php.ini (default: 9003).
Fungsi xdebug_break() juga didukung — jadi kode seperti ini tetap bekerja tanpa modifikasi:
<?php
// src/Services/ArticleService.php
function buildArticleSlug(string $title, string $date): string
{
$normalized = strtolower(trim($title));
$slug = preg_replace('/[^a-z0-9]+/', '-', $normalized);
xdebug_break(); // breakpoint programatik
return $date . '-' . trim($slug, '-');
}
Saat xdebug_break() tercapai dalam sesi debugging aktif, eksekusi akan berhenti dan kontrol diserahkan ke IDE — persis seperti yang diharapkan dari Xdebug biasa.
Perbedaan Mendasar dengan Xdebug
Hal paling penting untuk dipahami sebelum beralih adalah batasan PHP Debugger. Proyek ini secara eksplisit tidak menyediakan:
- Code coverage —
xdebug_start_code_coverage()dan sejenisnya tidak tersedia. Jika test suite menggunakan coverage reporting (misalnya via PHPUnit dengan--coverage-html), Xdebug masih dibutuhkan. - Profiling — Tidak ada output Cachegrind atau format lainnya.
- Tracing — Fitur
XDEBUG_TRACEtidak diimplementasikan.
Untuk proyek Laravel yang hanya butuh breakpoint saat development, ini bukan masalah. Tapi jika workflow mencakup php artisan test --coverage, Xdebug tetap menjadi pilihan yang tidak tergantikan — setidaknya untuk saat ini.
Kesimpulan
PHP Debugger menawarkan trade-off yang jelas: buang fitur yang jarang digunakan, dapatkan overhead yang jauh lebih kecil. Bagi developer yang menghabiskan sebagian besar waktu di step debugging tanpa butuh coverage atau profiling, perpindahan ini hampir bebas risiko — konfigurasi lama tetap bekerja, IDE tidak perlu dikonfigurasi ulang. Proyek ini masih aktif dikembangkan dan layak untuk dicoba di environment development lokalmu, terutama jika selama ini merasakan Xdebug membuat workflow terasa berat.