PHP: Özel hata işleyicisi - taşıma ayrıştırma &

6 Cevap php

Nasıl işleyebilir parse & fatal bir custom hata işleyicisi hataları?

6 Cevap

Basit Cevap: Yapamazsın. Bkz manual:

The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.

Her hata için, kullanabilirsiniz set_error_handler()

EDIT:

Öyle görünüyor yana kullanarak açısından bu konu hakkında bazı tartışmalar vardır ki register_shutdown_function, biz işleme tanımına bakmak gerekir: Benim için, bir hata işleme hata yakalama ve bir tepki gelir Kullanıcı and temel veri (veritabanları, dosyalar, web hizmetleri, vb) için "güzel" bir yol.

register_shutdown_function Eğer kodu anlamına denilen bu kod içinde bir hata işleyemez kullanarak yine hata oluşur noktada durmasına olacaktır. Ancak, bir hata mesajı yerine beyaz bir sayfa ile kullanıcıya sunmak, ancak, örneğin, kod önce başarısız yaptığı şey geri alamazsınız.

Böyle (E_PARSE hariç) bu hataları izleyebilirsiniz:

function shutdown() {
    $isError = false;

    if ($error = error_get_last()){
    switch($error['type']){
        case E_ERROR:
        case E_CORE_ERROR:
        case E_COMPILE_ERROR:
        case E_USER_ERROR:
            $isError = true;
            break;
        }
    }

    if ($isError){
        var_dump ($error);//do whatever you need with it
    }
}

register_shutdown_function('shutdown');

Aslında ayrıştırma ve ölümcül hataları işleyebilir. Bu set_error_handler ile tanımlanan hata işleyicisi function () denilen olmayacak doğrudur. Bunu yapmak için yolu register_shutdown_function () ile bir kapatma işlevi tanımlayarak olduğunu. İşte benim web sitesinde çalışma var budur:

Dosya prepend.php (bu dosya otomatik olarak tüm php scriptler başına eklenecektir). PHP dosyaları prepending ipuçları için aşağıya bakın.

set_error_handler("errorHandler");
register_shutdown_function("shutdownHandler");

function errorHandler($error_level, $error_message, $error_file, $error_line, $error_context)
{
$error = "lvl: " . $error_level . " | msg:" . $error_message . " | file:" . $error_file . " | ln:" . $error_line;
switch ($error_level) {
    case E_ERROR:
    case E_CORE_ERROR:
    case E_COMPILE_ERROR:
    case E_PARSE:
        log($error, "fatal");
        break;
    case E_USER_ERROR:
    case E_RECOVERABLE_ERROR:
        log($error, "error");
        break;
    case E_WARNING:
    case E_CORE_WARNING:
    case E_COMPILE_WARNING:
    case E_USER_WARNING:
        log($error, "warn");
        break;
    case E_NOTICE:
    case E_USER_NOTICE:
        log($error, "info");
        break;
    case E_STRICT:
        log($error, "debug");
        break;
    default:
        log($error, "warn");
}
}

function shutdownHandler() //will be called when php script ends.
{
$lasterror = error_get_last();
switch ($lasterror['type'])
{
    case E_ERROR:
    case E_CORE_ERROR:
    case E_COMPILE_ERROR:
    case E_USER_ERROR:
    case E_RECOVERABLE_ERROR:
    case E_CORE_WARNING:
    case E_COMPILE_WARNING:
    case E_PARSE:
        $error = "[SHUTDOWN] lvl:" . $lasterror['type'] . " | msg:" . $lasterror['message'] . " | file:" . $lasterror['file'] . " | ln:" . $lasterror['line'];
        log($error, "fatal");
}
}

function log($error, $errlvl)
{
...do whatever you want...
}

O komut herhangi bir hata yakalar eğer PHP () fonksiyonu Hataİşleyici arayacak. Hata hemen kapatma komut zorlarsa, hata) (fonksiyon shutdownHandler tarafından işlenir.

Bu benim geliştirme aşamasında olan sitede çalışıyor. Ben henüz üretimde henüz denemedim. Ama şu anda bunu geliştirirken bulurum tüm hataları yakalıyor.

Ben bir kez her fonksiyonu ile iki kez aynı hatayı yakalama riski olduğuna inanıyorum. Ben işlevi shutdownHandler işleme am bir hata () fonksiyonu da errorHandler () tarafından yakalanmış ise, bu olabilirdi.

TODO's:

1 - Daha iyi bir günlüğüne nazikçe hataları işlemek için () fonksiyonu üzerinde çalışmak gerekir. Ben hala gelişme duyuyorum çünkü, ben temelde bir veritabanı hata günlüğü ve ekrana Yankı duyuyorum.

2 - tüm MySQL aramalar için hata işleme uygulanması.

3 - benim javascript kodu için hata işleme uygulanması.

IMPORTANT NOTES:

1 - Ben otomatik olarak tüm php scriptler için yukarıdaki komut prepend benim php.ini de aşağıdaki satırı kullanıyorum:

auto_prepend_file = "/homepages/45/d301354504/htdocs/hmsee/cgi-bin/errorhandling.php"

iyi çalışıyor.

2 - Ben oturum ve E_STRICT hataları dahil tüm hataları çözme duyuyorum. Ben temiz bir kod geliştirme inanıyorum. Gelişimi sırasında, benim php.ini dosyası aşağıdaki satırları var:

track_errors = 1
display_errors = 1
error_reporting = 2147483647
html_errors = 0

Ben canlı gittiğinizde, ben çirkin PHP hata mesajları görme benim kullanıcıların riskini azaltmak için 0'a display_errors değişecektir.

Ben bu kimse yardımcı olur umarım.

Sayfada PHP.net yorumlardan http://www.php.net/manual/en/function.set-error-handler.php

Ben burada birkaç kişi ayrıştırma hatası (tip 4, E_PARSE) çekemezsiniz sözü olduğunu anlamışlardır. Bu doğru değildir. İşte yapmak nasıl. Ben bu kimse yardımcı olur umarım.

1) web kökünde bir "auto_prepend.php" dosyası oluşturun ve bu ekleyin:

