2011-11-24 10 views
8

Sto scrivendo uno script in PHP5 che richiede il codice di alcuni file. Quando un file non è disponibile per l'inclusione, viene generato prima un avviso e poi un errore fatale. Mi piacerebbe stampare un proprio messaggio di errore, quando non è stato possibile includere il codice. È possibile eseguire un ultimo comando, se il requeire non ha funzionato? quanto segue non ha funzionato:Come rilevare l'errore require() o include() in PHP?

require('fileERROR.php5') or die("Unable to load configuration file."); 

Soppressione tutti i messaggi di errore utilizzando error_reporting(0) dà solo uno schermo bianco, non usando error_reporting dà i PHP-errori, che non voglio mostrare.

risposta

3

Un approccio migliore sarebbe utilizzare prima il percorso realpath. realpath restituirà false se il file non esiste.

$filename = realpath(getcwd() . "/fileERROR.php5"); 
$filename && return require($filename); 
trigger_error("Could not find file {$filename}", E_USER_ERROR); 

Si potrebbe anche creare la propria funzione richiede in della tua applicazione namespace che avvolge la funzione di richiedere PHP

namespace app; 

function require_safe($filename) { 
    $path = realpath(getcwd() . $filename); 
    $path && return require($path); 
    trigger_error("Could not find file {$path}", E_USER_ERROR); 
} 

Ora è possibile utilizzarlo in qualsiasi parte dei file

namespace app; 

require_safe("fileERROR.php5"); 
+0

Non ho assolutamente idea del perché, ma il tuo codice non funziona correttamente (produce un falso positivo), quando eseguire in PHP CLI/console. Cioè Interrompe l'esecuzione dello script, affermando che il file XYZ non esiste, mentre in realtà esiste - commentando il tuo codice e andando direttamente a 'include()' funziona bene e il file è incluso senza errori. – trejder

1

Vorrei suggerire hai dato uno sguardo al più recent comment nella documentazione per la funzione set_error_handler().

Si suggerisce la seguente come metodo (e con un esempio) di cattura errori fatali:

<?php 
function shutdown() 
{ 
    $a=error_get_last(); 
    if($a==null) 
     echo "No errors"; 
    else 
     print_r($a); 

} 
register_shutdown_function('shutdown'); 
ini_set('max_execution_time',1); 
sleep(3); 
?> 

Non ho provato il suggerimento, ma questo potrebbe propably essere utilizzato in altri scenari di errore fatale.

+0

Mentre questo può funzionare, produce una buona domanda, se questo funzionerà in condizioni, OP sta chiedendo? Credo che la maggior parte delle persone che arrivano qui stiano cercando una soluzione, dove possono prendere 'require' su un file non esistente ** e continuare ** l'esecuzione dello script. Essere in grado di morire con grazia (cioè mostrare qualcosa, voglio ma finire con la terminazione di script anche così - e questo è quello che il tuo codice sembra fare) non sembra adattarsi a molti scenari. Presumo che la sceneggiatura possa mostrare quello che vuole se morirà.Voglio impedire la morte/terminazione su file non esistente alimentato a 'require'. – trejder

0

È necessario utilizzare include(). Require(), se usato su un file inesistente, produce un errore fatale ed esce dallo script, quindi il tuo die() non accadrà. Include() lancia solo un avvertimento e quindi lo script continua.

+0

La tua risposta è specifica per una determinata versione di PHP o specifica per certe configurazioni di 'php.ini'. Dalla mia parte (PHP 5.5.4) con la mia configurazione, la modifica di 'require' a' include' non comporta alcuna differenza. Entrambi stanno lanciando brutti errori fatali, che non riesco a cogliere. – trejder

11

È possibile eseguire questa operazione utilizzando set_error_handler in combinazione con ErrorException.

L'esempio dalla pagina ErrorException è:

<?php 
function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

/* Trigger exception */ 
strpos(); 
?> 

Una volta che avete errori manipolato come eccezioni si può fare qualcosa di simile:

<?php 
try { 
    include 'fileERROR.php5'; 
} catch (ErrorException $ex) { 
    echo "Unable to load configuration file."; 
    // you can exit or die here if you prefer - also you can log your error, 
    // or any other steps you wish to take 
} 
?> 
+0

@SajnEvardsson Il manuale php ha il terzo parametro ErrorException come $ errno, non il secondo. – Basit

+2

L'esempio sopra è copiato direttamente dai documenti ErrorException (link sopra) - nell'esempio "ufficiale" usano $ errno come $ code, mentre altri (incluso nei commenti su quella pagina) hanno suggerito di usarlo come $ severity - note che se ti piace puoi usarlo per entrambi, o nessuno dei due. –

6

mi basta usare 'file_exists()':

if (file_exists("must_have.php")) { 
    require "must_have.php"; 
} 
else { 
    echo "Please try back in five minutes...\n"; 
}