php_flagとphp_valueの違い
記事名と本文が大きくかい離しているのはご愛嬌。
違いをはっきりと書いてある文章をなかなか見つけられなかったので
メモ書きと思って書き始めたらついつい。。
php.iniディレクティブ
ところで、php.iniなどに設定する項目をPHPでは
php.iniディレクティブと呼びます。
各php.iniディレクティブには、
それをどのタイミングで設定することが可能かを示す
PHP_INIから始まるモードが設定されています。
- PHP_INI_SYSTEM : php.iniとhttpd.confで設定可能
- PHP_INI_PERDIR : 上に加えて.htaccessで設定可能
- PHP_INI_USER : ユーザースクリプトとWindowsレジストリで設定可能(※)
- PHP_INI_ALL : どこでも設定可能
モードは上記の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) - 概要と、デフォルトのキャッシュサイズが小さめというはなし
.htaccessで設定する
httpd.conf でAllowOverrideの設定を忘れないように
設定しないと.htaccessでphp_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_flagとphp_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関係の設定を安易に使ってしまうとあとあと泣きを見る
というか泣かされている身としては、すべて手動で変換などをしたほうが
何かあっても変換忘れとか原因がわかっていいんじゃないかと
めんどくさい方向に進みそうな今日この頃です。