【XServer】composerでライブラリインストール時にメモリエラーの解決法
この記事からわかること
- XServerにSSH接続後のエラー
- エラー発生: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
- 通常のphpのphp.ini
- CLI(コマンドライン)版のphpのphp.ini
ここでいう通常の「1.通常のphpのphp.ini」とはサーバーパネルで変更可能になっている部分です。
「Xサーバーパネル」にログインすると「PHP」>「php.ini設定」という項目が用意されています。
ここで「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.
無事インストールに成功しました!!
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。