Nasıl php ölümcül bir durum karşılaşmak üzerine 500 geri alabilirim?

7 Cevap php

PHP ölümcül hataları HTTP istemci için durum kodu 200 olarak geri gelir. Onu nasıl bir durum kodu 500 (Dahili sunucu hatası) iade yapabilir?

7 Cevap

Bu dün vardı ve aşağıdaki gibi bir çözüm buldum tam bir sorundur:

1) Her şeyden önce, hata türü E_ERROR PHP ölümcül hataları yakalamak gerekir. Bu hata oluştuğunda, script hata saklanır ve yürütme sona edilecektir. Eğer fonksiyon error_get_last () çağırarak saklanan hatayı alabilirsiniz.

Komut sonlandırıldı önce 2), bir geri çağırma işlevi register_shutdown_function () her zaman çağrılır. bu nedenle, bu durumda, ne istersen yap başlığı 500 ve (isteğe bağlı) özelleştirilmiş bir iç hata sayfasına dönmek için bu fonksiyon tarafından bir hata işleyicisi kayıt olmanız gerekmektedir.

function my_error_handler()
{
  $last_error = error_get_last();
  if ($last_error && $last_error['type']==E_ERROR)
      {
        header("HTTP/1.1 500 Internal Server Error");
        echo '...';//html for 500 page
      }
}
register_shutdown_function('my_error_handler');

Not: Eğer E_USER * ile başlar özel hata türünü yakalamak istiyorsanız, ancak, bu hata işleyicisi E_ERROR hata türünü işleyemez, işlevi trigger_error tarafından hata işleyicisi ve tetik hata kayıt () işlevi set_error_handler kullanabilirsiniz. error handler hakkında php.net ilgili açıklamaya bakın

Ben yakalanmamış istisnaları işlemek için "set_exception_handler" kullanmışlardır.

function handleException($ex) {
      error_log("Uncaught exception class=" . get_class($ex) . " message=" . $ex->getMessage() . " line=" . $ex->getLine());
      ob_end_clean(); # try to purge content sent so far
      header('HTTP/1.1 500 Internal Server Error');
      echo 'Internal error';
    }

set_exception_handler('handleException');

It is not possible to handle PHP E_ERROR in any way according to the PHP documentation: http://www.php.net/manual/en/function.set-error-handler.php

Ne de o Bağlantıya göre "E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING ve E_STRICT en" işlemek mümkün olmasıdır.

Siz, diğer hata için bir işleyici sağlar uyarı ve E_USER_ERROR dahil bildirimler, ama bu hata sadece trigger_error ile programcı tarafından kasten atılan beri o sesler gibi bu gerçekten de yararlı değil () OLABİLİR.

Ve tabii (hatta olanlar doğal PHP fonksiyonları tarafından atılan) herhangi İstisna yakalamak.

Ben bu bir sorun olduğunu kabul ediyorsunuz. Uygulama kodu çöker ve yanıklar zaman Sunucular 200 OK vermemelidir.

Sen php hata işleme kullanabilirsiniz

http://www.w3schools.com/php/php%5Ferror.asp

Sen try/catch kullanılarak atılan hatayı yakalamak ve daha sonra 500 hatası ile bir header() göndermek için bu catch bloğu kullanmak gerekir.

try {
    ...badcode...
    throw new Exception('error');

} catch (Exception $e) {

    header("Status: 500 Server Error");
    var_dump($e->getMessage());
}

Önemli özel durum try {} catch blokları ile çevrili değilse, o zaman küresel bir işleyici kayıt ve komut sonunda bir hata kontrol etmek için register_shutdown_function() kullanmanız gerekir.

Herhangi bir icra yolu son satırı olarak header("HTTP/1.1 200 OK", true, 200); ayarlamak için asla unutmam:

//first things first:
header("HTTP/1.1 500 Internal Server Error", true, 500);


//Application code, includes, requires, etc. [...]


//somewhere something happens
//die();
throw new Exception("Uncaught exception!");


//last things last, only reached if code execution was not stopped by uncaught exception or some fatal error
header("HTTP/1.1 200 OK", true, 200);

In PHP 5.4 Eğer http_response_code(200) or http_response_code(500) çok daha iyi yukarıda header fonksiyonunu değiştirebilirsiniz.

Zor bir şey ölümcül hataları (örneğin, bir eksik noktalı virgül hataları derleme) komut dosyası idam olmayacak, yani bu komut durum kodunu ayarlamak için yardımcı olmaz ki ile uğraşırken. Içerebilir veya bir komut dosyası gerektirir Ancak, çağıran komut bakılmaksızın dahil script hataları, idam edilecektir. Bu, ben bu çözüm geldi:

kaya-katı-script.php:

// minimize changes to this script to keep it rock-solid
http_response_code(500); // PHP >= 5.4
require_once("script-i-want-to-guard-for-errors.php");

komut-i-want-to-guard-için-errors.php:

// do all the processsing
// don't produce any output
// you might want to use output buffering

http_response_code(200); // PHP >= 5.4

// here you can produce the output

Kaya-katı-script.php için çağrı yönlendirmek ve gitmek için hazırsınız.

Ben. Htaccess ile 500 varsayılan durum kodunu ayarlamak için bunu daha iyi isterdi. Bu bana daha şık görünüyor ama ben onu koparmak için bir yol bulamıyorum. Ben RewriteRule R-bayrağı çalıştı, ama bu tamamen php yürütülmesini engeller, böylece faydası yok.