Apacheの設定ファイルでPHPの設定を変える仕事で使える魔法のLAMP(36)

前回はPHPの設定ファイルであるphp.iniファイルの書き方を解説しました。今回は、ApacheからPHPの設定を変更する方法を解説します。(編集部)

» 2011年12月21日 00時00分 公開
[山口晴広株式会社イメージズ・アンド・ワーズ]

なぜApacheの設定ファイルから?

 前回、PHPには実行時の設定があることと、その設定をPHPの設定ファイル(以下php.iniファイル)で変更する方法を解説しました。今回はApache HTTP Server(以下Apache)の設定ファイルから、PHPの設定を変更する方法を紹介します。「php.iniファイルがあれば十分ではないか」と思われる方もいると思いますが、もちろんApacheの設定ファイルからPHPの設定を変更するメリットがあるのです。

 Apacheの設定ファイルでPHPの設定を変えるということは、Apacheの設定ディレクティブを使って値を設定することになります。関係するディレクティブは4つあります。まずは基本的な「PHP_Value」から見ていきましょう。

 「PHP_Value」の使い方は次の通りです。

PHP_Value PHP設定ディレクティブ1 設定値1
PHP_Value PHP設定ディレクティブ2 設定値2
...

 php.iniファイルと違って、PHP設定ディレクティブと値の間に等号(=)を置く必要はありません。複数の項目を設定したいときは「PHP_Value」を設定したい項目の数だけ記述します。存在しないディレクティブを指定しても特にエラーにならないのはphp.iniファイルと同様です。

 前回、PHPの使用メモリを16Mにする制限する「memory_limit」の例について説明しました。これと同じことをPHP_Valueを使って設定するなら以下のようになります。

PHP_Value memory_limit 16M

 第21回で解説したように、Apacheの設定ディレクティブは、どのセクションに置くかで影響範囲が異なります。また、ディレクティブによっては使えないセクションがあります。例えばサーバ全体に影響する設定は、バーチャルホストやディレクトリ内部では使えないようになっています。

 「PHP_Value」は、基本的にどのセクションでも使えます。これは、バーチャルホストごと、あるいはディレクトリごとに、PHPの実行時設定を変えられるということを意味しています。

 php.iniファイルを利用した設定は、サーバ全体に影響してしまいますが、Apache経由で設定すればURLに応じて細かく制御できるのです。.htaccessファイルで設定することも可能です。これはphp.iniファイルにはないメリットです。

php.iniとApacheどっちが優先?

 同じ設定をphp.iniファイルと、Apache設定ファイルに記述したらどうなるでしょうか。実際に確認してみましょう。先ほどと同じく「memory_limit」で試してみます。php.iniファイルでは32M、Apacheの設定ファイルでは16Mと設定してみます。こう設定して「phpinfo()」を実行した結果が図1です。

図1 「memory_limit」の欄の値が左右で異なっている。 図1 「memory_limit」の欄の値が左右で異なっている。クリックすると拡大

 表の左右で結果が異なっています。左右の欄はそれぞれ「Local Value」と「Master Value」です(図2)。

図2 左側がLocal Value。右側がMaster Value。 図2 左側がLocal Value。右側がMaster Value。クリックすると拡大

 Master Valueはphp.iniファイルの内容を反映しています。こちらは起動時にphp.iniファイルが読み込まれた後は変わりません。Local Valueは、Apacheの設定で上書きした値です。

 PHPの設定として有効なのはLocal Valueです。つまり、Apacheから設定した内容が優先するということです。なお、PHPのプログラムから設定を書き換えることもできますが、その場合の設定値もLocal Valueになります。

 この振る舞いから、設定の使い分けが見えてきます。サーバ全体で標準設定にしておきたい値はphp.iniファイルで設定し、URLごとに細かく変えたいような設定はApache経由の設定とするのがよいでしょう。

PHPの設定の種類

 Apacheの設定ディレクティブがセクションによって制限があるのと同様に、PHPのディレクティブにも同じような制限があります。制限の種類は4種類。PHP_INI_SYSTEMPHP_INI_PERDIRPHP_INI_ALLPHP_INI_USERです。この文字列は、設定ディレクティブのマニュアルで確認できます(図3)。

図3 変更の可否の欄に4種類の文字列が現れる。「|」でつながっているものは両方の意味を持つ。 図3 変更の可否の欄に4種類の文字列が現れる。「|」でつながっているものは両方の意味を持つ。クリックすると拡大

 PHP_INI_SYSTEMのディレクティブは、基本的にphp.iniファイルで設定するものです。Apacheでも設定できますが「PHP_Value」では設定できません。「PHP_Admin_Value」を使う必要があります。ディレクトリごとの変更や、PHPプログラムからの変更はできません。

 また、「PHP_Admin_Value」はPHP_INI_SYSTEM以外のディレクティブでも使えます。ただしこれを使うと、その設定は一切上書きできなくなります。設定をロックする必要がある場合などに用います。

 ただし、その設定の影響範囲については注意が必要です。あるディレクトリで設定にPHP_Admin_Valueを使うと、そのサブディレクトリもすべて上書きができなくなりますが、それより上位のディレクトリでは書き換え可能です。

 PHP_INI_PERDIRはディレクトリごとの設定変更が可能なディレクティブです。.htaccessによる変更もできます。php.iniファイルでの設定ももちろん可能です。しかし、PHPプログラムからの変更はできません。

 PHP_INI_ALLのディレクティブはどこでも設定できます。PHPプログラムからも設定可能です。PHP_INI_USERは、現在マニュアルを見ても1カ所にしか記述がないのですが、PHPプログラムからの設定だけを許すという意味になります。

 ApacheやPHPプログラム経由で設定を変更するときは、これらの種別に気を付けましょう。変更したつもりが変更できていないということもあります。

 別の観点での分類もあります。設定の値の型です。文字列型や数値型、真偽(On/Off)型などがあります。php.iniファイルでは、型に従って文字列を記述すればよいのですが、Apacheでは型が真偽値の場合「PHP_Value」ディレクティブが使えません。真偽値に限っては「PHP_Flag」または「PHP_Admin_Flag」で設定する必要があります。

 設定内容が真偽値かどうかは、各ディレクティブのドキュメントを確認すれば分かります(図4)。

図4 設定ディレクティブのドキュメント。値の型についての説明がある。 図4 設定ディレクティブのドキュメント。値の型についての説明がある。クリックすると拡大

 図4で「boolean」となっているものが真偽値になります。例えば「short_open_tag」をApacheでオフにするなら、次のように設定します。

PHP_Flag short_open_tag Off

 図3のディレクティブの一覧には、各ディレクティブのデフォルト値が示されていますが、OnやOffといった形では示されていません。「boolean」型のディレクティブでは、"1"がOnで"0"がOffとなります。

 Apacheでの設定については以上です。次回は設定しておいた方がいいディレクティブをいくつか取り上げて解説します。

著者紹介

株式会社イメージズ・アンド・ワーズ
代表取締役
山口晴広(やまぐち はるひろ)



「仕事で使える魔法のLAMP」バックナンバー

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。