PHP'de Hata Ayıklama, Günlükleme ve Performans Ölçümü

PHP'de Hata Ayıklama, Günlükleme ve Performans Ölçümü

5 dakika okuma

Hata ayıklama ve performans çalışmasının ortak yanı, ikisinin de ölçüme dayanmasıdır. Değişkenin değerini görmeden yapılan tahminler gibi, sürenin nerede harcandığını bilmeden yapılan iyileştirmeler de çoğunlukla yanlış yere yapılır. Bu bölümde her iki iş için kullanılan araçlar ele alınıyor.

Ekrana değişken basmak en hızlı yöntem gibi görünür, ancak akışı takip etmek gerektiğinde yetersiz kalır ve unutulan satırlar üretime sızar. Adım adım çalışan bir hata ayıklayıcı, aynı bilgiyi koda dokunmadan verir.

Hata ayıklayıcı

Xdebug, çalışmayı istenen satırda durdurup değişkenleri incelemeye ve adım adım ilerlemeye izin verir. Kurulumdan sonra düzenleyicinin dinlediği kapıya bağlanacak biçimde yapılandırılır.

INI6 satır
; php.ini - yalnızca geliştirme ortamı
zend_extension=xdebug
xdebug.mode=debug,develop
xdebug.start_with_request=trigger
xdebug.client_port=9003
xdebug.max_nesting_level=512

Tetikleyici kipinde hata ayıklayıcı yalnızca istekle birlikte özel bir parametre gönderildiğinde devreye girer. Bu, geliştirme ortamında sürekli açık kalmasının getirdiği yavaşlamayı önler. Üretim sunucusunda eklenti hiç yüklenmez; yükleme kipi açıkken çalışma hızı belirgin biçimde düşer.

Basit incelemelerde de çıktı biçimi önemlidir. Değişkenin tipini ve yapısını birlikte gösteren dökümler, yalnızca değeri basan işlevlerden daha kullanışlıdır.

PHP3 satır
var_dump($veri);                          // tip bilgisiyle
echo var_export($veri, return: true);      // yeniden kullanılabilir PHP ifadesi olarak
error_log(print_r($veri, true));           // ekrana değil günlüğe

Günlük kaydı

Günlükler, üretimde neyin olduğunu anlamanın tek yoludur. Serbest metin yerine yapılandırılmış kayıt kullanmak, sonradan arama ve süzme yapılmasını sağlar. Her satırın tek başına anlamlı olması gerekir.

PHP22 satır
final class Gunluk
{
    public function __construct(private readonly string $dosya) {}

