13

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

php -l somefile.php

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

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

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

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

4

7 回答 7

5

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

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

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

于 2012-08-14T21:10:36.303 回答
3

检查退货状态更安全php -l

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

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

这个小提琴看看它在行动

于 2017-05-29T07:25:46.213 回答
2

我用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有必要。那是在某个时候。

于 2018-08-07T19:16:39.510 回答
0

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

于 2012-08-14T21:03:01.277 回答
0

为什么要使用外壳?

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

    return true;    
}

或者使用$e->getMessage()以获取更多信息。

于 2017-07-17T05:14:23.660 回答
0

我会这样做:

$php_file = 'The path to your file';
if(substr(`php -l $php_file`, 0, 16) == 'No syntax errors') {
    // Correct syntax
} else {
    // Error
}
于 2015-12-14T10:12:33.817 回答
-1

您可以使用它exec来检查语法错误。

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

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

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

于 2017-02-10T02:47:22.720 回答