我使用自动加载动态加载 PHP 类文件。 这些文件可能由于某种原因丢失或损坏。
自动加载将成功报告丢失的文件,以便应用程序逻辑可以处理该问题。但是,如果这些文件已损坏,则整个处理将停止,用户将看到空白屏幕,并在错误日志中显示“PHP 解析错误:语法错误”。
是否可以从 PHP 代码检查 PHP 文件的语法?
我看过这里:http://us.php.net/manual/en/function.php-check-syntax.php - 它已被弃用。
还有
exec("php -l $file");
似乎是一个错误的方式(http://bugs.php.net/bug.php?id=46339)
想法?
您确实不应该尝试在执行时检查不正确的 PHP 文件:这会缩短应用程序的响应时间!
“更好的方法”是在修改完 PHP 脚本后从命令行使用 php -l ;或者如果您正在使用它,请将其包含在您的构建过程中;或者如果您使用 SVN 并且可以定义 SVN hooks,则将其插入 SVN 预提交钩子。
在我看来,几乎任何给定的解决方案都比在执行时亲自检查更好!
考虑到像您想避免的错误可能不会经常发生,最好是……让它们发生。
唯一的事情是:激活日志并监控它们,以便能够在出现问题时快速检测到:-)
当然,这并不妨碍您处理丢失文件的情况;但那是另一回事...
另一种方法可以在根目录中创建一个 php 文件,称为 检查语法.php
<?php
for($i=1; $i < count($argv); $i++){
$temp = "php -l " . $argv[$i];
$output = exec($temp);
echo "\n$output";
}
?>
现在,打开 bashrc 文件以创建运行该文件的快捷方式。 添加以下行来运行 checkSyntax.php
alias checkSyntaxErrors='php /root/checkSyntax.php'
现在转到你的源目录执行 svn st。
它会向您显示文件列表,现在可以轻松运行命令。
checkSyntaxErrors file1.php file2.php .......
这将检查作为参数传递的所有文件。
似乎在最近的 PHP 版本中我们可以做到这一点
try {
include_once $file;
} catch (\ParseError $e) {
// Parse error
} catch (\Throwable $e) {
// Any other error
}
简而言之:我看不出有什么办法可以做到这一点,但有一个想法可能就足够了。
有日志监控程序,或者可以通过标准工具过滤日志以查找具有解析错误的文件。如果出现文件,您会将恶棍文件名放入黑名单,并且自动加载器在加载之前会根据此列表进行检查。
使用此方法,第一次您将提供一个空白屏幕(假设在生产服务器上打开了输出错误报告),但第二次将出现一个没有错误组件的页面。
在自动加载器中,您应该有一个列表或命名方案,以便始终尝试加载强制类(您的应用程序可能处于不一致状态的其他方式)
您还可以进行一些单元测试,加载正在动态执行的 PHP 并断言 exec("php -l $fileName") 有效。如果你这样做了,你就能够在测试中验证它一次,使用适当的变量生成它,并有合理的信心你的 PHP 是好的。