composerを用いたインストール中にメモリ系のエラーが出た話

# 目的

- composerインストール中に出たメモリ系のエラーの解決方法をまとめる。

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| AWS EC2インスタンス | AmazonLinux2 | こちらの方法を用いてイメージからインスタンスを作成→[AWS EC2 をMacで使ってみよう!](https://qiita.com/miriwo/items/a1ab84c098008e43d042) |
| PHP | 7.4.5 | こちらの方法でインストール→[AWS EC2 AmazonLinux2 PHPをインストールする](https://qiita.com/miriwo/items/7d94303e7185e4118f52) |
| composer | 1.10.7 | こちらの方法でインストール→[AWS EC2 AmazonLinux2 composerをインストールする](https://qiita.com/miriwo/items/b25f9d4d74b7103f6ff6) |

# 読後感

- 下記に記載するメモリ系エラーが発生せずにcomposerインストールが正常に完了する。

# 問題までの経緯

1. 下記の方法でEC2のインスタンスを作成した。
    - [AWS EC2 をMacで使ってみよう!](https://qiita.com/miriwo/items/a1ab84c098008e43d042)
1. 下記の方法でPHP7.4.Xをインストールした。
    - [AWS EC2 AmazonLinux2 PHPをインストールする](https://qiita.com/miriwo/items/7d94303e7185e4118f52)
1. 下記の方法でcomposerをインストールした。
    - [AWS EC2 AmazonLinux2 composerをインストールする](https://qiita.com/miriwo/items/b25f9d4d74b7103f6ff6)
1. 下記コマンドを実行してLaravelをインストールしようとした。

    ```terminal
    $ composer global require laravel/installer
    ```

# 問題

- 下記の様なエラーが発生しcomposerインストールが行えない。

    ```terminal
    The following exception is caused by a lack of memory or swap, or not having swap configured
    ```
- エラーの全文を下記に記載する。

    ```terminal
    $ composer global require laravel/installer
    Changed current directory to /home/ec2-user/.config/composer
    Using version ^3.1 for laravel/installer
    ./composer.json has been updated
    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    Package operations: 20 installs, 0 updates, 0 removals
      - Installing symfony/polyfill-php80 (v1.17.0): 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
    
    Installation failed, reverting ./composer.json to its original content.
    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] [--fixed] [--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] [--] [<packages>]...
    ```

# 問題解決までの経緯

1. エラー文に記載されているリンクを閲覧してみる。
    - [https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors](https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors)

1. 何やらエラーに関する解決方法の記載があった。

    ![このページを翻訳しますか？_と_Troubleshooting_-_Composer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/300e75be-2c97-0be3-510e-137f421600d1.png)

1. 公式ドキュメントに従いコマンドを実行してみる。
1. 下記コマンドを実行して現在のスワップ領域の確認を行う。

    ```terminal
    $ free -m
    ```
1. 下記の様に出力された。スワップ領域の割り当てが0になってしまっていることが原因の様だ。

    ```terminal
    $ free -m
                  total        used        free      shared  buff/cache   available
    Mem:            983         378         465           0         139         465
    Swap:             0           0           0
    ```
1. 下記コマンドを実行してスワップ領域を設定する。(`/bin/dd: failed to open ‘/var/swap.1’: Text file busy`と出力されてしまった方はAWSのEC2コンソールより一旦インスタンスを再起動する。Linuxの物理マシンで実施中の方もLinux物理マシンを再起動する。※インスタンス再起動後はssh接続のコマンドが変化するため注意する。)

    ```terminal
    $ 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
    ```
1. 再度Laravelインストールコマンドを実行すると正常に実行できた。

# 参考文献

- [http://www.thirtyfive.info/entry/2018/07/14/aws_EC2%E3%81%A7php%E3%81%AEcomposer_update%E3%81%A7%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%EF%BC%9AThe_following_exception_is_caused_by_a_lack_of_memory_or_swap%2C_or_not_having_swap_configured](http://www.thirtyfive.info/entry/2018/07/14/aws_EC2%E3%81%A7php%E3%81%AEcomposer_update%E3%81%A7%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%EF%BC%9AThe_following_exception_is_caused_by_a_lack_of_memory_or_swap%2C_or_not_having_swap_configured)