Arkadaşlar, bugün başkasının PHP kodunu kurcalayan herkesi deliye döndüren bir şey hakkında konuşacağız. Bir web sitesi açarsınız ve hiçbir şey yoktur. Boş bir ekran. Ne bir hata, ne de neyin yanlış gittiğine dair bir ipucu.

Tanıdık geliyor mu?

Bu, PHP ölümcül hatasının klasik bir örneğidir; sadece betiği öldürür ve vedalaşmadan ortadan kaybolur. Bugün, PHP'yi nasıl konuşturacağımızı, günlükleri nasıl etkinleştireceğimizi ve "Beyaz Ölüm Ekranı"nın arkasında saklanan ölümcül hataları nasıl bulacağımızı öğreneceğiz.

PHP Neden Sessiz Kalır: Biraz Teori

Öncelikle, PHP'nin genel olarak hataları nasıl ele aldığını anlayalım. Bu sadece "hata -> günlük" değildir. Bütün bir hiyerarşi vardır.

PHP 7+'da, yanlış gidebilecek her şey Throwable arayüzünü uygular. Bunun iki ana mirasçısı vardır: - Error — PHP iç hataları (ölümcül, ayrıştırma, tür hataları) - Exception — try-catch ile yakalanabilen istisnalar

Ölümcül hatalar (E_ERROR, E_PARSE, E_CORE_ERROR) her geliştiricinin en büyük kabusudur. Betiği anında öldürürler ve set_error_handler() aracılığıyla standart işleyiciler bunları yakalayamaz . Ölümcül bir hatayı engellemenin tek yolu register_shutdown_function() kullanmaktır.

Ama adım adım ilerleyelim. Öncelikle, hataların gerçekten bir yere yazılması için günlük kaydını etkinleştirmemiz gerekiyor.

Adım 1: php.ini Üzerinden Günlük Kaydını Etkinleştirme

Günlükleri yapılandırmanın en doğru yolu PHP yapılandırma dosyasını düzenlemektir. Nerede olduğu sisteminize bağlıdır :

| Sistem | php.ini yolu | |---------|--------------| | Ubuntu/Debian (Apache) | /etc/php/7.x/apache2/php.ini | | Ubuntu/Debian (CLI) | /etc/php/7.x/cli/php.ini | | Ubuntu/Debian (PHP-FPM) | /etc/php/7.x/fpm/php.ini | | CentOS/RHEL | /etc/php.ini veya /etc/php.d/ | | Windows (XAMPP) | C:\xampp\php\php.ini | | Windows (WAMP) | C:\wamp\bin\php\phpX.X.X\php.ini |

Bu dosyada, aşağıdaki yönergelerle ilgileniyoruz :

```ini ; Hataları bir günlük dosyasına yazmayı etkinleştir (zorunlu!) log_errors = On

; Günlük dosyasının yolunu belirt error_log = /var/log/php_errors.log

; Hataların ekranda görüntülenmesini devre dışı bırak (prodüksiyon için!) display_errors = Off

; Geliştirme için bunu etkinleştirebilirsiniz, ancak daha sonra devre dışı bırakın display_startup_errors = Off

; Hata raporlama seviyesi — tüm hatalar error_reporting = E_ALL ```

Önemli: Komut satırı arayüzü (CLI) kendi php.ini dosyasını kullanır ve günlükler farklı bir konuma yazılabilir . Konsolda bir betiği test ediyorsanız, ayrıca kontrol edin.

Değişiklikleri yaptıktan sonra web sunucusunu yeniden başlatmanız gerekir : bash sudo systemctl restart apache2 # Apache için sudo systemctl restart php7.4-fpm # PHP-FPM için

Bu Ayarlar Ne Anlama Geliyor

  • log_errors = On — hataların bir dosyaya yazılmasını etkinleştirir. Bu olmadan PHP bir mezar gibi sessiz kalır .
  • error_log — her şeyin yazılacağı dosyanın yolu. Web sunucusu kullanıcısının (genellikle www-data veya apache) bu dosya ve dizini için yazma izinlerine sahip olması çok önemlidir .
  • display_errors = Off — kullanıcılara ayrıntıları ifşa etmemek için prodüksiyonda bunu kesinlikle devre dışı bırakın .
  • error_reporting = E_ALL — tüm hata türlerini kaydedin. Prodüksiyon için bunu sınırlayabilirsiniz, ancak hata ayıklama için her şeyi görmek daha iyidir.

Adım 2: Alternatif: Doğrudan Kodda Günlük Kaydını Etkinleştirme

