【问题标题】:Check for PHP Syntax errors?检查 PHP 语法错误?
【发布时间】:2012-08-11 05:43:24
【问题描述】:

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

php -l somefile.php

但是,有没有办法从 PHP 文件本身运行它?我一直在寻找并认为我可以通过将 parse_str 函数输入到 $_GET 中来以某种方式使用它来完成此任务,但不太了解它是如何工作的。

其他人告诉我使用token_get_all() php 函数来确定这一点。

但我不知道如何用任何方法做到这一点?有人可以在这里给我一些示例代码来开始吗?我不认为使用eval() 是要走的路,虽然我有一个eval($code) 工作,但如果有PHP 语法错误,我不认为我应该运行脚本。

非常感谢您提供任何帮助,一如既往!

【问题讨论】:

  • 为什么不生成一个php -l 子进程?
  • @arxanas - 这怎么做?可能的答案...?
  • @SolomonClosson,我认为他的简洁评论指的是php.net/manual/en/function.exec.php

标签: php syntax-error token


【解决方案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 是否有必要。是在某个时候。

【讨论】:

  • 这个字符串解析但是如果你尝试运行它会崩溃&lt;?php class {CLASS}:3v4l.org/p9k1Y
  • 嗯。这很奇怪。但是您应该添加TOKEN_PARSE 标志:3v4l.org/VFDrG
【解决方案2】:

为什么要使用 shell?

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

    return true;    
}

也可以使用$e-&gt;getMessage() 了解更多信息。

【讨论】:

  • 如何防止所有副作用运行(评估)代码?如打印、连接数据库、写入文件等
【解决方案3】:

查看php -l的返回状态比较安全

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

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

查看this fiddle 以了解它的实际应用

【讨论】:

    【解决方案4】:

    您可以使用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? 上安装静态分析器或编写自己的解析器。

    注意。 token_get_all() 不会自行确定任何内容,但它对制作解析器很有用。

    【讨论】:

      【解决方案5】:

      我会这样做:

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

      【讨论】:

        【解决方案6】:

        你可以像这样简单地做shell_exec()

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

        这会在字符串$output 中为您提供命令行操作的输出。

        【讨论】:

        • 好的,已经修复了未定义的输出错误,但是现在无论是否存在PHP语法错误,它都会返回一个空字符串。
        • 使用 exec() 而不是 shell_exec() 会给你第三个参数的输出:php.net/manual/en/function.exec.php
        【解决方案7】:

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

        【讨论】:

        • 此函数已从 PHP 中删除...link
        • 好消息@SolomonClosson。 OP,幸运的是,在 cmets 中有一个您可以使用的实现。篇幅很大,这里就不贴了,不过是置顶评论。
        • 这是一个 PHP4 函数,已在 PHP 5.0.x 中删除。此外,它基本上只是eval() 的别名——它只是运行提供的代码来检测解析错误。
        猜你喜欢
        • 1970-01-01
        • 2011-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多