schedule2019-11-22

Apacheの再起動でphp.iniの設定が反映されなかった時

アップロードファイルに関するphp.iniの設定をしてApacheを再起動したが設定が反映されていなかった。 PHP-FPMを再起動したことで反映できました。

環境

  • PHP 7.3.8
    • php.x86_64 7.3.8-1.el7.remi @remi-php73
  • CentOS 7.6
  • Apache/2.4.6

設定ファイルはデフォルトで/etc/php.iniにあります。

なぜApacheの再起動でphp.iniが反映されなかったか

Apacheでphpを実行するにはモジュール版CGI版(含む)のどちらかを使っています。 今回はCGI版であるPHP-FPMを利用していました。

ApacheはPHP-FPMを通してphpを実行しています。 PHP-FPMがphp.iniの設定を読み込んでいなかったため、Apacheを再起動しても設定を読み込めなかったのです。 一方、モジュール版では、Apacheが直接phpを実行しているためApacheの再起動だけで良いようです。

また、Nginxでは基本PHP-FPMを利用するため、同じくPHP-FPMの再起動をすると良いはずです。

PHP-FPMを再起動する

PHP-FPMを再起動してphp.iniの設定変更を反映させます。

# CentOS 7系
# ステータス確認
$ sudo systemctl stutas PHP-FPM 

# 再起動
$ sudo systemctl restart PHP-FPM 

Apacheの再起動は不要です。PHP-FPMを再起動だけで設定を読み込めます。

CGI、FastCGI、PHP-FPMとは?

nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する - Qiita

私が説明するよりこれを読んだ方が良い。 記事の最後にもリンクを貼ります。

PHP-FPMを利用しているかの確認

phpinfo

phpinfoではServer APIの項にFPM/FastCGIとあればPHP-FPMを介してPHPを実行している。

phpinfo

Loaded Configuration Fileの項にphp.iniのパスもあります。

Apache conf

Apache2.4.7以降のconfの場合はProxyPassMatchにPHP-FPMの記述がある。

# PHP-FPM
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/document/root/path/$1

調べて初めて知ったが、この書き方に幾つか問題があるらしい(参考)。 そこで、Apache 2.10からSetHandlerで書けるようになった。

DirectoryIndex index.php index.html

<FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

参考