Cloud9でcomposerを使ってLaravel生成、Cannot allocate memory対処

  • URLをコピーしました!

侍エンジニア塾でPHP Laravelアプリの学習をしています。

塾の中ではAWS Cloud9に開発環境を作ってもらって、その中で学習を進めているのですが自分でも開発環境を作れるようにしておかないといけないな、と思った次第です。

目次

Cloud9の環境

Cloud9はPHPやMySQLやcomposerが既にインストールされているので、すぐに開発を始められるのが魅力ですよね!でも、実際に使ってみると、ちょっとした問題にぶつかることも…。今回は、Laravelプロジェクトを生成しようとした際に発生した「Cannot allocate memory」エラーとその解決策についてご紹介します。

composer create-projectでCannot allocate memory

以下のコマンドでLaravelプロジェクトの生成を行おうとしたら…

composer create-project laravel/laravel laravel-test --prefer-dist

途中でエラーが出てしまって。laravel-testディレクトリは生成されたけど、完了してなさそう…。エラーメッセージがよくわかんないですよね。

% composer create-project laravel/laravel laravel-test --prefer-dist
Installing laravel/laravel (v5.4.30)
  - Installing laravel/laravel (v5.4.30): Loading from cache
Created project in laravel-test
> php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 61 installs, 0 updates, 0 removals
  - Installing doctrine/inflector (v1.1.0): Loading from cache
    proc_open(): fork failed - Cannot allocate memory
    The archive may contain identical file names with different capitalization (which fails on case insensitive filesystems)
    Unzip with unzip command failed, falling back to ZipArchive class
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

PHP Warning:  proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952

Warning: proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952


  [ErrorException]
  proc_open(): fork failed - Cannot allocate memory

create-project [-s|--stability STABILITY] [--prefer-source] [--prefer-dist] [--repository REPOSITORY] [--repository-url REPOSITORY-URL] [--dev] [--no-dev] [--no-custom-installers] [--no-scripts] [--no-progress] [--no-secure-http] [--keep-vcs] [--remove-vcs] [--no-install] [--ignore-platform-reqs] [--] [] [] []
[/code]

もちろんLaravelのインストールにも失敗…。Laravelのバージョンは変わっていますが、同じようなエラーが出ることがあります。

% composer global require "laravel/installer=~1.1"
Changed current directory to /home/ec2-user/.composer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 13 installs, 0 updates, 0 removals
  - Installing symfony/process (v3.4.20): Downloading (100%)
    proc_open(): fork failed - Cannot allocate memory
    The archive may contain identical file names with different capitalization (which fails on case insensitive filesystems)
    Unzip with unzip command failed, falling back to ZipArchive class
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

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

PHP Warning:  proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952

Warning: proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952

  [ErrorException]
  proc_open(): fork failed - Cannot allocate memory

require [--dev] [--prefer-source] [--prefer-dist] [--no-progress] [--no-suggest] [--no-update] [--no-scripts] [--update-no-dev] [--update-with-dependencies] [--update-with-all-dependencies] [--ignore-platform-reqs] [--prefer-stable] [--prefer-lowest] [--sort-packages] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--] []...
[/code]

Amazon Cloud9のプランはt2.microというのを使っていて、これがメモリ1GBしかないからメモリ領域を確保できずにエラーになっているのだと思います。Cloud9のインスタンスタイプによって利用できるメモリ量が異なるので、注意が必要です。

「Cannot allocate memory」エラーの原因とは?

このエラーは、Composerがパッケージのインストールや更新を行う際に、必要なメモリをシステムが確保できない場合に発生します。特に、Laravelのような大規模なフレームワークをインストールする際には、多くのメモリが必要となります。Cloud9のt2.microインスタンスはメモリが少ないため、このエラーが発生しやすいのです。

また、このエラーはメモリ不足だけでなく、スワップ領域が設定されていない場合にも発生することがあります。スワップ領域とは、物理メモリが不足した場合に、ハードディスクの一部を仮想メモリとして使用する仕組みです。

Cloud9でスワップファイルを作る

この問題を解決するために、スワップ領域というのを作ってあげてうまくいったんです!スワップ領域を作ることで、メモリ不足を補うことができます。

sudoをつけないと該当ディレクトにPermission deniedになってしまったので、sudoを付けてコマンドを入力。

$sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
$sudo /sbin/mkswap /var/swap.1
$sudo /sbin/swapon /var/swap.1

これらのコマンドを実行することで、1GBのスワップファイルが作成されます。/bin/ddコマンドは、指定されたサイズのゼロで埋められたファイルを生成します。/sbin/mkswapコマンドは、生成されたファイルをスワップ領域としてフォーマットします。そして、/sbin/swaponコマンドは、スワップ領域を有効にします。

そのうえでもう1度

composer create-project laravel/laravel laravel-test --prefer-dist

これでプロジェクトを生成できた!やったー!🎉

スワップ領域の確認方法

スワップ領域が正しく設定されているか確認するには、以下のコマンドを実行します。

swapon --show

このコマンドを実行すると、現在有効になっているスワップ領域の情報が表示されます。

より快適な開発環境のために

Cloud9でLaravel開発を行う場合、t2.microインスタンスよりも、よりメモリの多いインスタンスタイプを選択することをおすすめします。例えば、t3.mediumやt3.largeなどのインスタンスタイプは、より多くのメモリを搭載しており、快適に開発を行うことができます。

また、Composerの設定を変更することで、メモリ使用量を抑えることも可能です。Composerの設定ファイル(composer.json)に、以下の設定を追加してみてください。

{
    "config": {
        "memory-limit": "256M"
    }
}

この設定により、Composerのメモリ使用量を256MBに制限することができます。ただし、メモリ使用量を制限しすぎると、パッケージのインストールや更新が失敗する可能性があるため、注意が必要です。

さらに、定期的にComposerのキャッシュをクリアすることも有効です。Composerのキャッシュには、ダウンロードしたパッケージの情報が保存されていますが、キャッシュが肥大化すると、メモリ使用量が増加する可能性があります。以下のコマンドを実行することで、Composerのキャッシュをクリアすることができます。

composer clear-cache

まとめ

Cloud9でLaravelプロジェクトを生成する際に「Cannot allocate memory」エラーが発生した場合、スワップ領域の作成やインスタンスタイプの変更、Composerの設定変更などの対策を行うことで、問題を解決することができます。これらの対策を参考に、快適なLaravel開発環境を構築してくださいね!

てことで以上です。


目次