可以从PHP中检查PHP文件的语法吗?

12

我使用自动加载动态加载 PHP 类文件。

但是由于某些原因,这些文件可能会缺失或损坏。

自动加载将成功报告缺失的文件,因此应用程序逻辑可以处理它们。但是如果这些文件损坏了,整个处理过程会停止,用户会看到空白屏幕,并在错误日志中看到“PHP Parse error: syntax error”。

是否可能从 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)

你有什么想法吗?


4
你真的打算每次执行脚本时都检查想要包含的每个文件的语法吗? - Gumbo
不完全是。我有一种特殊类型的类可能会被潜在地破坏,而不是所有的类。 - Oleksandr Yanovets
5个回答

4

您可以另一种方式在根目录下创建一个名为checkSyntax.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 .......

这将检查作为参数传递的所有文件。祝您使用愉快 :)

4

你真的不应该在执行时检查非正常的PHP文件:这会导致应用程序响应时间变慢!

“更好的方法”是在修改PHP脚本后,使用命令行中的php -l;或者如果你正在使用构建过程,则将其包含在其中;或者如果你正在使用SVN并且可以定义 SVN钩子,则将其作为SVN预提交挂钩。

在我看来,几乎任何解决方案都比在执行时自己检查要好!


考虑到像你想避免的那些错误可能不经常发生,最好的做法可能就是...让它们发生。唯一的问题是:激活日志,并监视它们,以便能够快速检测到问题:-)


当然,这并不妨碍你处理缺少文件的情况;但那是另一回事...


感谢您的回答。"不,无法以合理的性能实现"是一个有效的选项。SVN预提交钩子是一个很好的想法,我认为它将在大多数情况下解决我们的问题。 - Oleksandr Yanovets
不客气 :-) 好的,关于 SVN 预提交钩子:当您是 SVN 服务器的管理员时,使用钩子确实非常好! - Pascal MARTIN
有一些有效的用例,比如开发工具CLI监视器生成缓存文件。 - Tofandel

1

这是一个老问题,但在最近的php版本中似乎我们可以做到这一点。

try {
  include_once($file);
} catch (\ParseError $e) {
  // Parse error
} catch (\Throwable $e) {
  // Any other error
}

0

你也可以进行一些单元测试,其中你加载你正在动态执行的PHP,并断言exec("php -l $fileName")是有效的。如果你这样做,你将能够在测试中验证它一次,使用适当的变量生成它,并且有一个合理的信心水平,证明你的PHP是好的。


0
简而言之:我看不到实现这个的方法,但有一个想法可能足够了。
有日志监控程序或可以通过标准工具过滤带有解析错误的文件的日志。如果出现一个文件,您将恶意文件名放入黑名单中,您的自动加载器在加载之前检查该列表。
使用此方法,第一次您将提供一个空白屏幕(假设在生产服务器上打开了输出错误报告),但第二次将有一个没有故障组件的页面。
在自动加载器中,您应该有一个列表或命名方案,始终尝试加载强制类(其他方式可能导致应用程序处于不一致状态)。

我假设他(他的系统)在构建时无法控制那些文件。 - Csaba Kétszeri
有趣的想法,但我认为让语法检查依赖于用户访问网站是不好的。即使只有第一个人会看到空白页。 - Oleksandr Yanovets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接