<?php 
register_shutdown_function('error_alert'); 

function error_alert() 
{ 
        if(is_null($e = error_get_last()) === false) 
        { 
                mail('your.email@example.com', 'Error from auto_prepend', print_r($e, true)); 
        } 
} 
?> 

2) Then add this "php_value auto_prepend_file /www/auto_prepend.php" to your .htaccess file in the web root.

  • Eğer dosyaya e-posta adresini ve yolunu değiştirmek emin olun.

Çözümleme hatası ile komut dosyası her zaman kesilir ve ele alınamaz. Komut dosyası denir Yani doğrudan ya da yapabileceğiniz bir şey yok, / ihtiyaç bulunmaktadır. Ama orada AJAX, flaş veya başka herhangi bir şekilde, ayrıştırma hataları tespit etmek için nasıl is, bir geçici çözüm tarafından çağrılırsa.

I needed this to handle swfupload script. Swfupload is a flash that handles file uploads and everytime file is uploaded, it calls PHP handling script to handle filedata - but there is no browser output, so the PHP handling script needs these settings for debugging purposes:

  • warnings and notices ob_start (); ob_get_contents tarafından oturumda içine başlangıç ​​ve mağaza içeriğine (); taşıma yazısının sonunda: Bu başka bir komut dosyası tarafından tarayıcınıza görüntülenebilir
  • fatal errors register_shutdown_function () yukarıdaki ile aynı numara ile oturum ayarlamak
  • Ob_get_contents () işleme yazısının sonunda bulunur ve hata daha önce oluştu ayrıştırmak ise parse errors, Oturum (null) dolu değil. Hata ayıklama komut dosyası bu şekilde işleyebilir: if(!isset($_SESSION["swfupload"])) echo "parse error";

Note 1 null araçları is not set ile isset()

Benim deneyimlerinden, hataları her tür yakalamak varsayılan hata mesajı gizlemek ve (isterseniz) kendi bir hata mesajı görüntüleyebilir. Aşağıda ihtiyacınız olan şeyleri listelenir.

1) Bir ilk / üst düzey script, size özel hata işleyicisi fonksiyonları saklamak bize nerede index.php diyelim. Onlar aşağıda hataları yakalamak yüzden özel hata fonksiyonu işlemcileri ben inclued dosyalarında demek "aşağıda" ile, üstünde kalmalıdır.

2) Bu üst komut hatasız olduğu varsayımı doğru olmalı! Bu özel hata işleyicisi işlevi index.php bulunur zaman index.php ölümcül hataları yakalamak değil, çok önemlidir.

3) Php directives (must also be found in index.php) set_error_handler("myNonFatalErrorHandler"); #in order to catch non fatal errors register_shutdown_function('myShutdown'); #in order to catch fatal errors ini_set('display_errors', false); #in order to hide errors shown to user by php ini_set('log_errors',FALSE); #assuming we log the errors our selves ini_set('error_reporting', E_ALL); #We like to report all errors

(yanlış değilim eğer) üretiminde biz hatayı oturum edebilmek için olduğu gibi ini_set('error_reporting', E_ALL); bırakabilirsiniz olurken, aynı zamanda ini_set('display_errors', false); hata görüntülenir emin olacaktır kullanıcıya.

Iki fonksiyonların gerçek içeriğine gelince ben konuşuyorum, myNonFatalErrorHandler ve myShutdown, ben şeyleri basit tutmak için burada detaylı içerik koymayın. Buna ek olarak diğer ziyaretçiler örneklerin sürü verdik. Ben sadece çok düz bir fikir göstermek.

function myNonFatalErrorHandler($v, $m, $f, $l, $c){
 $some_logging_var_arr1[]="format $v, $m, $f, ".$err_lvl[$l].", $c the way you like";
 //You can display the content of $some_logging_var_arr1 at the end of execution too.
}

function myShutdown()
{
  if( ($e=error_get_last())!==null ){
      $some_logging_var_arr2= "Format the way you like:". $err_level[$e['type']].$e['message'].$e['file'].$e['line'];
  }
//display $some_logging_var_arr2 now or later, e.g. from a custom session close function
}

$ için gibi olabilir err_lvl:

$err_lvl = array(E_ERROR=>'E_ERROR', E_CORE_ERROR=>'E_CORE_ERROR', E_COMPILE_ERROR=>'E_COMPILE_ERROR', E_USER_ERROR=>'E_USER_ERROR', E_PARSE=>'E_PARSE', E_RECOVERABLE_ERROR=>'E_RECOVERABLE_ERROR', E_WARNING=>'E_WARNING', E_CORE_WARNING=>'E_CORE_WARNING', E_COMPILE_WARNING=>'E_COMPILE_WARNING',
E_USER_WARNING=>'E_USER_WARNING', E_NOTICE=>'E_NOTICE', E_USER_NOTICE=>'E_USER_NOTICE',E_STRICT=>'E_STRICT');