PHP包含解析错误的文件

时间:2009-08-10 14:29:23

标签: php include

我有一个动态生成的PHP文件,包含在其他PHP脚本中(通过include)。当使用解析错误生成第一个(出于某种不明原因)时,导致主脚本解析错误停止执行。

有没有办法在包含文件时检测解析错误,以便我可以动态重新生成该文件?

7 个答案:

答案 0 :(得分:3)

您可以运行PHP的命令行版本来检查语法:

php -l filename

如果需要检查PHP脚本中的语法,请使用exec()函数调用命令行程序。

另请参阅已弃用的函数php_check_syntax()

答案 1 :(得分:1)

SYNTAX.php?filename.php

在哪里SYNTAX.php是:

<?php 
error_reporting(E_ALL);
ini_set('display_errors','On');

include($_SERVER['QUERY_STRING']);
?>

答案 2 :(得分:0)

您可以执行(使用exec()或类似的)php -l file.php并查看结果。我认为在每个包含上做这个都会很慢。

修复导致生成有时无效的PHP文件的内容会不会更好?

答案 3 :(得分:0)

我有一个脚本会遍历我的代码树并查找语法错误。它不是很先进,但它的基础是

 $cmd="php -l " . $basedir . $dir . "/" . $file;
 $s=exec($cmd,$k);
 if( strstr($s,"No syntax errors detected") ) { include($basedir.$dir."/".$file); }

这将在您要包含的脚本上运行php -l,如果没有错误加载它。

答案 4 :(得分:0)

通过执行shell_exec(),您可以看到输出,就像通过命令行执行该文件一样。你可以在这里查看是否有错误。

<?php
if (strpos(shell_exec('php -l file.php'), 'Syntax Error')) {
    die('An error!');
}

答案 5 :(得分:0)

如果你可以保证你总是生成正确的可解析代码(通过适当的转义应该很容易实现,等等),那么唯一可能出错的方法是当写入文件的过程中断时(例如电源)停电,内存不足,进程死亡等)。在这种情况下,您将得到一个部分文件。

您可以通过在文件末尾添加签名并在调用include()之前检查其存在来防止这些部分写入。

例如,如果您在结尾处写下<?php $complete=1; ?>,则可以稍后检查其存在情况:

$contents = file_get_contents($path);
if (strpos($contents, '<?php $complete=1; ?>')) {
    include($path);
}

答案 6 :(得分:-2)

您可以执行file_get_contents然后扫描它以查看是否存在任何解析错误。

$contents = file_get_contents($path);
if (stripos($contents, 'Parse error:') !== 0)
{
  // There was a parse error.
} else {
  // There were no parse errors.
}