[Qiita] さくらレンタルサーバでマルチドメイン毎にPHPの設定やバージョンを切り替える

さくらのビジネスプロ、マネージドプランはモジュール版PHPを利用することができます。 モジュール版はCGI版と比べて負荷が少なく動作が早いため、可能であればモジュール版を使うに越したことはないのですが、PHPの設定(php.ini)はサーバに対して1つの設定しか適用できません。 つまり、マルチドメインで運用している場合、全てのサイトに対してPHP設定を共有しなくてはなりません。

いや、.htaccess があるじゃないか、と思われますが、さくらのレンタルサーバの仕様では .htaccess に php_flagphp_value を指定することができません(Internal Server Error になります)。 サイト全体の共通箇所に ini_set() を記述して対応する方法もありますが、それが叶わない状況もあります。 サイト毎に設定が違うのは当然のことなので、ここは何とかしたいところです。

.user.ini ファイルを使う

PHP 5.3.0 以降ではディレクトリ単位で php.ini の設定を反映する、.user.ini ファイルをサポートしています。 何故かさくらのサポートで「user.ini」を検索してもカスりもしませんが、PHPが正式にサポートしているものなので、さくらのレンタルサーバでも.user.ini は有効になります。 ただし、

このファイルは、CGI/FastCGI SAPI の場合にのみ処理されます。

とあるように、モジュール版では動作しません。とは言え、いまさらサーバ全体をCGI版で動かすのは稼働中のサービスへの影響が大きいですし、パフォーマンスも落ちるので選択肢としては避けたいところです。

マルチドメイン毎にPHPをCGI版に切り替える

CGI版PHPであれば、.user.ini ファイルが有効になるので、設定の上書きが必要なサイトのみCGI版として動作させられれば目的が達せられます。(CGI版にしたサイトのパフォーマンスは落ちますが、イレギュラーケースとしてとりあえず受容します。) 特定ディレクトリ以下のみ、CGI版PHPで動作させるには以下手順を行います。

1. マルチドメインのドキュメントルートに以下内容の php.cgi ファイルを格納

#!/bin/sh
exec /usr/local/php/5.6/bin/php-cgi
#exec /usr/local/php/5.4/bin/php-cgi
#exec /usr/local/php/5.3/bin/php-cgi
#exec /usr/local/php/5.2/bin/php-cgi
#exec /usr/local/php/4.4/bin/php-cgi

それぞれのパスはさくらに用意されている各PHPのバージョンファイルです。 動作させたいPHPのバージョンの行を残してそれ以外はコメントアウト、もしくは削除します。 また、ファイルのパーミッションを 705 に設定しておきます。

2. マルチドメインのドキュメントルートに以下内容の .htaccess を格納

Action myphp-script /php.cgi
AddHandler myphp-script .php .html

※既に.htaccess が存在する場合は上記内容を追記してください。

3. PHPの設定を適用したいディレクトリに .user.ini を格納

display_errors = On
error_reporting = 6135

※設定内容は任意です。

以上でそのドメイン配下のPHPは指定したバージョンのCGI版として動作し、個別にPHP設定もできるようになります。

もともとはマルチドメイン毎のphp.iniの設定方法を探していましたが、PHPのバージョンも切り替えることが可能ということが分かったのは収穫でした。

注意点

  • PHPのバージョンを5.2以下で指定した場合は .user.ini のサポート外となるため、上記の方法ではPHPの設定は適用されません。
  • .user.ini 形式の INI ファイルがサポートするのは、 モードが PHP_INI_PERDIR および PHP_INI_USER の項目のみです。

参考サイト

※この記事はQiitaとのマルチポストになります。