Monthly Archives: August 2008

使用 PHP Framework 的效能問題

PHP Framework 裡會大量使用 require_once(),由於需要判斷是否載入過檔案,require_once() 會使用 realpath() 取得檔案實際路徑資訊當作判斷條件,而這點會有效能上的問題。

其他人其實也遇過,參考:PHP Performance tip: require versus require_once,其中 comment 的部份也說明了目前 Google 到的方法是沒有用的。

FreeBSD libc 裡的 realpath(3) 會使用 lstat(2),而 FreeBSD 的 lstat(2) 因為用到 VFS_LOCK_GIANT(9),所以在 FreeBSD 上很多隻 PHP 同時用 realpath() 的時候效能並不好。

Linux 的 libc 據說沒這個問題 (我沒有實際去 trace libc code,聽別人轉述的),不過實際灌了一台 Debian 跑 PHP 發現解決了 lstat() 的問題後,require_once() 造成的效能問題還是很嚴重。

目前的解法與 Wikia 類似,想辦法讓 require_once() 能夠很快找到 code,不過還是得想辦法從 PHP 本身下手,改善 require_once() 的效能,讓 PHP Framework 發展的時候不用綁手綁腳。

PS:目前的方法是改掉 Zend Framework 裡面的 require_once(),由於我們有一個統一的 /pixnet,把裡面的程式碼全部都用絕對路徑。另外在 Autoload 的部份用 APC cache,避免再到 include_path 內重複尋找。