2012-08-14 18 views
8

Beh, ho incontrato un po 'di sottaceti qui. Ho bisogno di controllare alcuni PHP per gli errori di sintassi. Ho notato questo bit che deve essere eseguito dalla linea di comando:Controllare gli errori di sintassi PHP?

php -l somefile.php

Tuttavia, c'è un modo per eseguire questo all'interno di un file PHP per sé? Ho cercato e ho pensato di poter usare la funzione parse_str in qualche modo per farlo inserendola in $ _GET, ma non riesco a capire come funziona.

Qualcuno mi ha detto di usare la funzione php token_get_all() per determinare ciò.

Ma non riesco a capire come farlo con qualche approccio? Qualcuno può darmi qualche codice di esempio per iniziare forse ?? Non penso che usare eval() sia la strada da percorrere, anche se avevo un eval($code) funzionante, ma non penso che dovrei eseguire lo script se ci sono errori di sintassi PHP.

Qualsiasi aiuto su questo è molto apprezzato, come sempre!

+0

Perché non generare un sottoprocesso 'php -l'? –

+0

@arxanas - Come può essere fatto ?? Risposta possibile ...? –

+0

@SolomonClosson, penso che il suo commento terso si riferisca a http://php.net/manual/en/function.exec.php – Pacerier

risposta

1

php_check_syntax dovrebbe fare il trucco. Se stai eseguendo PHP> = 5.05, consulta il primo commento nella sezione commenti per l'implementazione.

+3

Questa funzione è stata rimossa da PHP ... [collegamento] (http: //www.php .net/manual/it/function.php-check-syntax.php) –

+0

Buona cattura @SolomonClosson. OP, per fortuna nei commenti è un'implementazione che puoi usare.Non lo incollerò qui perché è molto grande, ma è il commento principale. – wanovak

+0

Questa è una funzione di PHP4 ed è stata rimossa in PHP 5.0.x. Inoltre era fondamentalmente solo un alias di 'eval()' - eseguiva solo il codice fornito per rilevare errori di parsing. – mario

5

Si potrebbe semplicemente fare shell_exec() come questo:

$output = shell_exec('php -l /path/to/filename.php'); 

Questo vi dà l'output delle operazioni da riga di comando nella stringa di $output.

+0

Questo mi dà errore '$ output è indefinito'. –

+0

Ok, ho corretto l'errore di output non definito, tuttavia ora restituisce una stringa vuota, indipendentemente dal fatto che ci siano errori di sintassi PHP o meno. –

0

lo farei in questo modo:

$php_file = 'The path to your file'; 
if(substr(`php -l $php_file`, 0, 16) == 'No syntax errors') { 
    // Correct syntax 
} else { 
    // Error 
} 
0

È possibile utilizzare exec per verificare la presenza di errori di sintassi.

$tempFile = path/of/file 
$syntaxParseError = strpos(exec('php -l '.$tempFile), 'No syntax errors detected') === false;` 

Sfortunatamente, questo non ti darà il numero di riga o ti dirà qualcosa sull'errore. Per questo è necessario installare l'analizzatore statico sul server Is there a static code analyzer [like Lint] for PHP files? o scrivere il proprio parser.

NB. token_get_all() non determinerà nulla da solo, ma è utile per fare un parser.

2

E 'più sicuro per controllare lo stato di ritorno php -l

$fileName = '/path/to/file.php'; 
exec("php -l {$fileName}", $output, $return); 

if ($return === 0) { 
    // Correct syntax 
} else { 
    // Syntax errors 
} 

Vedi this fiddle per vederlo in azione

1

Perché utilizzare la shell a tutti?

function syntax_is_valid($code) 
{ 
    try 
    { 
     @eval($code); 
    } 
    catch (ParseError $e) 
    { 
     return false; 
    } 

    return true;  
} 

In alternativa utilizzare $e->getMessage() per ulteriori informazioni.

+0

Come si impedisce a tutti gli effetti collaterali di eseguire (evalidare) il codice? Come stampare, connettersi al database, scrivere file, ecc. –

Problemi correlati