好吧,我在这里遇到了一些泡菜。我需要检查一些PHP的语法错误。我注意到这一点需要从命令行运行:
php -l somefile.php
但是,有没有办法从PHP文件本身运行它?我一直在寻找并且认为我可以通过将parse_str
函数输入$ _GET来实现这一目的,但不能完全理解它是如何工作的。
其他人告诉我使用token_get_all()
php函数来确定这一点。
但我无法弄清楚如何用任何方法做到这一点?这里的任何人都可以给我一些示例代码来开始吗?我不认为使用eval()
是可行的方法,虽然我有eval($code)
工作,但如果有PHP语法错误,我认为不应该运行脚本。
我们非常感谢您对此的任何帮助!
答案 0 :(得分:5)
你可以这样做shell_exec()
:
$output = shell_exec('php -l /path/to/filename.php');
这为您提供了字符串$output
中命令行操作的输出。
答案 1 :(得分:3)
检查php -l
$fileName = '/path/to/file.php';
exec("php -l {$fileName}", $output, $return);
if ($return === 0) {
// Correct syntax
} else {
// Syntax errors
}
请参阅this fiddle以了解相关信息
答案 2 :(得分:1)
php_check_syntax应该做到这一点。如果您运行的是PHP> = 5.05,请参阅评论部分中的第一条评论。
答案 3 :(得分:1)
为此,我使用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
是否必要。在某个时候。
答案 4 :(得分:0)
我会这样做:
$php_file = 'The path to your file';
if(substr(`php -l $php_file`, 0, 16) == 'No syntax errors') {
// Correct syntax
} else {
// Error
}
答案 5 :(得分:0)
为什么要使用shell?
function syntax_is_valid($code)
{
try
{
@eval($code);
}
catch (ParseError $e)
{
return false;
}
return true;
}
或者使用$e->getMessage()
获取更多信息。
答案 6 :(得分:-1)
您可以使用exec
检查语法错误。
$tempFile = path/of/file
$syntaxParseError = strpos(exec('php -l '.$tempFile), 'No syntax errors detected') === false;`
不幸的是,这不会为您提供行号或告诉您有关错误的任何信息。为此,您需要在服务器Is there a static code analyzer [like Lint] for PHP files?上安装静态分析器或编写自己的解析器。
NB。 token_get_all()
不会自行确定任何内容,但它对于创建解析器很有用。