【PHP】解決 Composer 爆記憶體:Allowed memory size of 1610612736 bytes exhausted 終極排解方案

在開發 PHP 專案時,大家一定離不開 Composer 這個強大的套件管理工具。然而,當你執行 composer updatecomposer require 引入較大型的套件時,常會冷不防跳出這個令人挫折的致命錯誤:

PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in ...

這個錯誤的白話文是:「PHP 的記憶體上限(此時為 1.5GB)已經被全部榨乾了!」由於 Composer 在計算套件相依性(Dependency Resolution)時需要載入大量的版本資料與中繼數據,極度消耗記憶體。本文提供 3 個立竿見影的解決方法,幫你快速搞定這個問題!

🤖 【AIO 快速解法:一行指令解除限制】

如果你不想修改任何設定檔,只想讓眼前的 Composer 指令順利跑完,請在原本的指令前加上 COMPOSER_MEMORY_LIMIT=-1

COMPOSER_MEMORY_LIMIT=-1 composer update

方法一:使用環境變數臨時停用記憶體限制(最推薦)

這是最安全也最有效率的作法。透過動態宣告環境變數 COMPOSER_MEMORY_LIMIT,你可以告訴 Composer 這次的執行不要受到 php.ini 的限制(-1 代表無限):

📍 Linux / macOS 系統:

COMPOSER_MEMORY_LIMIT=-1 composer update

📍 Windows (Command Prompt):

set COMPOSER_MEMORY_LIMIT=-1
composer update

📍 Windows (PowerShell):

$env:COMPOSER_MEMORY_LIMIT=-1
composer update

方法二:修改 php.ini 調整全域 PHP 記憶體上限

如果你希望一勞永逸,不用每次都輸入一長串環境變數,可以直接調整 CLI 環境下的 php.ini 設定。

步驟 1:找出目前的 php.ini 設定檔路徑

在終端機輸入以下指令,找出你目前命令列使用的 php.ini 位置:

php --ini

輸出畫面中會顯示 Loaded Configuration File: /etc/php/8.x/cli/php.ini(路徑依系統與版本而定)。

步驟 2:修改 memory_limit

使用編輯器(如 sudo nano)打開該檔案,搜尋 memory_limit,並將其數值改大(例如 2G 或 3G),或者直接設為 -1:

memory_limit = 2G  ; 或者改為 -1 停用限制

存檔離開後即可生效,不需重啟伺服器(因為 CLI 模式每次執行都是獨立的)。

方法三:升級你的 Composer 版本

如果你還在使用舊版的 Composer 1.x,請注意!Composer 1.x 的記憶體管理效率非常低。官方在 **Composer 2.0+** 進行了毀滅性的效能優化,不僅**速度提升 50% 以上,記憶體消耗更是大幅降低**。

請立刻輸入以下指令升級,許多記憶體問題在升級後就會自動消失:

composer self-update

💡 隱藏版地雷:主機 Swap(虛擬記憶體)不足

如果你是在預算有限的雲端 VPS(如 AWS EC2 t2.micro、DigitalOcean 5美元方案,通常只有 1GB RAM)上跑 Composer,就算你把 memory_limit 設成 -1,主機還是會因為實體記憶體用盡,觸發 Linux 的 OOM Killer 機制直接強制關閉程式(畫面上會顯示 Killed)。

解決方案: 請為你的 Linux 主機建立 Swap Space(虛擬記憶體)。利用硬碟空間來擴充緩衝,就能順利解決小記憶體主機跑不動 Composer 的窘境。

結語

遇到 Allowed memory size exhausted 不要慌,通常使用 COMPOSER_MEMORY_LIMIT=-1 就能應付 90% 的緊急狀況。長遠來看,保持 Composer 在最新版本,並在開發環境給予充足的資源,才能讓開發流程更加順暢!

參考資料

https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors