在一个项目中,我目前工作,我们正在考虑把 system() 到php.ini中的 disable_functions 声明。现在,我们这最终也陷入这种限制的一个元模块是语法检查与system("php -l");调用文件 - 促使我寻找替代品

原来有曾经是一个的 php_check_syntax() ,但不仅这样做不限制本身只是检查语法,并继续为包括文件,如果它是语法有效,但它是作为PHP 5.0.5被删除。该手册建议在其位php -l,但考虑到我敢肯定,在PHP中禁用系统调用函数是一个相当普遍的做法,我不知道是否有来自PHP文件中检查PHP文件语法的接受,“更好”的方式

(我对这个不是死心塌地,顺便;“不”完全足够了(我希望它真的)我们的可以的excempt不受此限制的模块 - 但是我问这个问题,既出于好奇以及更优美的解决方案的希望。)

其他提示

这可以是也是一种选择: 当(如果有的话)是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.

请参阅我们的 PHP格式化。此命令行工具需要一个结构良好的PHP文件,并很好地对其进行格式化。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top