系统的替代品('php -l')?

时间:2010-10-05 08:19:10

标签: php syntax-checking

在我目前正在工作的项目中,我们正在考虑将 system() 放入php.ini的disable_functions声明中。现在,我们的一个元模块最终也会受到这种限制的影响,它是带有system("php -l");次调用的语法检查文件 - 促使我寻找替代方案。

事实证明曾经有一个 php_check_syntax() ,但这不仅限于检查语法并继续包含文件,如果它在语法上有效,但它是从PHP 5.0.5开始删除。手册建议使用php -l,但鉴于我确定在PHP中禁用系统调用函数是一种相当普遍的做法,我想知道是否有一种接受的,“更好”的语法检查PHP文件的方式来自PHP文件。

(顺便说一下,我对此并不是很谨慎;一个'不'完全足够了(而且我期待它,真的)。我们可以使模块免受此限制 - 但是我问这个问题既出于好奇,也出于更优雅的解决方案。)

3 个答案:

答案 0 :(得分:3)

我找到了一个使用PECL runkit_lint_file()的替代方案。

它与php_check_syntax()进行相同的检查。

我认为值得一看。

答案 1 :(得分:2)

这也可以是一个选项: When (if ever) is eval NOT evil?

似乎更快:

$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.

答案 2 :(得分:0)

请参阅我们的PHP Formatter。这个命令行工具采用格式良好的PHP文件并很好地格式化。

不仅格式化,还有语法检查,并返回命令行状态,告诉您文件是否“格式正确”;它包含一个完整的PHP 5解析器。因为它是一个命令行工具,所以很容易从PHP脚本启动,如果这是你需要做的,并通过检查返回的状态,你会知道该文件是否合法。