使用include时捕获PHP Parser错误

时间:2014-01-29 12:55:23

标签: php try-catch

我有一个名为functions.php的文件。

此文件包含所有其他功能文件,例如:

include_once("user_functions.php");
include_once("foo_functions.php");

我想抓住错误,当我在其中一个文件中拧一个代码时,它不会给整个系统带来错误。

例如,如果foo_functions.php中存在解析器错误,则不会将其包含在functions.php中。

这可能吗?

6 个答案:

答案 0 :(得分:4)

Parser错误是致命错误,因此您无法catch这些错误。 See this question and answer for more details

如果您可以exec()运行{em> 可以执行的操作,请致电php -l thefilename.php并检查结果。 See the manual for information on how this works。但是这里有一些问题:

  • 这是极其危险的,因为您将信息传递给命令行。您绝对必须非常仔细地过滤任何用户输入,或者您将为用户提供对您系统的非常广泛的访问权限。
  • exec()经常被禁用,因为使用它的安全风险极高。
  • 确实没有理由包含您尚未通过语法错误验证的文件。如果这是插件或其他东西,那么我理解你的推理。但是,如果它是您可以控制的代码,则应在将其投入生产之前进行验证。

答案 1 :(得分:4)

从PHP 7开始,可以捕获大多数eval / include错误,例如ParseError:

try {
  include_once(__DIR__ . '/test.php');
} catch (\Throwable $e) {
  var_dump($e);
}

答案 2 :(得分:1)

此代码可以检查文件是否存在,如果文件存在而不包含它。

<? 
    if(!is_file('user_functions.php')){
        //There is no file user_functions.php . You may use file_put_contents('user_functions.php','<? //content ?>');
    }else{
        //ther is file user_functions.php, so include it.
        include 'user_functions.php'; 
    }
?>

这可以帮助您获得语法错误(仅适用于PHP 7 +)

<?
    try {
        include('user_functions.php');
    }catch (ParseError $e) {
        echo 'Error: '.$e->getMessage();
        //syntax error, unexpected end of file, expecting ',' or ';'
    }


?>

因此,如果您使用PHP 7+,则可以使用:

<? 
    if(!is_file('user_functions.php')){
        echo 'Error: file is not exist';
    }else{
        //check errors
        try {
            include('user_functions.php');
        }catch (ParseError $e) {
            echo 'Error: '.$e->getMessage();
            //syntax error, unexpected end of file, expecting ',' or ';'
        }
    }
?>

答案 3 :(得分:0)

如果你把

怎么办?
error_reporting(E_ALL);
ini_set("display_errors", 1);

在foo_functions.php的开头?

答案 4 :(得分:0)

include()include_once()如果失败则会返回false。您可以使用它来检查include d文件是否成功。

if (!include('user_functions.php'))
   echo 'user functions failed to include';
if (!include('foo_functions.php'))
   echo 'foo_functions failed to include';

通过更改echo来处理错误逻辑,您应该可以按照自己的要求进行操作。

答案 5 :(得分:0)

我使用的解决方案感觉就像一个创可贴解决方案,但它会让你控制回来。

这个想法是使用&#34; eval()&#34;首先检查错误。另外,在开头忽略@的错误。当然,你需要小心使用eval,所以不要让用户向它提供任何东西。

    // first "eval" the file to see if it contains errors
    $txt = file_get_contents($template_filename);

    // eval starts out in php-mode.  get out of it.
    $txt = '?' . '>' . $txt;
    ob_start();
    $evalResult = @eval($txt);
    ob_end_clean();

    // if there are no errors
    if($evalResult !== FALSE) {
        require($template_filename);
    } else {
        error_log(print_r(error_get_last(), TRUE));
    }

请注意我认为&#34; file_get_contents + eval&#34; =&#34; require&#34;或非常接近它,因此您可以跳过要求部分。