EC2のLaravelにintervention/imageをインストール

Laravel
スポンサーリンク
language

あるウェブサービスで容量の大きい画像(2〜数十MB)の画像加工をして保存するロジックで、

500 リクエストを処理できません。」

とエラーが出て画像を加工・保存できないことがあります。

この記事ではLaravelでintervention/imageを使って画像を加工・保存できないときの解決方法をご紹介します。

スポンサーリンク

intervention/imageをインストール

Laravelでintervention/imageを使って画像加工するには次のパッケージが必要なのでインストールします。

  • intervention/image
  • php-gd

intervention/imageはcomposerでインストールします。

[ec2-user@ip-10-0-1-91 pictan]$ composer require intervention/image
Using version ^2.6 for intervention/image
./composer.json has been updated
Running composer update intervention/image
Loading composer repositories with package information
...

Publishing complete.

php-gdはyumでインストールします。

[ec2-user@ip-10-0-1-91 pictan]$ sudo yum install --enablerepo=remi, php-gd php-xml
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                               | 3.7 kB     00:00     
...

インストール:
  php-gd.x86_64 0:8.0.8-1.amzn2                                                 

完了しました!

メモリを増やす

次にメモリを増やします。
以下の設定ファイルで使用できるメモリを増やす必要があります。

  • php.ini
  • apache

500 リクエストを処理できません。

php.iniでメモリを増やす

まずはphp.iniでメモリを増やします。
php.iniのファイルの場所はphp --iniで探すことができます。

[ec2-user@ip-10-0-1-91 pictan]$ php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File:         /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed:      /etc/php.d/20-bz2.ini,
...

php.iniの場所がわかったので、次にメモリを増やします。
次の3つの容量を適宜増やしてください。

  • upload_max_filesize
  • post_max_size
  • memory_limit

post_max_sizeupload_max_filesizeと同じか大きくする必要があります。

memory_limitは一番大きくしてください。

[ec2-user@ip-10-0-1-91 pictan]$ sudo vim /etc/php.ini

upload_max_filesize = 30M
post_max_size = 40M
memory_limit = 256M

apacheのメモリを増やす

次にapacheの設定ファイルで容量を増やします。

apacheの設定ファイルも次の3つの容量を適宜増やしてください。

  • upload_max_filesize
  • post_max_size
  • memory_limit

post_max_sizeupload_max_filesizeと同じか大きくする必要があります。
memory_limitは一番大きくしてください。

[ec2-user@ip-10-0-1-91 pictan]$ sudo vim /etc/httpd/conf/httpd.conf

upload_max_filesize = 30M
post_max_size = 40M
memory_limit = 256M

最後にアパッチを再起動します。

[ec2-user@ip-10-0-1-91 pictan]$ sudo systemctl restart httpd

画像加工後、メモリ解放

ロジックの中にもメモリを解放するようにします。

intervention/imagedestroy()を使えば画像加工で使用したメモリを解放できます。

Frees memory associated with the current image instance before the PHP script ends. Normally resources are destroyed automatically after the script is finished.

Of course, the image instance is no longer usable after the method has been called.

PHPスクリプトが終了する前に、現在のイメージインスタンスに関連付けられているメモリを解放します。通常、リソースはスクリプトの終了後に自動的に破棄されます。 もちろん、メソッドが呼び出された後は、画像インスタンスは使用できなくなります。

http://image.intervention.io/api/destroy
$image = Image::make($pic->getRealPath());
...

$image->destroy(); // メモリ解放

まとめ

画像をアップロードして画像処理中に

500 リクエストを処理できません。

と出る場合はメモリが足りません。
php.iniとapacheの設定ファイルで容量を増やしてください。

また、サーバーのメモリも十分に余裕を持った容量にしてください。

タイトルとURLをコピーしました