    public function yaz(string $seviye, string $mesaj, array $baglam = []): void
    {
        $satir = json_encode([
            'an' => (new DateTimeImmutable('now', new DateTimeZone('UTC')))->format(DATE_ATOM),
            'seviye' => $seviye,
            'mesaj' => $mesaj,
            'baglam' => $baglam,
        ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

        file_put_contents($this->dosya, $satir . PHP_EOL, FILE_APPEND | LOCK_EX);
    }
}

$gunluk->yaz('error', 'Ödeme alınamadı', [
    'siparis_id' => $siparis->id,
    'saglayici' => 'sanalpos',
    'izleme' => $izlemeNo,
]);

Kayıt satırına bağlam eklenmesi, sonradan yapılacak incelemenin tamamını belirler. Yalnızca hata mesajı yazan bir kayıt, hangi kullanıcının hangi kaynakta sorun yaşadığını göstermez. İstek kimliği, kullanıcı kimliği ve ilgili kaydın numarası, aramayı saniyeler içinde sonuca ulaştırır.

Seviyeler ayrımı önemlidir: hata ayıklama kayıtları üretimde kapatılır, uyarı ve hata kayıtları açık kalır. Her şeyin aynı seviyeye yazıldığı bir dosyada gerçek sorunlar kaybolur.

Günlüklere kişisel veri, parola ve belirteç yazılmaz. Kayıt tutan kod bu alanları maskelemeli, günlük dosyaları da web kökünün dışında tutulmalıdır.

Süre ve bellek ölçümü

Ölçüm yapılmadan önce neyin ölçüleceği belirlenir. Toplam istek süresi, veritabanında geçen süre, dış servis çağrılarında geçen süre ve tepe bellek kullanımı temel göstergelerdir.

PHP12 satır
$basla = hrtime(true);

$sonuc = agirIslem();

$sureMs = (hrtime(true) - $basla) / 1_000_000;
$bellekMb = memory_get_peak_usage(true) / 1024 / 1024;

$gunluk->yaz('info', 'Ölçüm', [
    'sure_ms' => round($sureMs, 2),
    'tepe_bellek_mb' => round($bellekMb, 1),
    'sorgu_sayisi' => $sayac->toplam(),
]);

Tek bir ölçüm yanıltıcı olabilir. İlk çalıştırma önbelleklerin boş olması nedeniyle yavaştır; ölçüm birkaç kez tekrarlanıp ortanca değere bakılmalıdır. Geliştirme makinesindeki sonuçların üretim sunucusunda birebir tekrarlanmasını beklemek de doğru değildir.

Darboğazı bulmak

Uygulamaların büyük bölümünde süre, PHP kodunun kendisinde değil beklemede harcanır: veritabanı sorguları, dış servis çağrıları, dosya erişimi. Bu yüzden ilk bakılacak yer sorgu sayısı ve sorgu süreleridir.

  • İstek başına çalışan sorgu sayısı sayılıyor mu?
  • Liste sayfalarında satır başına ek sorgu var mı?
  • Yavaş sorgular veritabanı tarafında kaydediliyor mu?
  • Dış servis çağrıları eş zamanlı mı, art arda mı yapılıyor?
  • Aynı hesaplama aynı istek içinde birden fazla kez yapılıyor mu?

Bellek kullanımı da benzer biçimde ele alınır. Tüm sonuç kümesini belleğe alan sorgular, kayıt sayısı arttıkça sınırı zorlar ve süreç beklenmedik biçimde sonlanır. Üreteç kullanımı ya da satır satır okuma, bu tür işlerde bellek kullanımını sabit tutar.

Profil çıkarma araçları, süreyi fonksiyon bazında dağıtarak gösterir. Xdebug bu amaçla profil kipinde çalıştırılabilir; üretim ortamında ise örnekleme yöntemiyle çalışan, ek yükü düşük araçlar tercih edilir.

Sorguları saymak

Sorgu sayısının izlenmesi, en ucuz ve en çok işe yarayan ölçümdür. Bağlantı sınıfının etrafına konan ince bir sarmalayıcı, istek başına düşen sorgu sayısını ve toplam süreyi kaydeder.

PHP26 satır
final class SayanBaglanti
{
    private int $adet = 0;
    private float $toplamMs = 0.0;

    public function __construct(private readonly PDO $pdo) {}

    public function calistir(string $sql, array $parametre = []): array
    {
        $basla = hrtime(true);

        $sorgu = $this->pdo->prepare($sql);
        $sorgu->execute($parametre);
        $satirlar = $sorgu->fetchAll();

        $this->adet++;
        $this->toplamMs += (hrtime(true) - $basla) / 1_000_000;

        return $satirlar;
    }

    public function ozet(): array
    {
        return ['adet' => $this->adet, 'sure_ms' => round($this->toplamMs, 2)];
    }
}

Geliştirme ortamında bu özetin sayfa altına yazılması, sorgu sayısının artışını anında görünür kılar. Belirli bir eşiğin aşılması durumunda uyarı üretilmesi, sorunun üretime taşınmasını önler.

Yapılandırma kaynaklı kazanç

Kod değiştirmeden elde edilebilecek en büyük kazanç, derlenmiş kodun önbelleğe alınmasıdır. Bu önbellek kapalıyken her istekte tüm dosyalar yeniden ayrıştırılır.

INI5 satır
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0     ; üretimde: dağıtımda önbellek temizlenir
opcache.jit_buffer_size=0         ; web isteklerinde kazancı sınırlıdır

Zaman damgası denetiminin kapatılması, her istekte dosyaların değişip değişmediğine bakılmasını engeller. Bu ayar açıkken yeni sürüm yayına alındığında önbelleğin temizlenmesi gerekir; dağıtım akışına bu adım eklenmelidir.

Kontrol listesi

  • Geliştirmede hata ayıklayıcı tetikleyici kipinde kurulu, üretimde yüklü değil.
  • Günlükler yapılandırılmış biçimde ve seviye ayrımıyla yazılıyor.
  • Günlüklerde gizli veri maskeleniyor, dosyalar web kökü dışında.
  • İstek başına sorgu sayısı ve süre ölçülüyor.
  • İyileştirme kararları ölçüme dayanıyor, tahmine değil.
  • Üretimde opcache açık ve dağıtımda temizleniyor.

İlgili yazılar

PHP eğitim serisi

Bu yazı, temel sözdiziminden üretim ortamına kadar ilerleyen 25 bölümlük serinin bir parçası. Bölümler sırayla okunacak biçimde hazırlandı, ancak her biri tek başına da kullanılabilir.

Temeller

  1. Kurulum ve temel sözdizimi
  2. Döngüler ve akış kontrolü
  3. Diziler
  4. Fonksiyonlar
  5. String fonksiyonları
  6. Süper globaller
  7. Form işleme
  8. Dosya işlemleri

Dilin ayrıntıları

  1. Tip sistemi ve strict_types
  2. Hata ve istisna yönetimi
  3. Düzenli ifadeler
  4. Tarih ve saat işlemleri

Nesne yönelimli PHP

  1. Sınıf ve nesne
  2. Kalıtım, arayüz ve trait
  3. Statik üyeler, sabitler ve enum
  4. Namespace, Composer ve autoload

Veri ve güvenlik

  1. PDO ile veritabanı işlemleri
  2. Oturum yönetimi ve kimlik doğrulama
  3. Güvenli çıktı ve XSS
  4. JSON ile veri değişimi

Dış dünya ve üretim

  1. cURL ile dış API çağırma
  2. Kendi REST API'ni yazmak
  3. PHPUnit ile birim test
  4. Hata ayıklama ve performans ölçümü (bu yazı)
  5. Üretime alma ve güvenlik

Yorumlar

Bu form reCAPTCHA ile korunur; Google Gizlilik Politikası ve Hizmet Şartları geçerlidir.

İlk yorumu sen yap.

İlgili Yazılar