先日、あるサーバーでcomposerをinstallしようとしたところ、
The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details
[ErrorException]
proc_open(): fork failed – Cannot allocate memory
のようなエラーが出ました。要はメモリ不足ですね。
AWS(EC2)だったんですが、どうやらmicroだったようで、メモリも2Gしかないようです。
PHPのメモリーがらみ制限
PHPに割り当てるメモリの解放です。
その前にPHPに割り当てるメモリを測定してみましょう。
php -r 'phpinfo();' | grep memory_limit
でPHPに割り当てられてるメモリを測定できます。
んで、こっからの対処法は以下のような感じでしょう。
- php.iniそのものをいじってmemory_limitをあげる
一番クリティカルでサーバー内全体に影響が出ます。 - ini_set(‘memory_limit’ ‘xxxxm’)
そのプログラム単体でのメモリ使用量のコントロールです。 - 下記のようなコマンドでコマンド実行時に一時的に割り当てることができます。
php -d memory_limit=-1 /usr/local/src/composer.phar install
一般のcomposerコマンドですと以下のようになります。php -d memory_limit=-1 /usr/bin/composer require aws/aws-sdk-php
*ちなみに-1と設定するとメモリ上限が上限なしになります。
スワップ割り当て
ところが今回のケースでは上記の方法では解決できませんでした。どうやら根本的にメモリ不足らしく色々調べたところスワップ領域を作成すれば良いとのこと。
下記コマンドで1G分のスワップを割り当てて無事解決できました。
1 2 3 |
# /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024 # /sbin/mkswap /var/swap.1 # /sbin/swapon /var/swap.1 |
こういうのってOSインストール実行時にやるもので、そんなことが可能なのか?と思いましたが、コマンドでできるんですね・・・
参考リンク
composer updateがPHPのメモリ制限に引っかかってできない時