Laravel

PHP Fatal Error: Allowed memory size …? その原因と対処法【Laravel】

みなさん、こんにちは。どんぶラッコです。

今回はLaravel を開発している時に、メモリサイズオーバーのエラーにぶち当たってしまった場合の対処方法です。

composer コマンドを使ってコードをインストールしようとしたら、こんなエラーにぶち当たってしまうことあるんじゃないでしょうか?

PHP Fatal error:  Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes)

グランくん
グランくん
Fatal って深刻な・致命的な って意味だよね…かなりまずいんじゃないの?
どんぶラッコ
どんぶラッコ
処理が中断してしまうくらいヤバイエラーってことだね。でも内容をしっかり読んで対処すれば問題ないよ!

今回はこのエラーが発生してしまう原因と、その対処方法についてお話しします!

PHPのメモリ不足だよ!

結論から言うと、これはLaravelのエラーではなく、それを実行しているPHP側のエラーです。

メモリとは、主記憶装置(メインメモリ)とも呼ばれ、ざっくり言うとアプリケーションやプロセスが実行している際のデータや作業内容を預かってくれる場所です。

こちらのサイトが解説しているように、勉強机で例えると分かりやすいと思います。勉強机自体の大きさ(=メモリ容量)は決まっているので、各プロセスは仲良く机を使っています。

もし、一つのプロセスがメモリという机を占有してしまったら? …他のプロセスが使えなくなってしまいますよね。

そういうことを防ぐために、PHPはPHPで使えるメモリの最大量を自分で設定しているのです。

今回のエラーは PHPが”自分で設定した量以上のメモリを使おうとしているよーーー”という警告だった、というわけです。

対処方法

1. php.iniを書き換える

対処法としては、まず php.ini を書き換えることが挙げられます。

どんぶラッコ
どんぶラッコ
INIは initialization(初期化)の略語だよ。これはWindowsで使用されることが多い拡張子名だそうです

iniファイルの場所は php --ini で検索できます。

$ php --ini
Configuration File (php.ini) Path: /usr/local/etc/php/8.0
Loaded Configuration File:         /usr/local/etc/php/8.0/php.ini
Scan for additional .ini files in: /usr/local/etc/php/8.0/conf.d
Additional .ini files parsed:      /usr/local/etc/php/8.0/conf.d/ext-opcache.ini

今回の場合だと /usr/local/etc/php/8.0/php.ini を編集することになります。

memory_limit と書いてある場所があるのでここを書き換えればOKです!。

; Maximum amount of memory a script may consume
; http://php.net/memory-limit
memory_limit = 128M

2. コマンドに含めてしまう

iniファイルを書き換えるのは面倒くさい…でも今回だけ許したい…のような場合は、コマンドオプションとして含めることもできます。

例えば、

composer require hoge

を実行したい場合は

php -d memory_limit=512M /usr/local/bin/composer require hoge

のようにしてあげると実行ができます。

どんぶラッコ
どんぶラッコ
composer コマンドの位置は which を使って、ご自身の環境にあわせたパスで実行してください!

$ which composer                                   
/usr/local/bin/composer

困李ごとが解消できたら幸いです!

ABOUT ME
どんぶラッコ
ECコンサルタント、システムエンジニアを経て、quintet株式会社CTOに就任。普段はNuxt.jsやLaravelを使用しています。

\面白いと思ったら/

記事のシェア & Twitter のフォロー をお願いします!

@proglearn
RELATED POST

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です