この記事では、Xserverでcomposer実行時に『Allowed memory size of ~ bytes exhausted』が発生した時の解決方法について解説します。
先日、XserverにSSHでログインしてLaravelの環境構築をしていたところ、表題のようなエラーが発生しました。
調べたところ、簡単な手順で問題なく解決できたので備忘録として記しておきます。
発生した現象
実行したコマンドは以下。
composer require laravelcollective/html:^6.0
実行後、少し時間がかかった後にエラーに。
PHP Fatal error: Allowed memory size of 2097152000 bytes exhausted (tried to allocate 4096 bytes) in /usr/share/php/Composer/DependencyResolver/Solver.php on line 223
パッケージの追加に失敗しました。
エラーの詳細
今回エラーが発生した環境は以下の通りです。
発生した環境
- Xserver スタンダード
- PHP 7.4.28
- composer 1.10.22
Xserverデフォルトのcomposerは少しバージョンが古いです。
実際のエラー
$ composer require laravelcollective/html:^6.0
.
.
PHP Fatal error: Allowed memory size of 2097152000 bytes exhausted (tried to allocate 4096 bytes) in /usr/share/php/Composer/DependencyResolver/Solver.php on line 223
Fatal error: Allowed memory size of 2097152000 bytes exhausted (tried to allocate 4096 bytes) in /usr/share/php/Composer/DependencyResolver/Solver.php on line 223
Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.
そのまま訳すと『許可されたメモリサイズの2097152000バイトが使い果たされました』という感じですね。
親切に公式サイトへのURLが表示されているので確認してみました。
解決方法
公式のトラブルシューティングにあった通りに対応したところ、問題なく解決できました。
手順は2パターン。以下に詳細を書きます。
現在の設定値を確認
まずは、php.iniのmemory_limitの設定を以下のコマンドで確認します。
$ php -r "echo ini_get('memory_limit').PHP_EOL;"
2000M
Allowed memory size of 2097152000 bytes exhausted
エラー出力の内容が約2100Mなので明らかにメモリを使い果たしてます。
解決方法①:memory_limitの設定変更
まずはXserverにログイン。『サーバーパネル』→『PHP – php.ini設定』→『対象のドメインを選択』と進んでいき、『memory_limit』の設定を以下のように『-1』に設定します。
SSHでログインして設定を変えてもOK。
$ vi ~/YOUR_DAMAIN_NAME/public_html/php.ini
; Use -1 for unlimited or define an explicit value like 2G
memory_limit = -1
反映まで時間がかかる場合があるので少し待ちましょう。
解決方法②:COMPOSER_MEMORY_LIMITの環境変数を指定して実行
php.iniの設定変更はサイト全体に反映されてしまうため、今回はこちらで対応しました。
COMPOSER_MEMORY_LIMIT=-1 composer require laravelcollective/html:^6.0
こんな感じ。
これで実行したところ問題なくパッケージの追加ができました。
まとめ
この記事のまとめです。
COMPOSER_MEMORY_LIMITを指定するのがおすすめ
コマンドに『COMPOSER_MEMORY_LIMIT』の環境変数を追加するだけなので簡単。このコマンドに限ってのことなので、php.iniの設定変更の様にグローバルな影響をもたらしません。