4

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

原来那里曾经是一个php_check_syntax(),但它不仅不仅限于检查语法并继续包含该文件(如果它在语法上有效),而且从 PHP 5.0.5 开始它已被删除。该手册php -l在其位置提出了建议,但鉴于我确信在 PHP 中禁用系统调用函数是一种相当普遍的做法,我想知道是否有一种可接受的、“更好”的方式从 PHP 文件中检查 PHP 文件的语法。

(顺便说一句,我对此并不执着;“不”就足够了(我真的希望如此)。我们可以使模块不受此限制 - 但我出于好奇而问这个问题以及希望有一个更优雅的解决方案。)

4

3 回答 3

3

我找到了使用 PECL runkit_lint_file()的替代方法。

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

我认为值得一看。

于 2010-10-05T08:34:36.040 回答
2

这也是一种选择: 什么时候(如果有的话) 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.
于 2011-05-10T16:56:43.297 回答
0

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

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

于 2010-10-06T15:40:30.900 回答