- Konu sahibi
- #1
PHP debug işlemi, sorunun hangi aşamada oluştuğunu görünür hâle getirip değeri, akışı ve hata kaydını kontrol ederek yapılır. Geliştirme ortamında
Sorunlu kodun başına, yalnızca geliştirme ortamında çalışacak şekilde şu ayarları ekleyin:
Bu satırlara ulaşan çalışma zamanı uyarıları ve hataları görünür olabilir. Aynı dosya ayrıştırılamıyorsa içindeki ini_set satırı hiç çalışmaz; startup hatası da betik başlamadan oluşabilir. Önce sözdizimini php -l debug.php ile kontrol edin. Geliştirme için görüntüleme ayarlarını süreç başlamadan php.ini veya CLI -d seçenekleriyle vermek gerekebilir. Üretimde
Bir değişkenin beklenen değeri taşıyıp taşımadığını görmek için
Birden fazla adım varsa her kontrol noktasına ayırt edilebilir bir çıktı ekleyin:
Son gördüğünüz işaret, akışın hangi noktaya kadar geldiğini gösterir. Ancak
Aşağıdaki örnek, ürün toplamını hesaplar ve geçersiz veri geldiğinde anlamlı bir istisna üretir:
Dosyayı örneğin
Yukarıdaki tablo ilk teşhisi ayırır; hata türüne göre ilgili kayıt ve çalışma ortamına dönün.
Tablodaki satır numarası tek başına çözüm değildir; hata mesajının türü ve çağrı zinciri birlikte okunmalıdır. Üretimde ziyaretçiye yalnızca genel hata gösterip ayrıntıyı loga yazın.
error_reporting(E_ALL) ile hataları açın, geçici olarak var_dump() veya print_r() kullanın; üretim ortamında hatayı ekrana basmak yerine log dosyasını inceleyin. Daha karmaşık akışlarda Xdebug ile breakpoint kullanmak, kodu durdurup değişkenleri adım adım izlemek için daha uygundur.Önce hata görünürlüğünü açın
Sorunlu kodun başına, yalnızca geliştirme ortamında çalışacak şekilde şu ayarları ekleyin:
Kod:
<?php
declare(strict_types=1);
error_reporting(E_ALL);
ini_set('display_errors', '1');
Bu satırlara ulaşan çalışma zamanı uyarıları ve hataları görünür olabilir. Aynı dosya ayrıştırılamıyorsa içindeki ini_set satırı hiç çalışmaz; startup hatası da betik başlamadan oluşabilir. Önce sözdizimini php -l debug.php ile kontrol edin. Geliştirme için görüntüleme ayarlarını süreç başlamadan php.ini veya CLI -d seçenekleriyle vermek gerekebilir. Üretimde
display_errors açık bırakılırsa dosya yolları, sorgular veya hassas uygulama ayrıntıları ziyaretçiye görünebilir; bunun yerine hata loglama kullanılmalıdır.Değeri ve akışı kontrol edin
Bir değişkenin beklenen değeri taşıyıp taşımadığını görmek için
var_dump() kullanın. Tür bilgisi de gösterildiği için özellikle "10" ile 10 arasındaki farkları bulmakta yararlıdır.
Kod:
var_dump($kullanici);
var_dump($kullanici['email'] ?? null);
Birden fazla adım varsa her kontrol noktasına ayırt edilebilir bir çıktı ekleyin:
Kod:
echo "1: veri alındı\n";
var_dump($veri);
echo "2: doğrulama başladı\n";
echo "3: kayıt işlemi başladı\n";
Son gördüğünüz işaret, akışın hangi noktaya kadar geldiğini gösterir. Ancak
var_dump() çıktısını HTML cevabına eklemek yerine gerektiğinde loga yazmak daha güvenlidir.| Belirti | İlk kontrol | Sonraki adım |
|---|---|---|
| Parse error | Hata satırından önceki parantez, tırnak ve noktalı virgül | En son değişen satırı ve bir önceki bloğu düzeltin |
| Undefined variable veya array key | Değişkenin atanmadan kullanılıp kullanılmadığı | Varsayılan değer veya açık giriş doğrulaması ekleyin |
| TypeError | Fonksiyon imzası ile gönderilen değerin türü | Kaynağı düzeltin; rastgele tür dönüşümü yapmayın |
| Yanlış sonuç | Ara değerleri var_dump() ile karşılaştırma | Girdiyi, koşulu ve döngü sınırını ayrı ayrı test edin |
| 500 Internal Server Error | Sunucu/PHP hata logu | Ekrandaki genel mesaj yerine gerçek istisnayı logdan bulun |
Çalıştırılabilir en küçük örnek
Aşağıdaki örnek, ürün toplamını hesaplar ve geçersiz veri geldiğinde anlamlı bir istisna üretir:
Kod:
<?php
declare(strict_types=1);
error_reporting(E_ALL);
ini_set('display_errors', '1');
function toplam(array $urunler): float
{
$sonuc = 0.0;
foreach ($urunler as $urun) {
if (!isset($urun['fiyat'], $urun['adet']) ||
!is_numeric($urun['fiyat']) ||
!is_numeric($urun['adet'])) {
throw new InvalidArgumentException('fiyat ve adet sayısal olmalıdır.');
}
$sonuc += (float) $urun['fiyat'] * (float) $urun['adet'];
}
return $sonuc;
}
$urunler = [
['fiyat' => 25, 'adet' => 2],
['fiyat' => 10, 'adet' => 3],
];
try {
var_dump($urunler);
echo 'Toplam: ' . toplam($urunler) . PHP_EOL;
} catch (Throwable $e) {
echo 'Hata: ' . $e->getMessage() . PHP_EOL;
error_log((string) $e);
}
Dosyayı örneğin
debug.php adıyla kaydedip komut satırında php debug.php çalıştırın. Başarılı sonuçta dizi dökümü ve Toplam: 80 çıktısını görürsünüz. adet değerlerinden birini "iki" yaparsanız istisna yakalanır; bu, hesabın yanlış sonuç üretmek yerine girdinin doğrulanması aşamasında durduğunu gösterir. Hata görürseniz önce satır numarasını, ardından çağrı zincirini ve hatanın beklenmeyen veri mi yoksa kod akışı mı kaynaklı olduğunu inceleyin.Hata türüne göre doğru yaklaşım
Yukarıdaki tablo ilk teşhisi ayırır; hata türüne göre ilgili kayıt ve çalışma ortamına dönün.
Tablodaki satır numarası tek başına çözüm değildir; hata mesajının türü ve çağrı zinciri birlikte okunmalıdır. Üretimde ziyaretçiye yalnızca genel hata gösterip ayrıntıyı loga yazın.
Breakpoint ile adım adım inceleme
var_dump() yeterli olmadığında Xdebug ve IDE entegrasyonu kullanılır. İlgili fonksiyona breakpoint koyun, isteği çalıştırın ve kod durduğunda değişkenleri, çağrı yığınını ve bir sonraki satırın etkisini inceleyin. Breakpoint çalışmıyorsa önce Xdebug'un PHP sürecine yüklendiğini, IDE'nin doğru portta dinlediğini ve web isteğinin gerçekten aynı PHP çalışma ortamına ulaştığını kontrol edin. Komut satırındaki PHP ile web sunucusunun kullandığı PHP yapılandırması farklı olabilir.Sık yapılan hatalar
- Üretimde display_errors açık bırakmak: Ayrıntıları kullanıcıya sızdırabilir; geliştirme ve üretim ayarlarını ayırın.
- Her yere var_dump eklemek: Akışı karıştırır. Önce sorunu daraltın, sonra birkaç kontrol noktasına geçici çıktı koyun.
- Hata mesajının yalnız son satırını okumak: Çağrı yığınındaki ilk uygulama dosyası genellikle asıl yanlış kullanımı bulmak için daha değerlidir.
- Tür sorununu sessizce dönüştürmek: Her değeri string veya sayıya çevirmek hatayı gizleyebilir. Önce girdinin neden yanlış geldiğini bulun.
- Logu kontrol etmeden 500 hatasını uygulama hatası sanmak: PHP, web sunucusu ve uygulama loglarını ayırarak inceleyin.