我试图使用内置的PHP linter解析PHP文件的递归目录,其工作方式如下:
$PHP -l good.PHP
No Syntax errors detected in good.PHP
$PHP -l bad.PHP
PHP Parse error: Syntax error, unexpected ''foo'' (T_CONSTANT_ENCAPSED_STRING), expecting ')' in bad.PHP on line 3
Errors parsing bad.PHP
我们可以看到传递linting的文件输出一行包含No语法错误,而那些使linting失败的文件输出包含错误解析的行.
我看到我在当前目录中递归地有12147个PHP文件,但PHP linter只输出七行:
$find . -name \*.PHP -print0 | xargs -0 ls -l | wc -l
12147
$find . -name \*.PHP -print0 | xargs -0 PHP -l | wc -l
7
由于PHP只解析了7个文件,我可以用ls来查找一些尚未解析的文件:
$find . -name \*.PHP -print0 | xargs -0 ls -l | head
-rw-r--r-- 1 dotan dotan 1927 Jan 13 10:13 ./bootstrap/app.PHP
-rw-r--r-- 1 dotan dotan 1076 Jan 13 10:13 ./bootstrap/autoload.PHP
-rw-rw-r-- 1 dotan dotan 25620 Mar 12 12:29 ./bootstrap/cache/services.PHP
-rw-r--r-- 1 dotan dotan 2493 Jan 13 10:13 ./bootstrap/paths.PHP
-rwxrwxr-x 1 dotan dotan 20008 Mar 12 12:30 ./config/app.PHP
-rw-r--r-- 1 dotan dotan 3304 Jan 13 10:13 ./config/auth.PHP
-rw-r--r-- 1 dotan dotan 1819 Jan 13 10:13 ./config/cache.PHP
-rw-r--r-- 1 dotan dotan 3751 Jan 13 10:13 ./config/cartalyst.sentinel-addons.social.PHP
-rw-r--r-- 1 dotan dotan 6849 Jan 13 10:13 ./config/cartalyst.sentinel.PHP
-rw-r--r-- 1 dotan dotan 1020 Jan 13 10:13 ./config/compile.PHP
xargs: ls: terminated by signal 13
$find . -name \*.PHP -print0 | xargs -0 PHP -l
No Syntax errors detected in ./bootstrap/paths.PHP
No Syntax errors detected in ./vendor/watson/validating/src/ValidatingTrait.PHP
No Syntax errors detected in ./vendor/giggsey/libphonenumber-for-PHP/src/libphonenumber/data/PhoneNumberMetadata_SI.PHP
No Syntax errors detected in ./vendor/PHP-vcr/PHP-vcr/src/VCR/Event/BeforePlaybackEvent.PHP
No Syntax errors detected in ./vendor/laravel/framework/src/Illuminate/Support/Facades/Blade.PHP
No Syntax errors detected in ./resources/views/emails/appointment/updated/body.blade.PHP
No Syntax errors detected in ./app/WL/Modules/Location/Commands/RemoveClientLocationCommand.PHP
然而,当我尝试解析其中一个文件时,我发现它确实产生了预期的输出(传递或解析失败):
$PHP -l ./bootstrap/cache/services.PHP
No Syntax errors detected in ./bootstrap/cache/services.PHP
我已经检查过,没有传递或失败的linting正在将预期的行打印到stderr:
$PHP -l good.PHP | grep rr
No Syntax errors detected in good.PHP
$PHP -l bad.PHP | grep rr
PHP Parse error: Syntax error, unexpected ''foo'' (T_CONSTANT_ENCAPSED_STRING), expecting ')' in bad.PHP on line 3
Errors parsing bad.PHP
我现在应该检查什么?我的最终目标是lint所有文件,然后grep for Error解析来解决这些问题.
解决方法:
要查看xargs是否有所作为,请运行它运行的命令行.这里有几种方法可以准确地查看它运行的内容,同时不会冒更改它运行的风险:
>在一个临时目录中编写一个名为PHP的脚本,并将其放在$PATH的开头.在这个脚本中,记录参数(并可选择在之后运行真正的PHP).
>在strace等日志记录机制下运行整个命令行.
你会发现命令是这样的
PHP -l ./bootstrap/app.PHP ./bootstrap/autoload.PHP ./bootstrap/cache/services.PHP …
下一步是调查此命令的作用.
我不熟悉PHP,但我想它只将第一个文件名视为PHP脚本名称,而在lint模式下它只是忽略所有后续参数.因此,您需要为每个脚本运行一次PHP -l,共计12147次,而不是使用xargs的分组行为.
最简单的方法是
find . -name \*.PHP -exec PHP -l {} \;
但即使某些PHP调用返回非零状态,此命令也将始终返回0.虽然在21世纪发现大多数不需要xargs,但xargs的一个好处是,如果命令的任何调用返回非零状态,它将返回非零状态.因此运行xargs,但告诉它只使用-n选项一次处理一个文件.
find . -name \*.PHP -print0 | xargs -0 -n 1 PHP -l
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。