PHP 教程:Composer 最佳實踐

八重櫻發表於2020-11-06

概述

Composer 是 PHP 應用程式的依賴管理器,最初釋出於大約 8 年前,2012 年 3 月。

在 php 中使用 Composer 可以提高程式碼的可重用性,並使你的專案能夠輕鬆地整合來自Packagist(主要的 PHPComposer 庫)的 PHP 庫。今天,我們將重點介紹幾個部署最佳實踐。

Composer 可能會變慢

這篇文章將關注如何讓 Composer 速度更快,並在每次部署應用程式時不再需要使用全新的 Composer 安裝來安裝軟體包。

Magento 是一個需要大量記憶體的 composer 專案的例子。如果你需要為每個部署安裝 Composer,你能想象需要多少記憶體嗎?Composer 可能會因為記憶體不足而失敗,如Stack Overflow 帖子所述。

儘管將包新增到你的專案中很容易,但在 Amezmo 這裡,我們採用保守的方法新增新的專案依賴項,原因如下。

  • 減慢初始 Composer 安裝速度
  • 每個 Composer 包都會增加新安全問題的可能性

 

最佳做法

--no-ansi

此標誌禁用 ANSI 輸出,這意味著彩色輸出將被禁用。彩色輸出,如綠色和紅色字型顏色以及人眼喜歡的背景顏色。這對於我們手動執行 Composer 時非常有用,但是對於自動部署,我們不想用奇怪的字元擾亂我們的日誌檔案。

--no-interaction

同樣,在自動化部署的環境中,我們不希望部署在等待輸入時停滯不前。此標誌阻止 Composer 要求使用者輸入。

--optimize-autoloader

此標誌告訴 Composer 將生成的程式碼自動載入。autoloader 是當你的入口點確實需要 'vendor/autoload.php' 時呼叫的;

--no-progress

由於進度報告使用特殊的終端 ANSI 程式碼,因此我們不希望報告進度,因為它會使我們的日誌檔案混亂。在進行非互動式

部署和 composer 安裝時,這是完全沒有必要的。

 

--no-dev

這一點至關重要。我們從不希望將開發包安裝到生產伺服器上。像 phpunit 和其他不應讓其投入生產的軟體包被視為 “dev”軟體包。它們在 composer.json 檔案中的 “require-dev” 屬性下具有特殊條目。

 

--profile

這個是可選的,但是我總是喜歡包含它,因為它顯示了 Composer 用於安裝單個依賴項的記憶體量。

 

如何在部署時快取 Composer 程式包

現在,我們已經定義了生產級 composer 安裝命令,讓我們簡單地介紹一下在部署時使 Composer 更快的方法。

步驟 1。

在你的 Webroot 之外的某個地方建立一個全域性 Composer vendor 目錄,當然該目錄不能公開訪問。

注意:Amezmo 使用如下所示的根目錄佈局,因此我們將在下面的 bash 命令中使用它。當然,你可以用自己的目錄替換

這些目錄,並且可以實現所需的結果。

/webroot
|----logs
|----vendor
|----storage
|----current -> /webroot/release/${TIMESTAMP}.${COMMIT_ID}
|----release
|-------${TIMESTAMP}.${COMMIT_ID}
|-------${TIMESTAMP}.${COMMIT_ID

/webroot/vendor 是我們的全域性軟體包目錄,將從中為每個版本建立連結。

 

執行以下命令從 release 目錄建立的 vendor 目錄連結到全域性 vendor 目錄。每次部署時都必須執行此操作,並且在從發行目錄執行 composer 安裝之前。

ln -sT /webroot/vendor webroot/release/${TIMESTAMP}.${COMMIT_ID}/vendor

請注意,從 release 目錄執行 composer install 之前,執行上述命令至關重要。以下是步驟:

  • 應該建立 release 目錄
  • 執行 Git 獲取原始碼
  • 執行以上命令
  • 最後執行 composer install

按照上述順序完成所有操作後,你的軟體包將被 “快取” 到 /webroot/vendor 目錄中,並且每次部署應用程式時都不需要重新安裝軟體包。

結論

  • 定義了一個 Composer 命令,該命令消除了所有不必要的功能。
  • 重點介紹了在部署時快取 Composer 軟體包的最佳實踐部署模式。

第 1 步。

在 Webroot 完全不在的地方建立一個全域性 Composer 供應商目錄,並(此段落重複,應刪除)

 

相關文章