2005-05-20

php.iniの編集

本編ではローカル環境にPHPスクリプトのテスト環境を構築しています。従ってPHPの設定は、公開用サーバなどの設定とはまったく異なります。セキュリティに関する考慮をしていませんのでご注意下さい。

PHPの初期設定はphp.iniで行います。php.iniでは以下の書式でディレクティブを指定します。

<ディレクティブ名> = <値>

セミコロン(;)で始まる行はコメントになります。また、[PHP]のような一見するとセクションヘッダに見える行もコメントです。実際、[PHP]のような行が無くても設定はできます。但し、将来的に何らかの意味をもつ可能性があります。

php.iniは、まず最初に[PHP]があり、PHPのコア部分を設定するディレクティブが長々と続きます。この中には、

  • 言語オプション(Language Options)
  • リソース制限(Resource Limits)
  • エラー処理(Error handling and logging)
  • データ処理(Data Handling)
  • パスとディレクトリ(Paths and Directories)
  • ファイルアップロード(File Uploads)
  • Fopenラッパー(Fopen wrappers)
  • 動的エクステンション(Dynamic Extensions)

に関する設定があります。次に各モジュールを設定するディレクティブが現れます。ここでは、[MySQL]や[mbstring]のようなセクションヘッダらしきもので区切られています。

以下では、本編の目的である「PHPスクリプトのテスト環境の構築」を行うための設定内容を、php.ini で出現するディレクティブの順に挙げます。尚、ここでは、インストール後に変更したもの及び説明のために特に重要と思われる主要な設定内容のみを挙げています。php.iniに関する詳細は、以下を参照して下さい。

http://www.php.net/manual/en/ini.php

基本設定

[PHP]言語オプション

output_buffering = Off
;output_handler =

output_bufferingは出力バファリングの設定を行います。OnまたはOffで指定します。出力バファリングをOnにすると、HTTP BODYを出力した後でもHTTPヘッダが出力できます。Onの代わりに実際のバファサイズの制限(4096)などを指定する事もできます。

output_handlerは出力ハンドラの設定を行います。出力ハンドラを指定するとPHPからの標準出力を指定の関数にリダイレクトする事ができます。output_handlerを指定するとoutput_bufferingは自動でOnになります。php.iniでoutput_handlerを指定する代わりにob_start関数を使って出力ハンドラを指定する事もできます。 output_handlerは文字エンコーディングと関係が深いので本節の「文字コードの設定」を参照して下さい。

[PHP]エラー処理

display_errors = On
log_errors = On
error_log = "C:/php5/log/error.log"

display_errorsはエラー表示の設定を行います。OnまたはOffで指定します。本編はテスト用の環境なのでOnに設定しますが、実運用環境ではOffにする事が推奨されています。

log_errorsはエラーログの設定を行います。OnまたはOffで指定します。本編ではdisplay_errorsをOff(デフォルト)からOnに変更します。Onにした場合のエラーログの出力先はerror_logで設定します。error_logを指定しない場合は、Webサーバ(本編では:Apache2)のログファイルに出力されます。

error_logはエラーログの出力先は設定します。ここでは、PHP5のインストールディレクトリ下にlogフォルダを作成し、エラーログファイルとして"C:/php5/log/error.log"を指定しました。尚、error_logの値をsyslogに指定するとWindowsのイベントログ(アプリケーションログ)に出力できます。

[PHP]データ処理

magic_quotes_gpc = Off
default_mimetype = "text/html"
default_charset = "EUC-JP"

magic_quotes_gpcはGPC(HTTPのGet/Post/Cookie)に対するマジッククォートの設定を行います。マジッククォートとは、'(シングルクオート)、"(ダブルク オート)、\(バックスラッシュ) 、NULLに対して、自動的に\(バックスラッシュ)でエスケープされる処理の事です。本編ではOn(デフォルト)からOffに変更します。

PHPではGetをG、PostをP、CookieをC、環境変数をE、サーバ変数をSと表記し、それらを組み合わせてGPCやEGPCSなどと呼んでいます。

default_mimetypeとdefault_charsetはHTTPのContent-typeヘッダに加えるMIMEタイプと文字セットを設定します。ここでは、default_charsetにEUC-JPを指定しています。本編はWindowsを対象としているのでShift_JISを設定したいところです。「Windows版のインストール」でダウンロードしたWindowsバイナリがマルチバイト対応ではなかったので、PHPの内部コードをShift_JISにする事ができません。従って、内部コード系とデフォルトの出力コード系をEUC-JPで統一する事にします。

[PHP]パスとディレクトリ

include_path = ".;C:/php5/includes"
extension_dir = "C:/php5/ext"

include_pathはrequire()、include()など関数の検索パスを設定します。require()などの関数、例えば:

include('mylib.php');

では、まず最初にカレントディレクトリからの相対パスでファイルが検索され、続いてinclude_pathが使用されます。

extension_dirは拡張モジュールのあるディレクトリを設定します。本編ではC:\php5\extです。extension_dirは以下の動的エクステンションをロードするextensionディレクティブで使用されます。

[PHP]動的エクステンション

extension=php_mbstring.dll
;extension=php_mysql.dll

extensionは拡張モジュールを自動的にロードする場合に使用するディレクティブです。extensionではモジュール名のみを指定します。配置場所(パス)はextension_dirで指定します。