php.ini'ye erişiminiz yoksa (örneğin, paylaşımlı hostingde), ini_set() işlevini kullanarak doğrudan betiğinizde günlük kaydını etkinleştirmeyi deneyebilirsiniz.

Bunu sorunlu dosyanın en başına ekleyin:

```php

/dev/null ``` Veya `phpinfo();` içeren bir PHP dosyası oluşturun ve **error_log** bölümünü arayın. ## Adım 4: Günlükleri Okuma: Araçlar ve Teknikler Günlükler yazıldıktan sonra, bunları hızlıca nasıl görüntüleyeceğinizi ve filtreleyeceğinizi bilmeniz gerekir. ### tail — Son Olayları Görüntüleme ```bash # Son 50 satır tail -n 50 /var/log/php_errors.log # Gerçek zamanlı olarak takip et (docker logs -f gibi) tail -f /var/log/php_errors.log ``` ### grep — Belirli Hataları Arama ```bash # Sadece ölümcül hatalar grep "Fatal error" /var/log/php_errors.log # Ayrıştırma hataları (sözdizimi hataları) grep "Parse error" /var/log/php_errors.log # Büyük/küçük harf duyarlılığını yoksay grep -i "warning" /var/log/php_errors.log ``` ### less — Gezinmeli Kullanışlı Görüntüleme ```bash less /var/log/php_errors.log ``` less içinde, arama yapmak için `/` tuşuna basıp bir kelime yazabilir, sonraki eşleşme için `n`, önceki için `N` tuşlayabilirsiniz. ### Kombinasyonlar — Güçlü Bir Ardışık Düzen ```bash # Son 100 satırı göster ve hata ara tail -n 100 /var/log/php_errors.log | grep -i fatal # Gerçek zamanlı takip et ve filtrele tail -f /var/log/php_errors.log | grep --line-buffered "error" # Hataları türe göre say grep -o "PHP [A-Za-z]* error" /var/log/php_errors.log | sort | uniq -c ``` ## Adım 5: Hataları Deşifre Etme: Nedir Ne Tipik bir günlük girişi şöyle görünür : ``` [2026-03-04 14:35:22 UTC] PHP Fatal error: Uncaught Error: Call to undefined function foo() in /var/www/html/index.php on line 10 ``` Hadi parçalayalım: - **Tarih ve Saat** — ne zaman olduğu - **PHP Fatal error** — hata seviyesi - **Uncaught Error: Call to undefined function foo()** — mesaj - **/var/www/html/index.php:10** — dosya ve satır numarası Ana hata seviyeleri : | Seviye | Anlamı | Örnek | |--------|--------|-------| | **E_ERROR** / **Fatal error** | Ölümcül hata, betik ölür | Var olmayan bir işlevi çağırmak, bellek yetersiz | | **E_WARNING** / **Warning** | Uyarı, ancak betik devam eder | Var olmayan bir dosyayı `include` etmek | | **E_PARSE** / **Parse error** | Sözdizimi hatası, betik çalışmaz | Eksik noktalı virgül | | **E_NOTICE** / **Notice** | Bildirim, genellikle kritik değil | Tanımlanmamış bir değişkene erişim | | **E_DEPRECATED** | Kullanımdan kaldırılmış yapı | `mysql_connect()` kullanımı | ## Adım 6: Ölümcül Hataları Yakalama (İlginç Kısım) Ölümcül hatalar, standart `set_error_handler()` tarafından yakalanamayanlardır. Betiği anında öldürürler ve varsayılan işleyicinin çalışmak için zamanı yoktur . Ama bir yol var! `register_shutdown_function()` kullanın — bu işlev, ölümcül bir hata durumunda bile her durumda çağrılır. ### Basit Ölümcül Hata İşleyicisi ```php getMessage()." | ".$e->getFile().":".$e->getLine()." | $url\n"; file_put_contents($logFile, $msg, FILE_APPEND); }); // Ölümcül hatalar için işleyici register_shutdown_function(function() use ($logFile) { $error = error_get_last(); if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) { $url = ($_SERVER['HTTP_HOST'] ?? 'CLI') . ($_SERVER['REQUEST_URI'] ?? ''); $msg = "[".date('Y-m-d H:i:s')."] [FATAL] ".$error['message']." | ".$error['file'].":".$error['line']." | $url\n"; file_put_contents($logFile, $msg, FILE_APPEND); } }); ``` Bu kodu ana dosyanızın (örneğin, `index.php` veya `header.php`) en başına ekleyebilirsiniz ve kesinlikle her şeyi yakalayacaktır . ## Adım 7: Popüler Çerçevelerde Günlükler Modern bir çerçeve kullanıyorsanız, günlük kaydı zaten ayarlanmıştır, ancak günlük yolları farklıdır. ### Laravel Günlükler `storage/logs/laravel.log` konumunda saklanır. Varsayılan olarak Monolog kullanır; biçim metin veya JSON olabilir. Hataları görmek için: ```bash tail -f storage/logs/laravel.log ``` ### Symfony Varsayılan günlükler: `var/log/dev.log` ve `var/log/prod.log`. Ayrıca Monolog kullanır, son derece yapılandırılabilir. ### WordPress Varsayılan olarak WordPress günlük yazmaz, ancak bunları `wp-config.php` dosyasına şunu ekleyerek etkinleştirebilirsiniz: ```php define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false); ``` Günlükler `/wp-content/debug.log` içinde olacaktır. ## Adım 8: Yaygın Sorunlar ve Çözümleri ### Sorun: Günlükler hiç yazılmıyor Kontrol edilecekler: 1. `log_errors = On` kesinlikle ayarlandı mı? 2. Dosya ve dizini için yazma izinleri var mı? 3. Doğru php.ini dosyasını düzenlediniz mi (`phpinfo()` ile kontrol edin)? 4. Değişikliklerden sonra web sunucusunu yeniden başlattınız mı? ### Sorun: Ölümcül hatalar yakalanmıyor Günlük kaydı etkin olsa bile, ölümcül hatalar çok erken meydana gelirse (örneğin, günlük kaydını etkinleştirdiğiniz dosyanın kendisinde bir ayrıştırma hatası) bazen yazılmazlar. Tek çözüm doğru yerleştirmedir — her şeyden önce, en başta . ### Sorun: Çok fazla günlük Prodüksiyonda `E_ALL` etkinleştirilirse, günlükler hızla büyüyecektir. `error_reporting`'i mantıklı bir şekilde yapılandırın : ```ini error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE ``` ### Sorun: Günlükler diski dolduruyor `logrotate` ile günlük döndürmeyi ayarlayın. PHP günlükleri için bir yapılandırma: ``` /var/log/php_errors.log { daily rotate 30 compress delaycompress missingok notifempty create 644 www-data www-data } ``` ## Adım 9: Pratik Örnek: Boş Bir Sayfayı Araştırma Bir durum hayal edin: bir web sitesi açıyorsunuz ve bembeyaz. Adım adım ne yapmalı? 1. **Web sunucusu günlüklerini kontrol edin** (Apache/Nginx) — genellikle bir ipucu içerirler 2. **PHP günlüklerini kontrol edin** — son birkaç dakikanın girişlerini arayın ```bash tail -n 50 /var/log/php_errors.log | grep -A5 -B5 "$(date +%Y-%m-%d)" ``` 3. **Hatayı bulun** : ``` [2026-03-04 15:30:22] PHP Fatal error: Uncaught Error: Class 'DB' not found in /var/www/site/index.php on line 12 ``` 4. **Dosyayı açın**, 12. satırı kontrol edin — gerçekten de, sınıfı eklemeyi unutmuşsunuz. 5. **Düzeltin**, test edin — site çalışıyor! Sihir! ## Hızlı Başvuru: Kopya Kağıdı | Eylem | Komut / Kod | |-------|-------------| | php.ini'de günlük kaydını etkinleştir | `log_errors = On` + `error_log = /dosya/yolu` | | Kodda etkinleştir | `ini_set('log_errors', 'On');` | | Son satırları görüntüle | `tail -f /var/log/php_errors.log` | | Ölümcül hataları ara | `grep "Fatal error" /var/log/php_errors.log` | | Ölümcül hataları yakala | `register_shutdown_function()` + `error_get_last()` | | Laravel günlükleri nerede? | `storage/logs/laravel.log` | | Symfony günlükleri nerede? | `var/log/dev.log` ve `var/log/prod.log` | ## Sonuç Yerine PHP, genellikle tasvir edildiği kadar korkutucu değildir. Evet, Beyaz Ölüm Ekranı korkunçtur, ancak arkasında her zaman sadece konuşmak istemeyen belirli bir hata vardır. Günlükleri etkinleştirmeyi öğrenin, PHP konuşmaya başlayacaktır. Ana kurallar: - Prodüksiyonda, **her zaman** `log_errors`'ı etkinleştirin ve `display_errors`'ı devre dışı bırakın - Günlükleri syslog'a değil, özel bir dosyaya yazın — araması daha kolaydır - Ölümcül hataları yakalamak için `register_shutdown_function` kullanın - Günlüklerinizi düzenli olarak kontrol edin — günde en az bir kez Ve unutmayın: mükemmel kod hata yazmaz. Ancak bir hata olursa, bari bir not bıraksın. ?>