【XServer】composerでライブラリインストール時にメモリエラーの解決法

【XServer】composerでライブラリインストール時にメモリエラーの解決法

この記事からわかること

  • XServerSSH接続後のエラー
  • エラー発生:composerライブラリインストール
  • PHP Fatal error: Allowed memory size of 2097152000 bytes exhaustedの原因と解決法は?

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

XServerにデプロイしているLaravelプロジェクトでcomposerを使いライブラリをインストールしようとした際に発生したエラーの原因と解決法をまとめていきます。

composerでライブラリインストール時に起きたメモリエラー

XServerにSSHで接続後、composerを使ってライブラリを組み込もうとした際に予期せぬエラーが発生してしまいました。

ライブラリ「intervention/image」を組み込むコード

$ composer require intervention/image

発生したエラー

PHP Fatal error:  Allowed memory size of 2097152000 bytes exhausted 
(tried to allocate 4096 bytes) in /usr/share/php/Composer/DependencyResolver/RuleWatchGraph.php on line 52
Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.

このエラーは調べたところphp.iniに設定されているメモリ上限をオーバーした際に出るエラーのようです。

これを解決する方法は1つ。

php.iniに設定されているメモリ上限を増やす

なので早速上限を増やすために試行錯誤していきます。

XServerのphp.iniはどこにある?

ではXServerの「php.ini」はどこにあるのでしょうか?

実はphp.iniは2ヶ所あります。

XServerのphp.ini

  1. 通常のphpのphp.ini
  2. CLI(コマンドライン)版のphpのphp.ini

ここでいう通常の「1.通常のphpのphp.ini」とはサーバーパネルで変更可能になっている部分です。

Xサーバーパネル」にログインすると「PHP」>「php.ini設定」という項目が用意されています。

Xサーバー-top

ここで「php.ini」の設定変更を行うことが可能ですが、実はcomposerでインストールしようとした際に起きている「PHP Fatal error」は別のphpから発生していました。

CLI版 PHPのphp.iniを変更する

CLI版のphpはXserverにSSH接続後に使用していくphpです。以下コマンドでSSH接続後、CLI版 PHPの存在を確認してみます。

$ ssh -l サーバーID -i ~/.ssh/サーバーID.key サーバーID.xsrv.jp -p 10022

バージョンを確認するとPHP 8.0.6 (cli) の文字が出てきます。これはサーバーパネルから変更できるphpとは別物なので、サーバーパネルでバージョンを変更してもCLI版のバージョンは変わりません

$ php -v
PHP 8.0.6 (cli) (built: May 18 2021 00:07:16) ( NTS )

では現在CLI版に設定されている「php.ini」の中身を以下のコマンドで見てみます。

$ php -r 'phpinfo();'
phpinfo()
PHP Version => 8.0.6
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
max_input_time => -1 => -1
max_input_vars => 1000 => 1000
memory_limit => 2000M => 2000M  ←ココ

するとメモリ上限を設定しているmemory_limitがありました。

ちなみにこれだともっと簡単にいけました。

$ php -r "echo ini_get('memory_limit').PHP_EOL;"
2000M // 結果

ではここから「php.ini」の中身を変更していきます。

XServerのCLI版「php.ini」の中身を変更する

まずは「php.ini」が格納場所のパスを返してくれるコマンドを使ってどこにあるか探します。

$ php --ini | grep "php.ini"
Configuration File (php.ini) Path: /opt/php-8.0.6/etc
Loaded Configuration File:         /opt/php-8.0.6/etc/php.ini

すると/opt/php-8.0.6/etc/php.iniにあると教えてくれたのでVimを使って編集を試みます。

$ sudo vi /opt/php-8.0.6/etc/php.ini

すると以下のようなメッセージが表示されパスワードを求められました。

あなたはシステム管理者から通常の講習を受けたはずです。
これは通常、以下の3点に要約されます:

    #1) 他人のプライバシーを尊重すること。
    #2) タイプする前に考えること。
    #3) 大いなる力には大いなる責任が伴うこと。

[sudo] XXXXXXXX のパスワード:
残念、また試してください。
[sudo] XXXXXXXX のパスワード:
残念、また試してください。
[sudo] XXXXXXXX のパスワード:
sudo: 3 回パスワード試行を間違えました

そして自分のサーバーパスワードを3回試したのですが失敗してしまいました。

調べてみると私たちユーザーが変更できる範囲を/opt/php-8.0.6/etc/php.iniは超えてしまっているようです。

つまり、「CLI版phpで使えるメモリは2000Mまで」ということですね。。。。

インストールするための解決法

このままではインストールできないので是非はわかりませんが、とりあえず解決する方法をお伝えします。(やる時は自己責任でお願いします。)

composerではインストール時に一時的にメモリのリミットを外せるコマンドが存在します。

$ COMPOSER_MEMORY_LIMIT=-1 インストールコマンド

これはCOMPOSER_MEMORY_LIMIT-1(無制限)を渡すことでこのコマンド実行時のみ設定を変更できるコマンドです。

なので私も以下のように実行してみました。

$ COMPOSER_MEMORY_LIMIT=-1 composer require intervention/image

Package manifest generated successfully.
82 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan vendor:publish --tag=laravel-assets --ansi --force
No publishable resources for tag [laravel-assets].
Publishing complete.

無事インストールに成功しました!!

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index