ここでは、文字コード変換を行うmbstringモジュールを有効にします。PHP5ではMySQLを使用する場合も、extensionディレクティブで指定します。

文字コードの設定

Windows版のインストール」でダウンロードしたWindowsバイナリがマルチバイト対応ではなかったので、PHPの内部コードをShift_JISにする事ができません。例えば以下のPHPスクリプトを見て下さい。

kanji-sjis.php:

<?php
header("Content-type: text/html; charset=shift_jis");
$kanji = "可能\";
echo "${kanji}(", bin2hex($kanji), ")";
?>

このスクリプトはShift-JISで保存されています。default_charsetがEUC-JPなのでheader()関数で Content-typeを上書きしています。 このスクリプトをブラウザからを実行すると以下のような表示になります。

可能(89c2945c)

kanji-sjis.phpの3行目を

$kanji = "可能";

に変更するとコンパイルエラーになります。これは"能"の2バイト目がShift-JISでは\と同じコード(5c)になるからです。

次のスクリプトを見て下さい。

kanji-euc.php:

<?php
$kanji = "可能";
echo "${kanji}(", bin2hex($kanji), ")";
?>

このスクリプトはEUCで保存されています。 このスクリプトをブラウザからを実行すると以下のような表示になります。

可能(b2c4c7bd)

コンパイルエラーは無くなりましたが、問題は残っています。Shift-JISで出力したい場合(I-MODEのWebサイトを作る場合など)はどうするのでしょう?

header("Content-type: text/html; charset=shift_jis");

を追加しただけでは上手く行きません。実際にコード変換する必要があります。

以下では、php_mbstringモジュールを使ってこの種の問題を解決します。php.iniを以下のように編集します。ここでは内部コード系とデフォルトのHTTP出力コード系をEUC-JPに設定し、HTTP入力コード系は自動判定にします。

php.ini:

[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input  = auto
mbstring.http_output = EUC-JP
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none

出力コード系(mbstring.http_output)として設定できるのはUTF-8/EUC-JP/SJISなどです。しかし、内部コード系(mbstring.internal_encoding)についてはUTF-8/EUC-JPなどのマルチバイト文字に00-7Fの範囲を含まない文字セットだけが使用できます。但し、--enable-zend-multibyteでコンパイルされたWindowsバイナリでは内部コード系にSJISが使用できます。mbstringモジュールの詳細については、以下を参照して下さい。

http://www.php.net/manual/ja/ref.mbstring.php

先の問題(Shift-JISでHTTP出力したい場合)を解決しておきましょう。

kanji-euc2sjis.php:

<?php
mb_http_output('SJIS');
ob_start('mb_output_handler');

$kanji = "可能";
echo "${kanji}(", bin2hex($kanji), ")";
?>

このスクリプトはEUCで保存されています。 このスクリプトをブラウザからを実行すると以下のような表示になります。

可能(b2c4c7bd)

ブラウザのメニュー[表示][エンコード]を展開すると[日本語(シフトJIS)]にチェックが付いているはずです(IE6の場合)。FireFoxでWeb Developer プラグインをご使用の方は、ツールバー[情報][HTTPレスポンスヘッダーを表示する]を選択して下さい。レスポンスヘッダーには次の表示が見つかるはずです。

Content-Type: text/html; charset=Shift_JIS

mb_http_output()関数は出力コード系をSJISに変更します。ob_start()関数は出力バッファリングを有効にして、出力ハンドラをmb_output_handler に設定します。ob_start()関数と同じ事はphp.iniを次のように変更しても可能ですが、スクリプトで記述した方がより汎用的です。

output_buffering = On
output_handler = mb_output_handler

.htaccessによるディレクティブの設定

PHPをApache 拡張モジュールで使用する場合、Apacheのhttpd.confや.htaccessファイルにphp.iniのディレクティブを記述する事ができます。通常、httpd.confが変更可能な人達(例えば:プロバイダやシステム管理者)はphp.iniを変更できる権限もあります。一方、一般の利用者はhttpd.confもphp.iniも変更できないので、.htaccessを利用する事になります。.htaccessファイルによるPHPディレクティブの上書きには、AllowOverride Optionsの権限が必要になります。本編でApacheはドキュメントルート以下に対して AllowOverride Allの権限を与えているので、.htaccessによるPHPの設定が可能です。

また、.htaccessで設定できるPHPディレクティブは、

PHPマニュアル(http://www.php.net/manual/en/ini.php

PHP_INI_ALLまたはPHP_INI_PERDIRと指定されているものだけです。 以下に、.htaccessの例を示します。

.htaccess:

<IfModule mod_php5.c>
  php_flag  magic_quotes_gpc On
  php_value include_path "./include"
</IfModule>

※mbstring関連のディレクティブ(mbstring.language、mbstring.internal_encoding など)も.htaccessで設定できます。

php_flagはPHPディレクティブの値が論理値(boolean)の場合に使用し、php_valueは文字列(string)の場合に使用します。詳細は以下のURLを参照して下さい。

http://www.php.net/jp/configuration.changes


Windowsで.htaccessを作成する場合は、少し工夫が必要です。エクスプローラで、[新規作成][テキスト ドキュメント]としてからファイル名を.htaccessに変更しようとしても上手くできません。メモ帳などのエディタから[名前を付けて保存]を使用して.htaccessファイルを作成するようにします。



最終更新のRSS Last-modified: Mon, 12 Sep 2005 15:28:49 JST (4358d)