PHP: Nasıl olur hataları oturum?

6 Cevap php

Örneğin, bazı API olsun ama başarısız, ya da bizim veritabanına bağlanmak için çalışın ama eğer da başarısız.

6 Cevap

Bu ile başa çıkmak için çeşitli yolları vardır:

Kullanıcı PHP Hata işleme olabilir. Bkz set_error_handler

php hata işleme zor ve dikkate alınması gereken pek çok nokta vardır. Php, biz hataları 3 tip var:

  • Tanımsız bir işlevi çağırırken gibi ölümcül hataları. Eğer onlar hakkında yapabileceği fazla bir şey yok. Onlar görünmez, böylece en azından, = 0 display_errors, php.ini = 1 log_errors'u ayarlayın. Daha da iyisi, bugs.php.net ve tamamen ölü var ortadan kaldırılması talep üzerine bir dilekçe yazabilirsiniz. Ölümcül hatalar böyle bir ayıp vardır!

  • "Normal" uyarılar ve bildirimler. Iyi görmek example #1, istisnalar dönüştürmek için

  • İstisnalar - komik bölümü. + Uygun hata oturum ve yanlış bir şey oldu olduğunu kullanıcılara anlatmak için son bir şans seçenek olarak genel bir exception handler yüklediğinizde kod onları yakalayabilirsiniz.

Hataları log PHP varsayılan bir işlevi vardır; error_log

Example from PHP.net:

<?php
// Send notification through the server log if we can not
// connect to the database.
if (!Ora_Logon($username, $password)) {
    error_log("Oracle database not available!", 0);
}

// Notify administrator by email if we run out of FOO
if (!($foo = allocate_new_foo())) {
    error_log("Big trouble, we're all out of FOOs!", 1,
               "operator@example.com");
}

// another way to call error_log():
error_log("You messed up!", 3, "/var/tmp/my-errors.log");
?>

Kapsamlı günlüğü farkında olun. Özellikle üretken Sistemlerinde.

  • Sadece programlama hataları işlemek için çalışırsanız, ilk sizin kodda bir hata ayıklama modu bayrağı yükseltmek gerekir. sıkı php işleme de çok yararlıdır. Php.ini (veya apache vhost ayarları tarafından belirlenir).

  • Tarayıcı / Ekran ayıklamayı dont denemek. Diğer ilanları belirtildiği gibi. php ini = 0 diplay_errors ve = 1 log_errors'u set (veya apache vhost ayarlarından bunu ayarlayabilirsiniz)

  • Daha sonra bir konsol penceresini açın ve mutlaka: tail-f

    Lütfen php_error.log üzerinde (yol php.ini veya apache vhost ayarları tarafından ayarlanır)

  • Eğer bir çerçeve kullanılması durumunda. Çerçeve hata ayıklama araçlarını kullanabilirsiniz (kek)

  • Kendi çerçevesi / veya sadece kod varsa. Muhtemelen hata ayıklama yetenekleri ile kendi özel durum işleyicisi sınıf yazmak gerekir.

Örnek:

class MyFactory{
    public static function getLogger(){
        return new MyLogger();
    }
}

class ExampleExceptionWithLogging extends Exception{

    public __construct ($message=''){
        MyFactory::getLogger()->exception($message,$this->getTrace());
    }

}

class MyLogger{

    /**
    * @var string $logfile
    **/
    protected $logFile = '/var/log/php_error.log';

    /**
     * @param string $message
     * @param array $stackTrace
     **/
    public function exception($message,$stackTrace){
        $prefix = '[EXCEPTION] ';
        $this->writeOut($prefix.$message.' '.print_r($stackTrace,TRUE));
    }

    /** 
     * writes $value to given Logfile.
     * @param string $value
     * @param string|NULL $logFile FileName with full path
     */
    protected function writeOut($value,$logFile = NULL){
        if(is_null($logFile)){
                $logFile = $this->logFile;
        }
        error_log($value,3,$logFile);
    }
}

Usage: throw new ExampleExceptionWithLogging('Sample Message');

3 konular burada vardır:

  1. Hata işleme için program akışını yönlendirme

  2. Hatayı çözmek için ilgili bilgileri yakalama

  3. Ilgili taraflara bu bilgiler kullanılabilir hale

Diğerleri söylediler, (1)) (set_error_handler kullanılarak ele alınabilir, örneğin, kodunuz içinde kendi müşteri hataları örneğini unutmayın

if (!$_SESSION['authenticated_user']) {
    $login="<a href='/login.php'>login</a>";
    trigger_error("Not authorized please $login", E_USER_WARNING);
}

Bilgi yakalamak için kurulan uygulama yığın izleme - ve bu ancak bu hata oluştu noktada PHP kod devletin statik bir anlık, PHP gerçekten mevcut olduğunu - o, düzgün kodunuzu test ettik Fay olasılıkla PHP kodu ile ilgisi yoktur. Eğer düzeltilmesi gereken ne iyi bir gösterge kodunuzu düzeltmek için çalışıyorum, ama bir yerde olmamalıdır onun iyi bir gösterge. Stacktrace hala bir araçtır, ama genellikle bir program kadar hata vadede ne yaptığını Ayrıntılı bir günlüklerini kayıt dışında herhangi bir süre için, çalışmakta olan programlar için sadece bir araç oldu. De bir hata arıyor logfiles birkaç megabayt ile sığ bariz bir performans hit gibi bir samanlıkta iğne aramak gibi olabilir. PHP programları genellikle sadece bir web sayfası çıkış oluşturmak, ancak bu yana bu o zaman sadece bir kez bir hata oluştuğunda bir dosyaya değişken yazmak için seçebilirsiniz, bir PHP değişken olayların Ayrıntılı bir günlüğünü birikir fırsatı sunuyor.

Programlama hakkında birçok şey gibi, bir trade-off burada var - bir hata için / planını beklemiyorduk happenned varsa, nasıl hata işleme çalışmaya gidiyor olduğunuzu biliyor musunuz?

Eldeki yapma açısından, muhtemelen bir veritabanında kayıt olmamalıdır - şansını veritabanını düzgün çalışmıyor çünkü programı başarısız olabilir vardır - hata işleme, çok, çok sağlam olmalı. Bir özgün adlandırılmış dosya içine damping bir konsolide günlük dosyasına eklenmesi ile olurdu dosya çakışması sorunlarını önler iyi bir yaklaşımdır. Veya syslog olanağını kullanın. Hatta hata bir kopyasını e-posta olabilir (ama yine bu başka karmaşık alt sistemi güvendiğini).

HTH

C.