在我目前正在工作的项目中,我们正在考虑将 system()
放入php.ini的disable_functions
声明中。现在,我们的一个元模块最终也会受到这种限制的影响,它是带有system("php -l");
次调用的语法检查文件 - 促使我寻找替代方案。
事实证明曾经有一个 php_check_syntax()
,但这不仅限于检查语法并继续包含文件,如果它在语法上有效,但它是从PHP 5.0.5开始删除。手册建议使用php -l
,但鉴于我确定在PHP中禁用系统调用函数是一种相当普遍的做法,我想知道是否有一种接受的,“更好”的语法检查PHP文件的方式来自PHP文件。
(顺便说一下,我对此并不是很谨慎;一个'不'完全足够了(而且我期待它,真的)。我们可以使模块免受此限制 - 但是我问这个问题既出于好奇,也出于更优雅的解决方案。)
答案 0 :(得分:3)
答案 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脚本启动,如果这是你需要做的,并通过检查返回的状态,你会知道该文件是否合法。