なんだか処理が動いてないっぽい
自作システムの管理画面で、ちょっと多めのコンテンツを一括削除しようとするとAjaxからの結果メッセージがうまく帰って来ない事がありました。
DevToolsのConsoleを見てみると、案の定500エラーが出ています。原因を探ってみる事にしました。
php周りの設定をチェック
サーバに入り/var/log/php-fpm.d/www-error.logを確認すると「Fatal error: Allowed memory size of xxxxx bytes exhausted (tried to allocate 16 bytes) in…」というエラーが。
しかし、コンテンツ削除処理のPHPにはini_set(‘memory_limit’,’***M’);で十分高い値を設定していたのですが、ログに出ているメモリサイズと、ini_set()でセットした値が合っていません。
PHP-FPM設定の落とし穴
調べてみた所、以下のことがわかりました。
php-fpmを使っている場合、PHPのメモリ設定方法は主に3つあります。
- /etc/php.iniのphp_value memory_limit ***M、
- /etc/php-fpm.d/www.confで指定したphp_admin_value[memory_limit]
- PHPファイル内でini_set()で指定
この中でwww.confで指定したmemory_limitの値は、php.iniで指定した値より優先されます。そして、注意すべきはphp_admin_valueはini_set()の設定よりも優先される事です。
ini_set()を適用したい場合、php_admin_valueではなくphp_valueを使う必要があります。
私の場合php_admin_valueを設定に使っていたので、ini_set()を実行しても無視されているのが原因でした。
まとめ
php-fpmを使う場合は、www.confとphp.iniとphpファイル内コマンドとの設定値適用の優先順位に気を付けましょう!
コメント