Verificar os erros de sintaxe do PHP?
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.
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!
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
.
É 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
}
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.
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.
display_errors
é necessário. Foi em algum momento.
$php_file = 'The path to your file';
if(substr(`php -l $php_file`, 0, 16) == 'No syntax errors') {
// Correct syntax
} else {
// Error
}
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.
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.