PHP Hata İşleme
- Önceki Sayfa PHP Güvenli E-posta
- Sonraki Sayfa PHP Exception
PHP'te, varsayılan hata işleme oldukça basittir. Bir mesaj tarayıcıya gönderilir, bu mesaj dosya adı, satır numarası ve hata mesajını içerir.
PHP Hata İşleme
Betik ve web uygulaması oluştururken, hata işleme önemli bir parçadır. Kodunuzda hata tespit kodu yoksa, program çok profesyonel görünmez ve güvenlik riskleri açığa çıkar.
Bu ders, PHP'de en önemli hata tespit yöntemlerini tanıtmaktadır.
Farklı hata işleme yöntemlerini anlatacağız:
- Basit "die()" ifadesi
- Özel hatalar ve hata tetikleyicileri
- Hata raporu
Temel hata işleme: die() fonksiyonu kullanımı
Basit bir metin dosyasını açan bir örnekte
<?php $file=fopen("welcome.txt","r"); ?>
Dosya bulunmadığında, benzeri bir hata alırsınız:
Uyarı: fopen(welcome.txt) [function.fopen]: akışı açma hatası: Bu dosya veya dizin bulunamadı C:\webfolder\test.php satırda 2
Kullanıcıya yukarıdaki gibi bir hata mesajı almasını önlemek için, dosyayı erişmeden önce bu dosyanın var olup olmadığını sorguluyoruz:
<?php if(!file_exists("welcome.txt")) { die("Dosya bulunamadı"); } else { $file=fopen("welcome.txt","r"); } ?>
Şimdi, dosya bulunmadığında, benzeri bir hata mesajı alırsınız:
Dosya bulunamadı
Yukarıdaki kod, daha önceki koddan daha etkili, çünkü hata sonrasında betiği sonlandıran basit bir hata işleme mekanizması kullanır.
Ancak, basit bir şekilde betiği sonlandırmak her zaman uygun bir yol değildir. Hatanları işlemek için kullanılan alternatif PHP fonksiyonlarını inceleyelim.
Özel hata işleyici oluşturma
Özel bir hata işleyici oluşturmak çok basittir. PHP'de hata olduğunda bu fonksiyonu çağırabileceğimiz özel bir fonksiyon oluşturduk.
Bu fonksiyon, en az iki parametre (hata seviyesi ve hata mesajı) işlemek yeteneğine sahip olmalıdır, ancak en fazla beş parametre (isteğe bağlı: dosya, satır numarası ve hata bağlamı) kabul edebilir:
Dilbilgisi
error_function(error_level, error_message, error_file, error_line, error_context)
Parametre | Açıklama |
---|---|
error_level | Gerekli. Kullanıcı tanımlı hata belirlemek için hata raporlama seviyesini belirlemelisiniz. Bir değer dizisi olmalıdır. Aşağıdaki tabloya bakın: Hata raporlama seviyeleri. |
error_message | Gerekli. Kullanıcı tanımlı hata mesajlarını belirler. |
error_file | Opsiyonel. Hata meydana gelen dosya adını belirleyin. |
error_line | Opsiyonel. Hata meydana gelen satır numarasını belirleyin. |
error_context | Opsiyonel. Hata meydana geldiğinde kullanılan her değişkenin ve değerlerinin içerdiğini belirleyen bir dizin belirleyin. |
Hata Raporlama Seviyeleri
Bu hata raporlama seviyeleri, hata işleme programının işlemesi gereken hataların farklı türlerini işlemek içindir:
Değer | Sabit | Açıklama |
---|---|---|
2 | E_WARNING | Kritik olmayan çalışma zamanı hataları. Betik çalışmasını durdurmaz. |
8 | E_NOTICE | Çalışma zamanı bildirimleri. Betik, hata olabileceğini fark eder, ancak betikin normal çalıştığı bir zamanda da olabilir. |
256 | E_USER_ERROR | Kritik kullanıcı tarafından oluşturulan hatalar. Programcının PHP fonksiyonu trigger_error() kullanarak ayarladığı E_ERROR benzeridir. |
512 | E_USER_WARNING | Kritik olmayan kullanıcı tarafından oluşturulan uyarılar. Programcının PHP fonksiyonu trigger_error() kullanarak ayarladığı E_WARNING benzeridir. |
1024 | E_USER_NOTICE | Kullanıcı tarafından oluşturulan bildirimler. Programcının PHP fonksiyonu trigger_error() kullanarak ayarladığı E_NOTICE benzeridir. |
4096 | E_RECOVERABLE_ERROR | Kapılabilir kritik hatalar. E_ERROR benzeri, ancak kullanıcı tanımlı işleme programı tarafından yakalanabilir. (set_error_handler() bakınız) |
8191 | E_ALL | Tüm hatalar ve uyarılar, E_STRICT seviyesinden başka. (PHP 6.0'da E_STRICT, E_ALL'ın bir parçasıdır) |
Şimdi, bir hata işleme fonksiyonu oluşturalım:
function customError($errno, $errstr) { echo "<b>Hata:</b> [$errno] $errstr<br />"; echo "Script Bitti"; die(); }
Yukarıdaki kod, basit bir hata işleme fonksiyonudur. Tetiklendiğinde, hata seviyesini ve hata mesajını alır. Sonra hata seviyesini ve mesajı çıktıya verir ve betiki durdurur.
Şimdi, bir hata işleme fonksiyonu oluşturduğumuzu belirledik, bu fonksiyonun ne zaman tetikleneceğini belirlememiz gerekiyor.
Hata İşleyici Ayarla
PHP'nin varsayılan hata işleme programı, yerleşik hata işleme programıdır. Yukarıdaki fonksiyonu, betik çalışma süresi boyunca varsayılan hata işleme programı olarak değiştirmeyi planlıyoruz.
Hata işleme programını değiştirerek, bazı hatalara yalnızca uygulayabilirsiniz, böylece betik farklı hataları farklı şekilde işlemek için farklı yollar izleyebilir. Ancak, bu örnekte, tüm hatalar için kendi özelleştirilmiş hata işleme programımızı kullanmayı planlıyoruz:
set_error_handler("customError");
Çünkü kendi özelleştirilmiş fonksiyonlarımızın tüm hataları işlemesi için istediğimiz, set_error_handler() sadece bir parametre gerektirir, ikinci bir parametre ekleyerek hata seviyesini belirleyebilirsiniz.
Örnek
Bu hata işleyicisini test etmek için mevcutsuz değişkeni çıkarmak suretiyle:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Hata:</b> [$errno] $errstr"; } //set error handler set_error_handler("customError"); //trigger error echo($test); ?>
Yukarıdaki kodun çıktısı şu şekilde olmalıdır:
Hata: [8] Tanımlanmamış değişken: test
Hata Tetikleme
Kullanıcı girdi verildiği yerde scriptte hata tetiklemek için çok kullanışlıdır. PHP'de bu görevi trigger_error() yapar.
Örnek
Bu örnekte, "test" değişkeni "1"den büyükse hata meydana gelir:
<?php $test=2; if ($test>1) { trigger_error("Değer 1 veya altında olmalıdır"); } ?>
Yukarıdaki kodun çıktısı şu şekilde olmalıdır:
Uyarı: Değer 1 veya altında olmalıdır in C:\webfolder\test.php on line 6
Script'te herhangi bir yerde hata tetikleyebilirsiniz, ikinci parametre ekleyerek tetiklenen hatanın seviyesini belirleyebilirsiniz.
Olası Hata Türleri:
- E_USER_ERROR - Ölümcül kullanıcı tarafından oluşturulan çalışma zamanı hataları. Hata geri döndürülemez. Script çalışması kesintiye uğrar.
- E_USER_WARNING - Ölümcül olmayan kullanıcı tarafından oluşturulan çalışma zamanı uyarıları. Script çalışması kesintiye uğramaz.
- E_USER_NOTICE - Varsayılan. Kullanıcı tarafından oluşturulan çalışma zamanı bildirimleri. Script olası bir hatayı buldu veya scriptin normal çalıştığı zamanlarda da meydana gelebilir.
Örnek
Bu örnekte, "test" değişkeni "1"den büyükse E_USER_WARNING hatası oluşur. E_USER_WARNING meydana gelirse, özel hata işleyicimizi kullanacağız ve scripti sonlandıracağız:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Hata:</b> [$errno] $errstr<br />"; echo "Script Bitti"; die(); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("Değer 1 veya altında olmalıdır",E_USER_WARNING); } ?>
Yukarıdaki kodun çıktısı şu şekilde olmalıdır:
Hata: [512] Değer 1 veya altında olmalıdır Script Bitti
Şimdi, kendi hatalarımızı nasıl oluşturduğumuzu ve nasıl tetiklediğimizi öğrendik, şimdi hata kayıtlarını inceleyelim.
Hata Kayıtları
Varsayılan olarak, php.ini dosyasındaki error_log yapılandırmasına göre, PHP hata kayıtlarını sunucunun hata kayıt sistemine veya dosyasına gönderir. error_log() fonksiyonunu kullanarak, belirli bir dosya veya uzak hedefe hata kayıtlarını gönderebilirsiniz.
Hata mesajlarını kendinize E-Mail ile göndermek, belirli hatalar hakkında bilgi almanın iyi bir yolu olacaktır.
Hata mesajlarını E-Mail ile göndermek
Aşağıdaki örnekte, belirli bir hata meydana gelirse, hata mesajı içeren bir e-posta gönderir ve betiği sonlandırırız:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Hata:</b> [$errno] $errstr<br />"; echo "Webmaster haberdar edilmiştir"; error_log("Hata: [$errno] $errstr",1, "someone@example.com","From: webmaster@example.com"); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("Değer 1 veya altında olmalıdır",E_USER_WARNING); } ?>
Yukarıdaki kodun çıktısı şu şekilde olmalıdır:
Hata: [512] Değer 1 veya altında olmalıdır Webmaster haberdar edilmiştir
Yukarıdaki koddan gelen e-postalar şu şekilde benzer:
Hata: [512] Değer 1 veya altında olmalıdır
Bu yöntem tüm hatalar için uygun değil. Standart hatalar, sunucuda varsayılan PHP kayıt sistemini kullanarak kaydedilmelidir.
- Önceki Sayfa PHP Güvenli E-posta
- Sonraki Sayfa PHP Exception