PHP Hata İşleme

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.