Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
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 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 kontrolSonraki adım
Parse errorHata satırından önceki parantez, tırnak ve noktalı virgülEn son değişen satırı ve bir önceki bloğu düzeltin
Undefined variable veya array keyDeğişkenin atanmadan kullanılıp kullanılmadığıVarsayılan değer veya açık giriş doğrulaması ekleyin
TypeErrorFonksiyon 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ırmaGirdiyi, koşulu ve döngü sınırını ayrı ayrı test edin
500 Internal Server ErrorSunucu/PHP hata loguEkrandaki 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​


  1. Ü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.
  2. Her yere var_dump eklemek: Akışı karıştırır. Önce sorunu daraltın, sonra birkaç kontrol noktasına geçici çıktı koyun.
  3. 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.
  4. 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.
  5. Logu kontrol etmeden 500 hatasını uygulama hatası sanmak: PHP, web sunucusu ve uygulama loglarını ayırarak inceleyin.

Sık sorulan sorular​

php -l başarılıysa kod doğru çalışıyor demek midir?​

Hayır. Lint denetimi dosyayı çalıştırmadan sözdizimini inceler; veritabanı bağlantısı, eksik veri veya yanlış toplam gibi çalışma zamanı sorunlarını kanıtlamaz. Örnekte normal ve hatalı girdileri ayrıca karşılaştırın. Lint sırasında bir dosyanın başarılı görünmesi bütün bağımlı dosyaların kontrol edildiği anlamına da gelmez.

Xdebug açıkken breakpoint neden tetiklenmeyebilir?​

Step debugging modu ve isteği başlatan tetikleme koşulu etkin olmalıdır. IDE dinlemeli; Xdebug’ın IDE’ye doğru adres ve porttan bağlantı kurması gerekir. Konteyner veya uzak sistemde dosya yollarının eşlenmesi de önemlidir. CLI’de yüklü olması web PHP sürecinde de yüklü olduğunu kanıtlamaz.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.