Альтернатива системе ('php -l')?
-
27-09-2019 - |
Вопрос
В проекте я сейчас работаю, мы рассматриваем system()
в php.ini disable_functions
Декларация. Теперь один метамомодуль наших, которые в конечном итоге также стали бы осеньте жертву на это ограничение, являются синтаксическими файлами с system("php -l");
Звонки - побуждая меня охотиться на альтернативы.
Оказывается, раньше было php_check_syntax()
, но не только это не ограничивало себя просто проверять синтаксис и включил файл, если он был синтаксически действительным, но он был удален по состоянию на PHP 5,0,5. Руководство предлагает php -l
На своем месте, но учитывая, что я уверен, что отключение функций системы вызова в PHP является довольно распространенной практикой, мне интересно, если есть принятый, «лучший» способ синтаксиса проверяет файлы PHP из файлов PHP.
(Я не ад-согнул на этом, кстати; «нет» отлично хватает (и я ожидаю, правда). Мы могу Опция модуля из этого ограничения - но я задаю этот вопрос как из любопытства, так и в надежде более изящного решения.)
Решение
Я нашел альтернативу, используя PECL runkit_lint_file ().
Это делает тот же чек, как php_check_syntax ().
Я думаю, что стоит посмотреть.
Другие советы
Это может быть также вариант:Когда (если когда-либо) это не зло?
И кажется более быстрее:
$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.
Увидеть наш PHP Fixatter.. Отказ Этот инструмент командной строки принимает хорошо сформированный PHP-файл и приятно его форматы.
Он не только формат, оно также синтаксические проверки, а также возвращает состояние командной строки, рассказывая о том, был ли файл «хорошо сформирован»; Содержит полный анализатор PHP 5. Поскольку это инструмент командной строки, было бы легко запустить из скрипта PHP, если это то, что вам нужно сделать, и путем проверки возвращенного статуса вы знаете, был ли файл законным.