2013-01-07 173 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系統。