我有一个动态生成的PHP文件,包含在其他PHP脚本中(通过include)。当使用解析错误生成第一个(出于某种不明原因)时,导致主脚本解析错误停止执行。
有没有办法在包含文件时检测解析错误,以便我可以动态重新生成该文件?
答案 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.
}