Verificar os erros de sintaxe do PHP?

Bem, encontrei um pequeno problema aqui. Eu estou precisando verificar alguns PHP para erros de sintaxe. Eu notei esta parte que precisa correr a partir da linha de comando:

php -l somefile.php

No entanto, existe uma maneira de executar isto dentro de um arquivo PHP em si? Eu estive olhando e tenho pensado que eu posso usar a função parse_str de alguma forma para realizar isso, inserindo-a em um $ _GET, mas não consigo entender bem como isso funciona.

alguém me disse para usar token_get_all() a função php para determinar.

Mas não consigo descobrir como fazer isto com qualquer abordagem? Alguém aqui pode dar-me uma amostra de código para começar, talvez?? Eu não acho que usar eval() é o caminho a seguir, embora eu tivesse um eval($code) trabalhando, mas não acho que eu deva executar o script se houver erros de sintaxe do PHP.

qualquer ajuda nisto é muito apreciada, como sempre!

Author: Solomon Closson, 2012-08-15

7 answers

Podes simplesmente fazer shell_exec() assim:

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

Isto dá-lhe o resultado da operação da linha de comandos no texto $output.

 5
Author: Mike Brant, 2012-08-14 21:10:36

É mais seguro verificar o estado de retorno de php -l

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

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

Ver este violino {[7] } para o ver em acção

 2
Author: Mandy S, 2017-05-29 07:25:46

Php_check_syntax deve resolver o problema. Se você está executando PHP > = 5.05, veja o primeiro comentário na seção de comentários para a implementação.

 1
Author: wanovak, 2012-08-14 21:08:15

Uso token_get_all para isto. Tenho um código PHP no cadáver. Antes de salvar, eu faço

function is_valid_php_code_or_throw( $code ) {
        $old = ini_set('display_errors', 1);
        try {
                token_get_all("<?php\n$code", TOKEN_PARSE);
        }
        catch ( Throwable $ex ) {
                $error = $ex->getMessage();
                $line = $ex->getLine() - 1;
                throw new InvalidInputException("PARSE ERROR on line $line:\n\n$error");
        }
        finally {
                ini_set('display_errors', $old);
        }
}
Funciona lindamente. Apenas sintaxe. Sem Variáveis em falta, tipo de incompletibilidade, etc.

InvalidInputException é meu. Você pode fazer qualquer coisa, ou devolver um bool, ou lidar com a exceção você mesmo.

Não tenho a certeza se display_errors é necessário. Foi em algum momento.
 1
Author: Rudie, 2018-08-07 19:16:39
Eu faria assim:
$php_file = 'The path to your file';
if(substr(`php -l $php_file`, 0, 16) == 'No syntax errors') {
    // Correct syntax
} else {
    // Error
}
 0
Author: Samuil Banti, 2015-12-14 10:12:33

Por que usar a concha?

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

    return true;    
}

Em alternativa, utilize $e->getMessage() para mais informações.

 0
Author: kjdion84, 2017-07-17 06:41:39

Pode usar exec para verificar se há erros de sintaxe.

$tempFile = path/of/file
$syntaxParseError = strpos(exec('php -l '.$tempFile), 'No syntax errors detected') === false;`
Infelizmente, isto não lhe dará o número da linha nem lhe dirá nada sobre o erro. Para isso, terá de instalar o analisador estático no seu servidor Existe um analisador de código estático [como o Lint] para os ficheiros PHP?Ou escreve o teu próprio analisador.

NB. token_get_all() não vai determinar nada por si só, mas é uma função útil para fazer um analisador.

 -1
Author: Dan Bray, 2017-05-23 11:53:28