2009-08-01 80 views
5

我一般包括1個功能文件到我的網站的hader,現在這個網站是相當高的流量,我只是喜歡做的每一件小事,我可以,所以在這裏我的問題是,在PHP中哪個性能更好?

是更好的最佳包括多個較小的函數類型文件,只需要該頁面所需的代碼,或者它真的沒有什麼區別,只需將它加載爲一個大文件,我當前的函數文件就具有我整個站點的所有功能,它大約有4,000行長,並加載在網站上的每一個頁面加載,這是不好的?

回答

5

這很難說。 4,000行在文件解析領域並不那麼大。在代碼管理方面,它開始變得笨拙,但你不大可能通過將其分解成2,5或10個文件來看到很多可衡量的性能差異,並且只包含他們需要的少數幾個頁面(這是更好的編碼練習,但這是一個單獨的問題)。解析器需要打開的行數差異與文件數量差異看起來不夠大,不足以保證任何重要。我最初的反應是,這可能不是你需要擔心的問題。

在硬幣的另一面,我開始了一個企業級項目,其中一些操作有一個include()樹,該樹經常擴展到數百個文件中。對這些操作進行分析表明,僅在include()呼叫中花費的時間在10秒鐘的加載操作中達到2-3秒(這是PHP4)。

+1

請記住,這些4k行將被解析並運行,除非你有一些優化器運行哪個緩存編譯字節碼,但最後我看到這些東西是有成本的,所以通常不會安裝,除非你付出了代價。 – Joey 2009-08-02 00:04:42

+1

是的,那是真的。但是,處理多個文件的磁盤搜尋也有成本。如果你假設他把它分成10行,每行400行,平均每個文件中包括4行,那麼他的行數就是1600行,4行。問題是解析行數的減少是否超過了include()開銷。我假設這種差異將會特別小。唯一可以確定的方法就是對其進行基準測試。實際上,如果您處於這種優化級別,那麼操作碼緩存將花費更多時間。 – zombat 2009-08-02 00:19:07

1

通常,將文件分解爲更小的文件會更好,文件管理更明智,因爲您只需加載實際使用的文件。但是,在4000條線路上,它可能不會有太大的區別。

我建議類似這樣

function inc_lib($name) 
{ 
    include("/path/to/lib".$name.".lib.php"); 
} 

function inc_class($name) 
{ 
    include("/path/to/lib".$name.".class.php"); 
} 
+0

好主意謝謝 – JasonDavis 2009-08-02 00:32:44

1

我認爲這將是更好,如果你可能分裂的功能文件成適合於每個頁面組件的解決方案;並在適當的頁面中調用這些組件。只是我的2美分!

p/s:我是一名PHP業餘愛好者,我正在努力製作一個PHP網站;我沒有使用任何功能。那麼你能否告訴我你需要什麼功能的網站?

+0

php.net網站擁有所有原生php函數,但是您可以創建執行特定函數/任務的代碼並將其放入您自己的函數中,然後可以一次又一次地調用函數,所以您不必''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''不必寫電子郵件寫上相同的代碼塊 – JasonDavis 2009-08-02 00:22:02

1

根據我的經驗,有一個包含到處的大型包含文件實際上可能會導致性能下降。我參與了一個瀏覽器遊戲,我們將所有遊戲規則作爲動態生成的PHP(以及其他),並且文件的重量約爲500 KiB。它肯定會影響性能,我們考慮生成一個PHP擴展。然而,像往常一樣,我會說你應該做你現在正在做的事情,直到它是一個性能問題,然後根據需要進行優化。

3

如果你可以在你的服務器上安裝擴展,你應該看看APCsee also)。
順便說一下,它是免費的;-);但您必須是您的服務器的管理員才能安裝它;所以它通常不提供共享託管...

這就是所謂的「操作碼緩存」。

基本上,當一個PHP腳本被調用時,發生兩件事情:

  • 腳本 「編譯」 成操作碼
  • 操作碼被執行

APC保持在RAM中的操作碼;所以每次調用文件時都不必重新編譯文件 - 這對於CPU負載和性能來說都是一件好事。


要回答這個問題有點多:

  • 4000行的並不多,表演講;打開任何大型應用程序/框架的幾個文件,你將迅速得到幾千行
  • a 真的很重要要考慮的事情是可維護性:什麼會更容易與你合作,你的團隊 ?
  • 加載很多小文件可能意味着很多系統調用,這些調用很慢;但那些可能會被操作系統緩存...所以可能不是相關
  • 如果你正在做的甚至1個數據庫查詢,這一個(PHP服務器和數據庫服務器之間包括網絡往返)大概會比解析幾千行花費更多的時間;-)
1

如果你加載一個4000行文件,並使用可能1函數是10行,那麼是的,我會說這是效率低下。即使您使用了大量組合1000行的功能,它仍然是低效的。

我的建議是將相關功能組合在一起並將它們存儲在單獨的文件中。這樣,如果一個頁面只處理數據庫函數,例如只加載數據庫函數文件/庫。

因爲分解功能的原因是可維護性。如果你需要改變一個函數,你需要在你的monalithic包含文件中找到它。你也可能有非常非常相似的功能,但甚至沒有意識到它。通過他們所做的功能對函數進行排序可以讓您比較它們並擺脫不需要的東西,或者將兩個函數合併爲一個更通用的函數。

1

大部分時間光盤IO是什麼會殺死你的服務器,所以我認爲你從光盤獲取的較小文件更好。此外,如果可以安裝APC,那麼文件將被存儲在內存中,這是一個巨大的勝利。

相關問題