Альтернатива системе ('php -l')? - PullRequest
4 голосов
/ 05 октября 2010

В проекте, над которым я сейчас работаю, мы рассматриваем возможность помещения system() в объявление disable_functions php.ini. Теперь один из наших метамодулей, который в конечном итоге также станет жертвой этого ограничения, - это файлы для проверки синтаксиса с system("php -l"); вызовами, что побуждает меня искать альтернативы.

Оказывается, раньше был php_check_syntax(), но он не только не ограничивался простой проверкой синтаксиса, но и включал файл, если он синтаксически действителен , но он был удален с PHP 5.0.5. В руководстве предлагается php -l вместо него, но, учитывая, что я уверен, что отключение функций системных вызовов в PHP является довольно распространенной практикой, мне интересно, существует ли приемлемый, «лучший» способ проверки синтаксиса файлов PHP изнутри PHP файлы.

(Между прочим, я не одержим этим; вполне достаточно «нет» (и я действительно этого ожидаю). Мы можем исключить модуль из этого ограничения - но я задаю этот вопрос как из любопытства, так и в надежде на более изящное решение.)

Ответы [ 3 ]

3 голосов
/ 05 октября 2010

Я нашел альтернативу, используя PECL runkit_lint_file () .

Он выполняет ту же проверку, что и php_check_syntax ().

Думаю, стоит посмотреть.

2 голосов
/ 10 мая 2011

Это также может быть опция: Когда (если когда-либо) eval НЕ является злом?

И кажется более быстрым:

$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.
0 голосов
/ 06 октября 2010

Смотрите наш PHP Formatter . Этот инструмент командной строки берет правильно сформированный PHP-файл и хорошо его форматирует.

Он не только форматирует, но также проверяет синтаксис и возвращает статус командной строки, сообщая, был ли файл «правильно сформирован»; он содержит полный синтаксический анализатор PHP 5. Поскольку это инструмент командной строки, его будет легко запустить из сценария PHP, если это то, что вам нужно сделать, и, проверив возвращенный статус, вы узнаете, является ли файл допустимым.

...