下面由composer教學專欄為大家介紹 composer autoload 自動載入效能最佳化指南,希望對需要的朋友有幫助!
composer 提供的 autoload 機制使得我們組織程式碼和引入新類別庫非常方便,但是也使專案的效能下降了不少 。
composer autoload 慢的主要原因在於來自對PSR-0 和PSR-4 的支持,載入器得到一個類別名稱時需要到檔案系統裡尋找對應的類別檔案位置,這導致了很大的效能損耗,當然這在我們開發時還是有用的,這樣我們新增的新的類別檔案就能即時生效。但是在生產模式下,我們想要最快的找到這些類文件,並載入他們。
因此 composer 提供了幾種最佳化策略,以下說明下這些最佳化策略。
第一層級(Level-1)最佳化: 產生classmap
#如何運作:
##執行指令 composer dump-autoload -o(-o 等同於--optimize)
原理:##這個指令的本質是將PSR-4/PSR- 0 的規則轉換為了classmap 的規則, 因為classmap 中包含了所有類別名稱與類別檔案路徑的對應關係,所以載入器不再需要到檔案系統中尋找檔案了。可以從 classmap 直接找到類別檔案的路徑。
注意事項建議開啟 opcache , 這樣會極大的加速類別的載入。
php5.5 以後的版本預設自帶了 opcache 。
這個指令並沒有考慮到當在classmap 中找不到目標類別時的情況,當載入器找不到目標類別時,仍舊會根據PSR-4/PSR-0 的規則去檔案系統中查找
第二層級(Level-2/A)最佳化:權威的(Authoritative)classmap執行指令:
執行指令
composer dump-autoload -a(-a 等同於--classmap-authoritative)##原理
執行這個指令隱包含的也執行了Level-1 的指令, 也就是同樣也是產生了classmap,差別在於當載入器在classmap 中找不到目標類別時,就不會再去檔案系統中尋找(即隱含的認為classmap 中就是所有合法的類,不會有其他的類了,除非法調用)
注意事項
#如果你的項目在運行時會生成類,使用這個優化策略會找不到這些新產生的類別。
第二層級(Level-2/B)最佳化:使用APCu cache
執行指令:
執行指令composer dump-autoload --apcu
原理:
使用這個策略需要安裝apcu 擴充功能。
apcu 可以理解為一塊內存,並且可以在多進程中共享。 這個策略是為了在Level-1 中classmap 中找不到目標類別時,將在檔案系統中找到的結果儲存到共享記憶體中, 當下次再尋找時就可以從記憶體中直接返回,不用再去檔案系統中再次查找。 在生產環境下,這個策略一般也會與Level-1 一起使用, 執行composer dump-autoload -o --apcu, 這樣,即使生產環境下生成了新的類,只需要文件系統中查找一次即可被緩存, 彌補了Level-2/A 的缺陷。如何選擇最佳化策略?
要根據自己專案的實際情況來選擇策略,如果你的專案在運行時不會產生類別檔案並且需要composer 的autoload 去加載,那麼使用Level-2/A 即可,否則使用Level-1 及Level-2/B是比較好的選擇。
幾個提示
Level-2的最佳化基本上都是Level-1 優化的補充,Level-2/A 主要是決定在classmap 中找不到目標類別時是否繼續找下去的問題,Level-2/B 主要是在提供了一個快取機制,將在classmap 中找不到時,將從檔案系統中找到的檔案路徑快取起來,加速後續查找的速度。
#
以上是分享composer autoload自動載入效能優化指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!