PHP包含有解析错误的文件

PHP包含有解析错误的文件,php,include,Php,Include,我有一个动态生成的PHP文件,它包含在其他PHP脚本中(通过include)。当第一个脚本(出于某种模糊的原因)生成时出现解析错误,会导致主脚本解析错误并停止执行 在包含文件时,是否有任何方法可以检测分析错误,以便动态重新生成该文件?您可以运行命令行版本的PHP来检查语法: php -l filename 如果需要从PHP脚本中检查语法,请使用exec()函数调用命令行程序 另请参见不推荐使用的函数您可以执行(使用或类似)php-l file.php并查看结果。这将是缓慢的,我认为这样做的每一

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


在包含文件时,是否有任何方法可以检测分析错误,以便动态重新生成该文件?

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

php -l filename
如果需要从PHP脚本中检查语法,请使用
exec()
函数调用命令行程序

另请参见不推荐使用的函数

您可以执行(使用或类似)
php-l file.php
并查看结果。这将是缓慢的,我认为这样做的每一个包括


修复导致您生成有时无效的PHP文件的原因不是更好吗?

您可以执行
文件获取内容,然后扫描它以查看是否存在任何解析错误

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

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

 $cmd="php -l " . $basedir . $dir . "/" . $file;
 $s=exec($cmd,$k);
 if( strstr($s,"No syntax errors detected") ) { include($basedir.$dir."/".$file); }
这将在要包含的脚本上运行php-l,如果没有错误,则加载它。

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

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

SYNTAX.php?filename.php

其中SYNTAX.php是:

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

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

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

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

例如,如果您在末尾写入
,您可以稍后检查它是否存在:

$contents = file_get_contents($path);
if (strpos($contents, '<?php $complete=1; ?>')) {
    include($path);
}
$contents=file\u get\u contents($path);
if(strpos($contents,,)){
包括($path);
}

听起来您需要解决导致包含的脚本中出现解析错误的问题。我不确定是否检测到它们,但如果它出错一次,如果使用相同的方法重新生成,它似乎会再次出错。在其他情况下,您可能会得到错误的文件,断电或服务器故障之类的情况5.0.4刚刚注意到…更改了我的答案后,这是不推荐的。我可以想象像
php\u check\u syntax()
这样的函数调用会比生成新进程快得多。。太糟糕了,它现在不见了:(如果$path是一个文件名,file_get_contents()不会只给你php代码吗?