當composer update卡住或提示記憶體不足時的分析

Limpid發表於2020-08-07

建議執行“composer update -vvv”檢視具體卡住在哪,一般在下載,寫入,讀取類似這種

Downloading https://repo.packagist.org/p/guzzlehttp/psr7.json
Writing /root/.cache/composer/repo/https---packagist.phpcomposer.com/provider-guzzlehttp$psr7.json into cache

這時可以ctrl+c直接中斷然後再次執行“composer update -vvv”發現它已經透過了剛剛卡住的地方了
具體原因不好不好說,不過我這測試伺服器就1G記憶體加上交換空間的1G還是會卡住,看了下composer的原始碼有這塊

$memoryLimit = trim(ini_get('memory_limit'));
    // Increase memory_limit if it is lower than 1.5GB
    if ($memoryLimit != -1 && $memoryInBytes($memoryLimit) < 1024 * 1024 * 1536) {
        @ini_set('memory_limit', '1536M');
    }
    // Set user defined memory limit
    if ($memoryLimit = getenv('COMPOSER_MEMORY_LIMIT')) {
        @ini_set('memory_limit', $memoryLimit);
    }
    unset($memoryInBytes, $memoryLimit);

說明如果設定php設定記憶體不夠1536M,它會直接把記憶體限制設定到此數量,另外下面有個配置可以配置composer的記憶體限制,透過檢視相關文件並對比測試後發現

//無限制
export COMPOSER_MEMORY_LIMIT=-1
//單位是byte (B)也即是300M
export COMPOSER_MEMORY_LIMIT=314572800

但如果設定比1536M低的記憶體在執行composer update等操作過程中還是會報記憶體不夠,目前能解決的方式:加swap,更改映象源

另外需要說明composer執行過程中由於是命令列執行,所以php.ini的記憶體限制並不生效

此處多說一句,有時laravel遷移環境後出現空白頁面這種情況,除了了內部兩個資料夾許可權問題,有時需要執行composer update更新下才能解決

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章