Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
系统的替代方案(';php-l';)?_Php_Syntax Checking - Fatal编程技术网

系统的替代方案(';php-l';)?

系统的替代方案(';php-l';)?,php,syntax-checking,Php,Syntax Checking,在我目前工作的一个项目中,我们正在考虑将放入php.ini的声明中。现在,我们的一个元模块最终也会成为这种限制的牺牲品,那就是使用system(“php-l”)检查文件的语法呼叫-提示我寻找替代方案 事实证明,以前有一个,但这不仅不局限于只检查语法,而且如果该文件在语法上是有效的,它还包括该文件,但从PHP5.0.5开始,它就被删除了。手册建议使用php-l,但鉴于我确信在php中禁用系统调用函数是一种相当普遍的做法,我想知道是否有一种公认的“更好”的方法可以从php文件中检查php文件的语法

在我目前工作的一个项目中,我们正在考虑将放入php.ini的声明中。现在,我们的一个元模块最终也会成为这种限制的牺牲品,那就是使用
system(“php-l”)检查文件的语法呼叫-提示我寻找替代方案

事实证明,以前有一个,但这不仅不局限于只检查语法,而且如果该文件在语法上是有效的,它还包括该文件,但从PHP5.0.5开始,它就被删除了。手册建议使用
php-l
,但鉴于我确信在php中禁用系统调用函数是一种相当普遍的做法,我想知道是否有一种公认的“更好”的方法可以从php文件中检查php文件的语法


(顺便说一句,我并不是一意孤行;一个“不”就足够了(我真的希望如此)。我们可以将模块从这个限制中排除出来——但我问这个问题是出于好奇,也是希望有一个更优雅的解决方案。)

我找到了一个使用PECL的替代方案

它执行与php\u check\u syntax()相同的检查

我想值得一看。

看看我们的网站。这个命令行工具接受一个格式良好的PHP文件,并对其进行良好的格式化


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

这也是一个选项:

而且似乎更快:

$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.
$nTestTiempo0=微时间(真);
exec('php-lyourfile.php',$arrMsgError,$nCodeError);
$nTestTiempo1=微时间(真);
echo“\n”,“带有exec:”的验证文件中的时间($nTestTiempo1-$nTestTiempo0)。'secs.

”; //exec验证文件中的时间:0.033198118209839秒。 $nTestTiempo0=微时间(真); ob_start();
var_dump(eval('return true;if(0){?>'.file_get_contents('yourfile.php')。'包括文件并捕获异常:P@Ignacio:以防万一那不是开玩笑(尽管我认为是):使用错误处理程序将致命错误转换为异常不起作用,更不用说包含文件将执行它,这是此模块不应该做的。绝对是开玩笑。正确的方法是告诉编译器编译它,然后捕获异常。这正是她不能做的(由于禁用了system()函数)以及php_ckeck_syntax()手册页面告诉她要做什么。哦!绝对是。这看起来正是我要找的。我想知道我们这里是否有PECL runkit--正在调查!出于好奇,你知道关于这个函数的任何安全建议吗(尽管它们对我来说是轶事,被检查的文件是可信的)?据我从手册中读到的,它应该是安全的,因为它只是尝试解析php文件,然后在解析成功时返回。它不应该执行任何操作,所以我认为它是安全的;-)好吧,历史上有一些函数的安全建议,如
highlight_file()
,因为你可以绕过他们应该用正确的负载进行的“只是解析”——这就是问题所在。但是,正如我所说的,轶事——我对我的情况都不担心,只是一个奇怪的cookie。啊,我明白你的意思。我没有使用runkit的任何经验,所以我不能告诉任何关于缓冲区溢出安全性的事情问题。这只是一个快速搜索。谢天谢地,其他人的google fu比我的好!:)谢谢,ITroubs。(我们没有PECL runkit,但这是可以补救的,所以我接受你的答案。谢谢!)“这个命令行工具”--尽管如此,我还是试着离开命令行-想法是禁止PHP中调用它的任何东西(
system
/
passthru
/etc)。尽管如此,还是要感谢。:)+1提供了一种新的方法!(顺便说一句,
microtime
有一个参数,您可能需要查看:)这将使您的示例代码更紧凑、更易于阅读。)但是,为了完成起见:我们也不允许
eval
,尽管是通过不同的渠道。