2008-09-18 48 views
1

對於我們的在線遊戲,我們已經寫了大量的PHP類和功能,按照主題分組在文件和文件夾中。最後,我們在我們稱爲libs的一組文件中包含我們所有的後端代碼(邏輯&數據庫訪問層),並在我們的GUI(網頁,表示層)中使用include include include('pathtolib /file.inc')如何創建一個快速的PHP庫?

問題是我們一直懶惰的包含和大多數include語句在我們的libs文件中產生,從每個網頁,每次我們包含任何庫文件,我們實際上加載整個庫,文件逐個文件。

這對性能有重大影響。所以最好的解決方案是什麼?

  • 刪除libs文件中的所有包含語句,並只從網頁中調用必要的語句?
  • 做點別的?

服務器使用經典的LAMP堆棧(PHP5)。

編輯:我們有簡單功能(遺留原因和大部分代碼)和類的組合。所以自動加載是不夠的。

回答

3
  • 管理所有包括手動,只需要在那裏
  • 設置你的include_path只在那裏它必須是,默認的是一樣的東西:/ usr/lib中/梨/:/ usr/lib中/ PHP,僅在它必須是點吧,php.net/set_include_path
  • 不要使用自動加載,它的速度慢,使APC和等效緩存的工作變得更加困難
  • 您可以關閉「STAT」以誠合作APC,但必須在每次更新文件時手動清除緩存
3

如果你已經以面向對象的方式完成了你的編程,你可以使用autoload函數,它會在你調用它們時按需從源文件加載類。

編輯:我注意到有人低估了兩個提到自動加載的答案。我們錯了嗎? __autoload函數的開銷太高而無法用於性能目的?如果有什麼我不瞭解這種技術,我真的很想知道它是什麼。

+0

我實際上想知道同樣的事情。在使用__autoload函數時我沒有注意到任何嚴重的開銷,它對我很好。 – Twan 2008-09-18 15:11:09

+0

當然我也對答案感興趣。 – Veynom 2008-09-18 16:01:38

+0

我的猜測是downvote是因爲海報稱自動加載不會工作,因爲他們有功能和類的組合。 – 2008-09-18 16:42:33

1

自從我使用php以來已經有一段時間了,但是在這種情況下Zend Optimizer或Cache不應該有什麼幫助嗎? php是否仍然加載&爲每個請求重新編譯每個包含的文件?

我不確定自動加載是否是答案。如果包含這些文件,它們可能需要包括它在內的類,所以它們仍然會自動加載。

3

如果你想得到真正的核心,做一些靜態分析,並找出什麼時候需要什麼庫,只包括那些。

如果您使用的是include而不是include_once,那麼這裏也有一些速度節省。

所有這一切,馬特關於Zend Optimizer的回答是正確的。如果你想要的話,試試高級PHP緩存(APC),這是一個操作碼緩存,並且是免費的。它應該在PECL存儲庫中。

1

使用字節碼緩存(理想情況下爲APC),以便PHP不需要在每個頁面加載時解析庫。請注意,使用自動加載將會否定使用字節碼緩存的好處(您可以閱讀更多關於此here)。

2

您可以使用spl_autoload_register()或__autoload()來創建包含類所需文件所需的任何規則,但autoload會引入其自身的性能開銷。你需要確保你使用的所有東西都是使用php.ini設置或apache配置預先設置的。

對於具有泛型函數的文件,我建議您將它們包裝在實用程序類中,並執行一個簡單的查找和替換操作,以便使用util :: function()替換所有函數()調用,自動加載這些函數(再次,調用方法而不是全局函數引入了開銷)。

基本上,最好的辦法是通過代碼返回並通過修復包含問題來還清設計債務。這會給你最的性能優勢,它可以讓你做最喜歡eAccelerator在,Zend的平臺和APC

優化器的

這裏是裝載東西的樣品的方法動態

public static function loadClass($class) 
{ 
    if (class_exists($class, false) || 
     interface_exists($class, false)) 
    { 
     return; 
    } 

    $file = YOUR_LIB_ROOT.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php'; 

    if (file_exists($file)) 
    { 
     include_once $file; 
     if (!class_exists($class, false) && 
      !interface_exists($class, false)) 
     { 
      throw new Exception('File '.$file.' was loaded but class '.$class.' was not found'); 
     } 
    } 
} 
1

使用profiler 。如果你嘗試優化而沒有采取措施,你就會盲目工作。

2

您要找的是Automap PECL extension

它基本上允許在加載預先計算的地圖文件時只需很小的開銷即可自動加載。如果你知道一個特定的目錄只能從某些PHP文件中提取,你還可以對地圖文件進行細分。

您可以閱讀更多關於它here