「.htacess に php_value
を書くとエラーになる」という事象があったのでちょっと調べた。
エラーはこんな感じ。
/var/www/html/.htaccess: Invalid command 'php_value', perhaps misspelled or defined by a module not included in the server configuration
Apache モジュール版の PHP を使っている場合は問題ないんだけど PHP-FPM で動かしているときは .htaccess で php_value
が使えないっぽい。とりあえず AWS Amazon Linux 2 では amazon-linux-extras
で PHP 7.3 をインストールするとデフォルトで PHP-FPM になる。
で、Qiita に代替え手段を書いている人がいたんだけど
SetEnv PHP_VALUE "post_max_size = 16M" SetEnv PHP_VALUE "upload_max_filesize = 8M"
のように書いても PHP_VALUE
という環境変数はひとつしか設定出来ないので post_max_size
は upload_max_filesize
によって上書きされてしまう。
で、裏技っぽいものを思いついて、パラメータの間に CR
を挟んで「Apache には一行として認識させ、PHP には複数行として認識させる」という方法を使ったところ複数の値を設定することが出来た。
SetEnv PHP_VALUE "post_max_size = 16M^Mupload_max_filesize = 8M"
が、こんなアホっぽいことやってられるかとなった。
なので .htaccess で SetEnv PHP_VALUE
で設定するという方法は恐らく間違いなんだろうなと思って PHP のパラメータを見ていたら user_ini.filename
というものがちゃんとある。
詳細はドキュメントを読んでもらえればわかるのだけど、PHP ファイルが置いてある場所からドキュメントルートまで辿って .user.ini を探してくれる(PHP ファイルが置いてある場所がドキュメントルート配下外であればそのディレクトリをスキャンする)。
ということで下記のようなファイルを作成すれば .htaccess に php_value
を書く必要は無い。
post_max_size = 16M upload_max_filesize = 8M
.htaccess に記述する場合と異なり、user_ini
には user_ini.cache_ttl
というパラメータが用意されていてこの値で読込頻度を決定している。デフォルトは 300 秒(5 分)なので .user.ini を書き換えても反映まで最長で 5 分待つ必要がある。PHP-FPM を再起動してしまえば即時反映なのだがそれなら php.ini で設定すればいいのではという考えもある。しかし、.user.ini はアプリケーションエンジニアでも書き換えが出来るし、頻繁に設定を変えるものでもないのでアプリケーションエンジニアに任せたほうがいいだろう。(たったこれだけのためにインフラエンジニアが呼び出されても困る)
なお、Amazon Linux 2 の PHP では /etc/httpd/conf.d/php.conf
内で .user.ini へのアクセスを拒否するように設定されているので .user.ini にアクセスしても 403 となる。
<Files ".user.ini"> Require all denied </Files>
もちろん .user.ini のように不可視なドットファイルではなく php.ini のような可視ファイルに変更することも出来るけど、上記のアクセス制御も変更する必要が出てくるので user_ini.filename
の変更には気を使ったほうが良さそう。