自動載入器最佳化#

預設情況下,Composer 自動載入器執行速度相當快。然而,由於 PSR-4 和 PSR-0 自動載入規則的設定方式,在最終解析類別名稱之前,它需要檢查檔案系統。這會讓速度變慢很多,但它在開發環境中很方便,因為當你新增一個新類別時,它可以立即被偵測到/使用,而不需要重建自動載入器組態。

不過,問題出在產品環境中,你通常希望事情發生得越快越好,因為你可以在每次部署時重建組態,而且新的類別不會在部署之間隨機出現。

基於這個原因,Composer 提供了幾種最佳化自動載入器的策略。

注意:不應該開發中啟用任何這些最佳化,因為它們全部會在新增/移除類別時造成各種問題。在開發設定中,效能提升並不值得拖慢進度。

最佳化層級 1:類別映射產生#

如何執行它?#

有幾個選項可以啟用這個功能

  • 在 composer.json 的 config 鍵中設定 "optimize-autoloader": true
  • 使用 -o / --optimize-autoloader 呼叫 installupdate
  • 使用 -o / --optimize 呼叫 dump-autoload

可以做些什麼?#

類別映射產生基本上會將 PSR-4/PSR-0 規則轉換成 classmap 規則。這讓事情快了很多,因為對於已知的類別,類別映射會立即回傳路徑,而且 Composer 可以保證類別存在其中,因此不需要檢查檔案系統。

在 PHP 5.6 以上版本,類別映射也會快取在 opcache 中,這會大幅改善初始化時間。如果你確定 opcache 已啟用,那麼類別映射應該會幾乎立即載入,然後類別載入會變快。

折衷方案#

此方法沒有真正的折衷方案。它在生產環境中應始終啟用。

唯一的問題是它沒有追蹤自動載入的遺失(例如,當找不到給定類別時),因此它們會改用 PSR-4 規則,並仍可能導致緩慢的文件系統檢查。為了解決此問題,有兩個 2 級最佳化選項,如果您有很多針對專案中不存在的類別執行的 class_exists 檢查,您可以選擇啟用其中一個選項。

最佳化等級 2/A:具有權威性的類別映射#

如何執行?#

有幾個選項可以啟用這個功能

  • 在 composer.json 的 config 金鑰中設定 "classmap-authoritative": true
  • 使用 -a / --classmap-authoritative 呼叫 installupdate
  • 使用 -a / --classmap-authoritative 呼叫 dump-autoload

它執行了什麼操作?#

啟用此選項會自動啟用 1 級類別映射最佳化功能。

此選項表示如果在類別映射中找不到任何內容,則該內容不存在,自動載入程式不應嘗試根據 PSR-4 規則在文件系統中搜尋。

折衷方案#

此選項讓自動載入程式始終快速傳回。反面是表示如果出於某種原因在執行期間產生一個類別,則不允許自動載入該類別。如果您的專案或任何相依性執行此操作,則您可能會在生產環境中遇到「找不到類別」的問題。請小心啟用此功能。

注意:這無法與 2/B 等級最佳化功能合併。您必須二擇一,因為它們以不同的方式解決相同的問題。

最佳化等級 2/B:APCu 快取#

如何執行?#

有幾個選項可以啟用這個功能

  • 在 composer.json 的 config 金鑰中設定 "apcu-autoloader": true
  • 使用 --apcu-autoloader 呼叫 installupdate
  • 使用 --apcu 呼叫 dump-autoload

它執行了什麼操作?#

此選項將 APCu 快取新增為類別映射的後備選項。但是,它不會自動產生類別映射,因此如果您願意,您仍應手動啟用 1 級最佳化功能。

無論是否找到類別,該事實都始終快取在 APCu 中,因此可以在下次請求時快速傳回。

折衷方案#

此選項需要 APCu,但您可能無法使用它。它也會將 APCu 記憶體用於自動載入用途,但它安全且不會導致類別無法被找到,例如上述的具有權威性的類別映射最佳化功能。

注意:這無法與 2/A 等級最佳化功能合併。您必須二擇一,因為它們以不同的方式解決相同的問題。

是否發現任何錯字?文件中有任何錯誤之處?分叉並編輯它!