检查 PHP 语法错误?

问题描述 投票:0回答:8

好吧,我在这里遇到了一些麻烦。 我需要检查一些 PHP 的语法错误。 我注意到这一点需要从命令行运行:

php -l somefile.php

但是,有没有办法从 PHP 文件本身运行它? 我一直在寻找并认为我可以使用

parse_str
函数以某种方式通过将其输入 $_GET 来完成此操作,但不太明白这是如何工作的。

其他人告诉我使用

token_get_all()
php 函数来确定这一点。

但我不知道如何用任何方法来做到这一点? 这里有人能给我一些示例代码来开始吗? 我不认为使用

eval()
是正确的方法,尽管我有
eval($code)
可以工作,但如果存在 PHP 语法错误,我不认为应该运行脚本。

一如既往,我们非常感谢对此的任何帮助!

php syntax-error token
8个回答
6
投票

你可以像这样简单地做

shell_exec()

$output = shell_exec('php -l /path/to/filename.php');

这将为您提供字符串中命令行操作的输出

$output


5
投票

我为此使用

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
投票

查看退货状态更安全

php -l

$fileName = '/path/to/file.php';
exec("php -l {$fileName}", $output, $return);

if ($return === 0) {
    // Correct syntax
} else {
    // Syntax errors
}

请参阅这个小提琴以查看其实际效果


0
投票

我会这样做:

$php_file = 'The path to your file';
if(substr(`php -l $php_file`, 0, 16) == 'No syntax errors') {
    // Correct syntax
} else {
    // Error
}

0
投票

在命令行中使用 -ln 返回包含错误的行。

> php -ln file.php

Parse error: syntax error, unexpected ':' in file.php on line 899
Errors parsing file.php

-1
投票

php_check_syntax 应该可以解决问题。如果您运行的 PHP >= 5.05,请参阅注释部分中的第一条注释以了解实现。


-1
投票

您可以使用

exec
检查语法错误。

$tempFile = path/of/file
$syntaxParseError = strpos(exec('php -l '.$tempFile), 'No syntax errors detected') === false;`

不幸的是,这不会给您行号或告诉您有关错误的任何信息。为此,您需要在服务器上安装静态分析器是否有用于 PHP 文件的静态代码分析器 [如 Lint]? 或编写您自己的解析器。

注意。

token_get_all()
本身不会确定任何东西,但它对于制作解析器很有用。


-2
投票

为什么要使用 shell?

function syntax_is_valid($code)
{
    try
    {
        @eval($code);
    }
    catch (ParseError $e)
    {
        return false;
    }

    return true;    
}

或者使用

$e->getMessage()
获取更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.