2013-06-18 2 views
5

Wenn ich eine Datei in PHP einbeziehen. Wenn es einen fatalen Fehler in diesem PHP gibt, gibt es eine Möglichkeit, das zu überspringen.Gibt es eine Möglichkeit, schwerwiegende Fehler von Include-Datei in PHP zu überspringen?

<?php 
    include "somefile.php"; 
    echo "OK"; // Is there any way to print this OK If there is any fatal error on somefile.php 
?> 

Ich brauche diese somefile.php Datei aufzunehmen. Es kann einen schwerwiegenden Fehler für einen Host zurückgeben. Ich möchte diese Datei für diesen Host überspringen.

Bitte beraten Sie mich.

+0

Ich brauche diese Datei enthalten manchmal kann es für einige Host fatalen Fehler zurück Es kann durch eine einfache if-Anweisung

Sie haben getan werden. – SarwarCSE

+0

Verwenden Sie das 'require' anstelle von include. –

+0

"Es kann einen fatalen Fehler für einen Host zurückgeben" - welche Art von fatal? Warum genau tritt es auf? – zerkms

Antwort

3

Damit können Sie eine eigene Fortsetzungsfunktion definieren, die bei einem fatalen Fehler übernimmt. Dies verwendet register_shutdown_function(), um den schwerwiegenden Fehler abzufangen.

Verbrauch:

function my_continuation_func($filename, $arg2) { 
    // On fatal error during include, continue script execution from here. 
    // When this function ends, or if another fatal error occurs, 
    // the execution will stop. 
} 

include_try('my_continuation_func', array($filename, $arg2)); 
$data = include($filename); 
$error = include_catch(); 

Wenn ein schwerwiegender Fehler (wie ein Parse-Fehler) auftritt, wird die Ausführung des Skripts von my_continuation_func() fortzusetzen. Andernfalls gibt include_catch()true zurück, wenn beim Analysieren ein Fehler aufgetreten ist.

Jeder Ausgang (wie echo 'something';) von include() wird als Fehler behandelt. Es sei denn, Sie haben die Ausgabe aktiviert, indem Sie true als drittes Argument an include_try() übergeben.

Dieser Code sorgt automatisch für mögliche Änderungen des Arbeitsverzeichnisses in der Shutdown-Funktion.

Sie können dies für eine beliebige Anzahl von Includes verwenden, aber der zweite schwerwiegende Fehler, der auftritt, kann nicht abgefangen werden: Die Ausführung wird gestoppt.

Funktionen enthalten sein:

function include_try($cont_func, $cont_param_arr, $output = false) { 
    // Setup shutdown function: 
    static $run = 0; 
    if($run++ === 0) register_shutdown_function('include_shutdown_handler'); 

    // If output is not allowed, capture it: 
    if(!$output) ob_start(); 
    // Reset error_get_last(): 
    @user_error('error_get_last mark'); 
    // Enable shutdown handler and store parameters: 
    $params = array($cont_func, $cont_param_arr, $output, getcwd()) 
    $GLOBALS['_include_shutdown_handler'] = $params; 
} 

function include_catch() { 
    $error_get_last = error_get_last(); 
    $output = $GLOBALS['_include_shutdown_handler'][2]; 
    // Disable shutdown handler: 
    $GLOBALS['_include_shutdown_handler'] = NULL; 
    // Check unauthorized outputs or if an error occured: 
    return ($output ? false : ob_get_clean() !== '') 
     || $error_get_last['message'] !== 'error_get_last mark'; 
} 

function include_shutdown_handler() { 
    $func = $GLOBALS['_include_shutdown_handler']; 
    if($func !== NULL) { 
     // Cleanup: 
     include_catch(); 
     // Fix potentially wrong working directory: 
     chdir($func[3]); 
     // Call continuation function: 
     call_user_func_array($func[0], $func[1]); 
    } 
} 
2

Fatal bedeutet fatal ... Es gibt keine Möglichkeit, einen schwerwiegenden Fehler zu beheben.

0

edit: Ich habe das Wort fatal verpasst. Wie bereits erwähnt, können Sie einen schwerwiegenden Fehler nicht beheben. Wenn es nur eine Ausnahme ist, wird die hastig geschriebene Antwort funktionieren.

ein anderes Modul mit PHP ist das gleiche wie der Code inline eingefügt wird, so dass eine einfache Anweisung try-catch funktionieren soll:

<?php 
    try { 
     include "somefile.php"; 
    } catch (Exception $e) { 
     echo 'Caught exception: ', $e->getMessage(), "\n"; 
    } 
    echo "OK"; 
?> 
+0

Funktioniert nicht für schwerwiegende Fehler ... nur Ausnahmen und es gibt keine Möglichkeit, eine Ausnahme auf einen schwerwiegenden Fehler zu werfen. – Orangepill

+2

Schwerwiegender Fehler ist keine Ausnahme. – sectus

+0

Ja, ich muss das übergangen haben. Diese Kommentare sind korrekt. –

0

Versuchen eine set_error_handler() Funktion zu setzen, die nicht auf fatal sterben Fehler, aber stattdessen Apache abgestürzt. Mit anderen Worten, PHP muss sterben, so dass das System dies nicht tut.

Sehen Sie diese LINK

1

PHP nicht mit Schwerwiegende Fehler tolerieren. Am besten überprüfen Sie die enthaltene Datei und lösen Sie sie. Eigentlich können Sie versuchen, register-shutdown-function betrachten, aber es ist nicht empfehlenswert, von Ihren Problemen wegzulaufen.

0

Schwerwiegender Fehler bedeutet, dass der einschließende Code ernsthaft fehlerhaft ist. Wie @Orangepill sagte, gibt es keine Möglichkeit, diese fatale Fehlermeldung zu stoppen. Bitte gehen Sie durch Ihre Codierung und finden Sie den Fehler.

1

Sie können register_shutdown_function verwenden.

<?php 
function echoOk() 
    { 
    echo "OK"; 
    } 

register_shutdown_function(function() 
     { 
     $error = error_get_last(); 
     // to make sure that there is any fatal error 
     if (isset($error) && 
      ($error['type'] == E_ERROR 
      || $error['type'] == E_PARSE 
      || $error['type'] == E_COMPILE_ERROR 
      || $error['type'] == E_CORE_ERROR)) 
      { 
      echoOk(); 
      } 
     }); 

include "somefile.php"; 

echoOk(); 

Aber Sie können es nur einmal tun. Jeder weitere schwerwiegende Fehler stoppt die Ausführung.

0

Ja, es gibt.

Diese
<?php 
    include "somefile.php"; 
    echo "OK"; // Is there any way to print this OK If there is any fatal error on 
?> 

Versuchen:

<?php 
    if(include "somefile.php"){ 
      // echo do something if success 
    }else{ 
      echo "OK"; 
    } 
+0

Dies funktioniert nicht, wenn somefile.php ' mgutt

Verwandte Themen