2013-06-18 4 views
5

Se includo un file in php. Se c'è qualche errore fatale in quel php, allora c'è un modo per saltarlo.C'è un modo per saltare l'errore fatale dal file include in php?

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

ho bisogno di includere questo file somefile.php. Potrebbe restituire l'errore irreversibile per alcuni host. Voglio saltare questo file per quegli host.

Per favore consiglio a me.

+0

ho bisogno di includere tale file a volte può restituire errore fatale per alcuni host. – SarwarCSE

+0

usa 'require' invece di include. –

+0

"potrebbe restituire un errore fatale per qualche host" - che tipo di fatale? Perché esattamente si verifica? – zerkms

risposta

3

Con questo, è possibile definire la propria funzione di continuazione che subentrerà in caso di errore irreversibile. Questo utilizza register_shutdown_function() per intercettare l'errore fatale.

Usage:

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(); 

Se si verifica un errore irreversibile (come un errore di analisi), l'esecuzione dello script continuerà da my_continuation_func(). Altrimenti, include_catch() restituisce true se si è verificato un errore durante l'analisi.

Qualsiasi uscita (come echo 'something';) da include() viene considerata come un errore. A meno che non abbia abilitato l'output passando true come terzo argomento a include_try().

Questo codice si occupa automaticamente delle possibili modifiche alla directory di lavoro nella funzione di arresto.

È possibile utilizzarlo per qualsiasi numero di include, ma il secondo errore irreversibile che si verifica non può essere intercettato: l'esecuzione si interromperà.

funzioni da includere:

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

Fatale significa fatale ... Non c'è modo di recuperare da un errore irreversibile.

0

modifica: Ho perso la parola fatale. Come indicato, non è possibile ripristinare da un errore irreversibile. Se è solo un'eccezione, la risposta frettolosa scritta di seguito funzionerà.

Compreso altro modulo php è lo stesso di quello codice essendo inserito in linea, in modo semplice try-catch dichiarazione dovrebbe funzionare:

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

Non funzionerà per errori fatali ... solo eccezioni e non c'è modo di lanciare un'eccezione su un errore fatale. – Orangepill

+2

Errore irreversibile non è un'eccezione. – sectus

+0

Sì, devo averlo sorvolato. Questi commenti sono corretti. –

0

tenta di impostare un set_error_handler() funzione che non muore su fatale errori, ma invece Apache si è bloccato. In altre parole, PHP ha bisogno di morire in modo che il sistema non lo faccia.

Vai a questa LINK

1

PHP non tollererà con errori fatali. Meglio controllare il file incluso e risolverlo. In realtà, puoi provare a guardare register-shutdown-function, ma non è consigliabile scappare dai tuoi problemi.

0

Errore irreversibile significa che c'è qualcosa di gravemente sbagliato con il codice incluso. Come ha detto @Orangepill, non c'è modo di fermare questo messaggio di errore irreversibile. Si prega di passare attraverso il codice e trovare l'errore.

1

È possibile utilizzare register_shutdown_function.

<?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(); 

Ma è possibile farlo solo una volta. Qualsiasi ulteriore errore fatale interromperà l'esecuzione.

0

sì, c'è. Esso può essere fatto attraverso una semplice istruzione if

si dispone di:

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

provate questo:

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

Questo non funziona se somefile.php contiene ' mgutt