Pergunta

Em um projeto para o qual estou trabalhando, estamos pensando em colocar system() em php.ini's disable_functions declaração. Agora, um meta-módulo nosso que também seria vítima dessa restrição é a sintaxe de verificação de arquivos com system("php -l"); Chamadas - Oprando -me a procurar alternativas.

Acontece que costumava ser um php_check_syntax(), mas isso não apenas não se restringiu a apenas verificar a sintaxe e incluiu o arquivo se for sintaticamente válido, mas foi removido a partir do PHP 5.0.5. O manual sugere php -l Em seu lugar, mas, como tenho certeza de que desativam as funções de chamada do sistema no PHP é uma prática bastante comum, estou me perguntando se há uma maneira 'melhor' aceita de verificação de arquivos PHP de verificação de sintaxe nos arquivos PHP.

(Eu não estou empenhado nisso, a propósito; um 'não' é perfeitamente suficiente (e espero, realmente). posso Exceto o módulo dessa restrição - mas estou fazendo essa pergunta tanto por curiosidade quanto na esperança de uma solução mais graciosa.)

Foi útil?

Solução

Eu encontrei uma alternativa usando PECL runkit_lint_file ().

Ele faz a mesma verificação que php_check_syntax ().

Eu acho que vale a pena dar uma olhada.

Outras dicas

Esta também pode ser uma opção:Quando (se alguma vez) avaliar não é mau?

E parece mais rápido:

$nTestTiempo0 = microtime(true);
exec('php -l yourfile.php',$arrMsgError,$nCodeError);
$nTestTiempo1 = microtime(true);
echo "\n", '<p>Time in verify file with exec : '.($nTestTiempo1-$nTestTiempo0).' secs.</p>';
//Time in verify file with exec : 0.033198118209839 secs.

$nTestTiempo0 = microtime(true);
ob_start ();
var_dump(eval('return true; if(0){?>'.file_get_contents('yourfile.php').'<?php };'));
$arrMsgError = explode("\n",trim(ob_get_contents()));
ob_end_clean();
$nTestTiempo1 = microtime(true);
echo "\n", '<p>Time in verify file with eval : '.($nTestTiempo1-$nTestTiempo0).' secs.</p>';
//Time in verify file with eval : 0.00030803680419922 secs.

$nTestTiempo0 = microtime(true);
@system('php -l yourfile.php',$nCodeError);
$nTestTiempo1 = microtime(true);
echo "\n", '<p>Time in verify file with system : '.($nTestTiempo1-$nTestTiempo0).' secs.</p>';
//Time in verify file with system : 0.032964944839478 secs.

Veja o nosso PHP Formatter. Essa ferramenta de linha de comando pega um arquivo php bem formado e o formata bem.

O formato não apenas faz verificações de sintaxe e retorna o status da linha de comando informando se o arquivo era "bem formado"; Ele contém um analisador Php 5 completo. Por ser uma ferramenta de linha de comando, seria fácil lançar a partir de um script PHP, se é isso que você precisa fazer e verificando o status retornado, você saberia se o arquivo era legal.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top