2013-01-07 134 views
5

验证一堆PHP文件的语法,语法是缓慢的验证的PHP文件更有效地

我们使用php -l file.php验证的许多PHP文件的语法的持续集成设置的一部分。我们实际上做了这样的事情:`find。 -name“* .php”| xargs的--max-ARGS = 1 PHP -l”因为PHP可执行文件只需要一个参数

这是窘况慢和主要是因为它涉及到发射了一个全新的分析器/解释器(更不用说处理),以每个PHP文件,以验证它的语法,我们有成千上万。

有一个更快的方法?

+7

你真的需要每次重新验证每个php文件吗?你是否为你的find添加一个'-mtime n',以便它只验证最近更新的东西? – Zoredache

+0

我认为这更多的是[SO]的主题,但我的第一个想法是检查你是否可以使用像PHP-FPM这样的优点,如果你总是需要检查所有内容,问题依然存在。 – Sven

+0

可能相关:http://stackoverflow.com/questions/3601031/is-there-a-good-robust-php-lint-or-code-quality-tool – GreenMatt

回答

2

什么搜索例如

`find . -mtime -7 -name "*.php" | xargs --max-args=1 php -l 

添加时间find命令,只确认已修改在上周的文件吗?

我假设你的大部分代码库不会每隔几天更改一次?

更新

你可能也想尝试

`find . -newer /path/to/file -name "*.php" | xargs --max-args=1 php -l 

找到比给定的,非常好用的一个较新的所有文件,特别是如果你的版本控制的变化有一定系统-newer标志文件每次结账或使用:

touch -t 201303121000 /path/to/file 

创建一个虚拟文件,用于更新

+0

这是一个很好的解决方案。 Git没有版本控制修改日期,所以运行'git checkout branch'会触及该分支中修改过的每个文件。这允许更小的时间范围,因此更少的文件被检查。 –

1

我已经放弃了对php -l完全出于同样的原因,但在我的情况(和也许在你的身上)没关系。

因为我正在使用PHPUnit进行单元测试,所以我不需要对正在测试的文件进行lint操作。如果该文件不能通过linter,它也不会通过任何测试(甚至只包含该文件的测试)。

如果没有覆盖文件的100%PHPUnit的,你可能能够伪造棉短绒的效果的东西,如:

class FakeLinterTest extends PHPUnit_Framework_TestCase { 
    public function testLintAllTheFiles() { 
     foreach ($this->listAllPHPFiles() as $file) { 
      include_once($file); 
     } 
    } 

    private function listAllPHPFiles() { 
     // Traverse your entire source tree. 
    } 
} 

该代码是完全未经测试。另外,如果你有一个大项目,你可能需要玩内存限制的游戏和/或将“棉绒”分成块,以阻止它杀死你的CI系统。