あるウェブサービスで容量の大きい画像(2〜数十MB)の画像加工をして保存するロジックで、
「500 リクエストを処理できません。」
とエラーが出て画像を加工・保存できないことがあります。
この記事ではLaravelでintervention/imageを使って画像を加工・保存できないときの解決方法をご紹介します。
intervention/imageをインストール
Laravelでintervention/imageを使って画像加工するには次のパッケージが必要なのでインストールします。
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
完了しました!
メモリを増やす
次にメモリを増やします。
以下の設定ファイルで使用できるメモリを増やす必要があります。
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つの容量を適宜増やしてください。
post_max_size
はupload_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つの容量を適宜増やしてください。
post_max_size
はupload_max_filesize
と同じか大きくする必要があります。memory_limit
は一番大きくしてください。
[ec2-user@ip-10-0-1-91 pictan]$ sudo vim /etc/httpd/conf/httpd.conf
<Directory "ディレクトリのパス">
php_value upload_max_filesize = 30M
php_value post_max_size = 40M
php_value memory_limit = 256M
</Directory>
最後にアパッチを再起動します。
[ec2-user@ip-10-0-1-91 pictan]$ sudo systemctl restart httpd
画像加工後、メモリ解放
ロジックの中にもメモリを解放するようにします。
intervention/image
のdestroy()
を使えば画像加工で使用したメモリを解放できます。
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の設定ファイルで容量を増やしてください。
また、サーバーのメモリも十分に余裕を持った容量にしてください。
コメント