好吧,我在这里遇到了一点泡菜。 我需要检查一些PHP的语法错误。 我注意到需要从命令行运行的这一部分:
php -l somefile.php
但是,有没有办法从 PHP 文件本身中运行它? 我一直在寻找并认为我可以通过将其输入 $parse_str
_GET 来以某种方式使用该函数来实现这一点,但不太明白这是如何工作的。
其他人告诉我使用 php 函数来确定token_get_all()
这一点。
但是我不知道如何用任何方法做到这一点? 这里的任何人都可以给我一些示例代码来开始吗? 我不认为使用 eval()
是要走的路,虽然我有一个eval($code)
工作,但如果有 PHP 语法错误,我认为我不应该运行脚本。
的任何帮助!
你可以像这样简单地shell_exec()
:
$output = shell_exec('php -l /path/to/filename.php');
这为您提供了字符串$output
中命令行操作的输出。
检查php -l
的返回状态更安全
$fileName = '/path/to/file.php';
exec("php -l {$fileName}", $output, $return);
if ($return === 0) {
// Correct syntax
} else {
// Syntax errors
}
看看这个小提琴,看看它的实际效果
我为此使用token_get_all
。我在数据库中有一些PHP代码。在保存之前,我会这样做
function is_valid_php_code_or_throw( $code ) {
$old = ini_set('display_errors', 1);
try {
token_get_all("<?php'n$code", TOKEN_PARSE);
}
catch ( Throwable $ex ) {
$error = $ex->getMessage();
$line = $ex->getLine() - 1;
throw new InvalidInputException("PARSE ERROR on line $line:'n'n$error");
}
finally {
ini_set('display_errors', $old);
}
}
就像一个魅力。仅语法。没有缺少变量,类型不适用等。
InvalidInputException
是我自己的。你可以让它成为任何东西,或者返回一个布尔值,或者自己处理异常。
我不确定display_errors
是否有必要。那是在某个时候。
我会这样做:
$php_file = 'The path to your file';
if(substr(`php -l $php_file`, 0, 16) == 'No syntax errors') {
// Correct syntax
} else {
// Error
}
php_check_syntax应该可以解决问题。如果您运行的是 PHP>= 5.05,请参阅注释部分中的第一条注释以了解实现。
exec
来检查语法错误。
$tempFile = path/of/file
$syntaxParseError = strpos(exec('php -l '.$tempFile), 'No syntax errors detected') === false;`
不幸的是,这不会给你行号或告诉你任何关于错误的信息。为此,您需要在服务器上安装静态分析器 是否有用于PHP文件的静态代码分析器[如Lint]?或者编写自己的解析器。
铌。 token_get_all()
不会自行确定任何内容,但它对于制作解析器很有用。
为什么要使用外壳?
function syntax_is_valid($code)
{
try
{
@eval($code);
}
catch (ParseError $e)
{
return false;
}
return true;
}
或者,使用 $e->getMessage()
了解更多信息。