php_flagとphp_valueの違い


記事名と本文が大きくかい離しているのはご愛嬌。
違いをはっきりと書いてある文章をなかなか見つけられなかったので
メモ書きと思って書き始めたらついつい。。

PHPに関する設定をどこでしていますか?


Apache経由でPHPを呼び出している場合、
僕は4通り思いつきました。


以下、それぞれについて意味を考える。

php.iniディレクティブ


ところで、php.iniなどに設定する項目をPHPでは
php.iniディレクティブと呼びます。


php.iniディレクティブには、
それをどのタイミングで設定することが可能かを示す
PHP_INIから始まるモードが設定されています。


モードは上記の4種類あります。
※詳しくは下記参考をたどってください。
PHP_INI_USERの意味が僕にはよくわかりませんでした。
 (どうやらphp.iniとhttpd.confと.htaccessでは設定できない?)


php.iniで設定する


php.iniで設定することを簡単にとらえると、
PHPに関するポリシーとデフォルトの設定じゃないかな。
メモリのチューニングなどもここで行います。


具体的には、拡張モジュール(mbstringやmysql等)の設定、
disable_functions等の使用可能な関数についての設定
(もっともこれはサーバー屋さん以外は、きつい開発ガイドラインを作らない限り使わないと思う)、
等をおこないます。


ここでぜひとも設定しておきたい項目は以下の通り。
PHP_INI_PERDIR以降の設定値はデフォルトという意味合いで、
 .htaccessやini_set()を使用してプロジェクト毎に変更してゆく。

[php.ini]
expose_php = Off             ; PHPの存在を隠蔽する

[PHP_INI_SYSTEM]
realpath_cache_size = "32K"  ; 下記参照 
realpath_cache_ttl  = "120"  ;

[PHP_INI_PERDIR]
magic_quotes_gpc     = Off
max_input_time       = "60"
register_argc_argv   = Off
register_globals     = Off
register_long_arrays = Off
short_open_tag = Off ; <= 形式のタグを使用しない

[PHP_INI_ALL]
date.timezone = "Asia/Tokyo" ; デフォルトタイムゾーンの設定
default_charset = ""         ; Content-typeの文字コードを設定
display_errors = Off         ; エラーの表示
memory_limit  = "32M"        ; PHPが使用可能な最大メモリ
session.gc_divisor = "1000"
session.hash_bits_per_character = "5"
session.hash_function = "1" ; PHP 5.3.0以降なら sha256
session.name = "sid"
session.use_only_cookies = On

PHP5.1から実装されたrealpath cacheについて(1) - 概要と、デフォルトのキャッシュサイズが小さめというはなし

httpd.confで設定する


基本的にはここで設定しなくてもよいはず。
ただ、CentOsでは/etc/httpd/conf.d/以下の「*.conf」に
設定するのはありだとおもう。

.htaccessで設定する


httpd.conf でAllowOverrideの設定を忘れないように
設定しないと.htaccessphp_flagとphp_valueが使えません。

AllowOverride Options

で、やっと本日の主題にたどりつきました。

.htaccessではphp.iniディレクティブを
Apacheディレクティブである
php_flagとphp_value等を使用して設定します。

php_flag display_errors On
php_value session.hash_function sha256


このphp_flagphp_valueとの違いをご存知でしょうか。
php_flag display_errors 1」は、。
php_value display_errors 1」は誤りでしょうか。


.htaccessにて使用できる4個の php_ から始まる
ApacheディレクティブはPHP: 設定を変更するにはにまとめられています。
まぁ、結論は下のとおりです。

php_value name value
php_flag name on|off
php_admin_value name value
php_admin_flag name on|off

※これを見ると、php_flag は無駄に複雑にしていて、
 必要ないと思ってしまうがどーなんでしょ。

本題も終わったところで、副題に戻ると。

.htaccessでは言語関係の設定をするのが良いかなとおもいます。


というか、mbstring.encoding_translation PHP_INI_PERDIR です。
古いプログラムってこれが設定してあるんです。
※mbstring.func_overloadはPHP_INI_SYSTEMであるけれど、
 現実的には使用しないでしょ。


言語関係の設定はサーバーによって結構変わるので
フォルダ丸ごとをコピーした時に同じように動いてほしいとなると、
httpd.confにincludeするproject.confを作っておくか、
.htaccessで設定して置くか、ini_set()で設定する、
の3択になるかと思うのです。


そーすると、mbstring.encoding_translation以外は、
ini_set()で設定するのも吉かなと思う次第です。

php_value mbstring.detect_order auto
php_flag mbstring.encoding_translation Off
php_value mbstring.http_input pass
php_value mbstring.http_output pass 
php_value mbstring.internal_encoding UTF-8

プログラムの中で設定する

何度か出てきたけれどini_set()関数で設定します。
PHP_INI_USERとPHP_INI_ALLをこれで設定できます。


ディレクティブのリストを眺めると、
結構多くのことがここで設定できることに驚きます。


まとめ


改めてPHPの設定を見直すと、知らなかったことが多く出てきます。
動けばいいんじゃでこれまで過ごしていたつけでしょうか。


特にmbstring関係の設定を安易に使ってしまうとあとあと泣きを見る
というか泣かされている身としては、すべて手動で変換などをしたほうが
何かあっても変換忘れとか原因がわかっていいんじゃないかと
めんどくさい方向に進みそうな今日この頃です。