Apache2 + PHP5 の初期設定
インストールを終えた Apache2.0 + PHP5 を自宅開発環境っぽく設定してみます。設定はターゲットとする環境やアプリケーションに応じて変えるものですので、必要に応じて変更したりしなかったりしてください。コードに付けている行番号は編集するうちにずれますのであくまでも目安にしてください。
すでに借りているレンタルサーバがあるならその値にあわせておけば、レンタルサーバとの違いを意識せずに済みます。
Apache - httpd.conf の編集
Apache の設定ファイル 「httpd.conf」は、Apache をインストールしたフォルダの「/conf」フォルダの中にあります。これをエディタで編集します。
httpd.conf では「#」以降行末までがコメントです。値を変える際値を上書きしてもかまいませんが、元の値は行ごとコメントアウトしておいて新らしい行を書き加えておけば、不都合があった時すぐ元の状態に戻せます。
httpd.conf は Apacheの起動時に読み込まれます。変更したら Apacheの再起動を忘れずに。
DocumentRoot
ブラウザからアクセスできるドキュメントルート(ベースフォルダ)を設定します。
ここで設定したフォルダ以下がブラウザでアクセス出来るようになります。例えば、D:/home/mysite/htdocs を DocumentRoot に設定した場合、D:/home/mysite/htdocs/sample.html には http://localhost/sample.html でアクセスできます。
デフォルトでは、Apacheをインストールしたフォルダの /htdocs になっています。HTMLなどのファイルを管理しやすいよう都合の良いフォルダ名に書き換えます。もちろん変える必要がなければデフォルトのままでかまいません。
223 | #
224 | # DocumentRoot: The directory out of which you will serve your
225 | # documents. By default, all requests are taken from this directory, but
226 | # symbolic links and aliases may be used to point to other locations.
227 | #
228 | #DocumentRoot "C:/usr/local/Apache2/htdocs"
228 | DocumentRoot "D:/home/mysite/htdocs"
229 |
次の行以下には、DocumentRoot 以下のディレクトリに対する設定がすでにしてあります。DocumentRoot を変更した場合は必ず以下の行も DocumentRoot と同じフォルダ名に書き換えます。
251 | #
252 | # This should be changed to whatever you set DocumentRoot to.
253 | #
254 | #<Directory "C:/usr/local/Apache2/htdocs">
255 | <Directory "D:/home/mysite/htdocs">
256 |
DocumentRoot 以下のディレクトリに対してオプションを設定しています。Indexes はディレクトリがリクエストされ、且つ DirectoryIndex で指定するファイルがない場合に、ディレクトリ内のファイルを一覧表示するかどうか設定します。FollowSymLinks はシンボリックリンクの参照を許可するかどうか設定します。デフォルトはいずれも表示(許可)する設定となっていますが、セキュリティを考えると表示(許可)しない方が良いと思いますので、項目の前に「- (マイナス記号)」をつけて表示(許可)しないを設定します。
265 | # The Options directive is both complicated and important. Please see
266 | # http://httpd.apache.org/docs/2.0/mod/core.html#options
267 | # for more information.
268 | #
269 | # Options Indexes FollowSymLinks
270 | Options -Indexes -FollowSymLinks
271 |
httpd.conf の値を .haccess 上書き可能にするかどうか設定します。デフォルトは AllowOverride None (上書きを許可しない)が設定されてますが、許可しておく方が実用的ですので AllowOverride All を設定します。
272 | #
273 | # AllowOverride controls what directives may be placed in .htaccess files.
274 | # It can be "All", "None", or any combination of the keywords:
275 | # Options FileInfo AuthConfig Limit
276 | #
277 | # AllowOverride None
278 | AllowOverride All
279 |
DirectoryIndex
ディレクトリがリクエストされた際、インデックスとして呼び出すファイル名を指定します。http://localhost/ がリクエストされると http://localhost/index.html が呼び出されるのはこの設定によるものです。
レンタルサーバでは大抵 index.php もインデックスに設定してありますので開発環境もこれに準じておくと良いと思います。スペースを空けて index.php を追記します。
315 | #
316 | # DirectoryIndex: sets the file that Apache will serve if a directory
317 | # is requested.
318 | #
319 | # The index.html.var file (a type-map) is used to deliver content-
320 | # negotiated documents. The MultiViews Option can be used for the
321 | # same purpose, but it is much slower.
322 | #
323 | DirectoryIndex index.html index.html.var index.php
324 |
PHP - php.ini の編集
PHP の設定ファイル「php.ini」は、PHPのデフォルト値を設定します。
php.ini はインストールの際、C:\usr\local\php5\php.ini に作りました。これをエディタで編集します。
インストールの際 php.ini-recommended をコピーしましたので、今回はデフォルト(php.ini-dist)の設定値と比較しながらやってみたいと思います。
php.ini では「;」以降行末までがコメントです。値を変える際値を上書きしてもかまいませんが、元の値は行ごとコメントアウトしておいて新らしい行を書き加えておけば、不都合があった時すぐ元の状態に戻せます。
php.ini も Apacheの起動時に読み込まれます。変更したら忘れず Apacheを再起動しましょう。
short_open_tag
省略形のPHP開始タグ(<?)をPHPスクリプトの開始タグとして使うかどうかを設定します。値は On (使う)または Off(使わない)のどちらかです。デフォルトは On ですが、php.ini-recommended では Off が設定されています。XMLドキュメント冒頭の <?xml version="1.0" encoding="utf-8"?> とかぶるので Off を推薦します。
125 | ; Allow the <? tag. Otherwise, only <?php and <script> tags are recognized.
126 | ; NOTE: Using short tags should be avoided when developing applications or
127 | ; libraries that are meant for redistribution, or deployment on PHP
128 | ; servers which are not under your control, because short tags may not
129 | ; be supported on the target server. For portable, redistributable code,
130 | ; be sure not to use short tags.
131 | ;short_open_tag = On
132 | short_open_tag = Off
133 |
output_buffering
出力バッファリングを行うかどうか設定します。echo などの出力を即座に出力する時は Off を、一旦バッファにためてから出力する時は On もしくはバッファにためるバイト数を指定します。
すでに出力した物は加工も取り消しも出来ませんが、バッファに貯めておけば後から加工や削除が可能になります。またバッファリングしてあれば、何か出力した後でも COOKIE や header などのレスポンスヘッダを出力することもできます。
デフォルト値は Off です。php.ini-recommended では 4096 が設定されていますが、ob_start を使ってスクリプトからでもバッファリングを設定出来ますし、スクリプトの実行順や HTTP の仕組みを意識できるので、開発環境は Off が良いと思います。
142 | ; Output buffering allows you to send header lines (including cookies) even
143 | ; after you send body content, at the price of slowing PHP's output layer a
144 | ; bit. You can enable output buffering during runtime by calling the output
145 | ; buffering functions. You can also enable output buffering for all files by
146 | ; setting this directive to On. If you wish to limit the size of the buffer
147 | ; to a certain size - you can use a maximum number of bytes instead of 'On', as
148 | ; a value for this directive (e.g., output_buffering=4096).
149 | ;output_buffering = 4096
150 | output_buffering = Off
151 |
output_handler
PHPの出力に対して後処理を行う出力ハンドラを指定します。後で登場する mbstring.http_output に mbstring.internal_encoding とは異なる文字エンコーディングを指定した場合は内部エンコーディングから出力エンコーディングに変換が必要になりますので、ここに mb_output_handler を指定します。
スクリプトでも ob_start('mb_output_handler') を使って同じことが出来ますし、アプリケーションやスクリプトごとに後処理は違ってくるものだと思いますので、ここではコメントアウトのままにしてスクリプト側で対応する方が良いと思います。
162 | ; Note: output_handler must be empty if this is set 'On' !!!! 163 | ; Instead you must use zlib.output_handler. 164 | ;output_handler = 165 | ;output_handler = mb_output_handler 166 |
error_reporting
出力(表示)するエラーの種類を指定します。デフォルトは E_ALL & ~E_NOTICE で E_NOTICE 以外のエラーを全て出力するよう設定してあります。php.ini-recommended では E_ALL です。開発環境では E_ALL (全てのエラーを出力する)を設定すると良いと思います。
349 | ;
350 | ;error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
351 | ;
352 | ; - Show all errors, except coding standards warnings
353 | ;
354 | ;error_reporting = E_ALL & ~E_NOTICE
355 | error_reporting = E_ALL
356 |
display_errors
エラーを出力(表示)するかどうかを指定します。デフォルトは On (表示する)です。php.ini-recommended では Off (出力しない)が設定してあります。おそらく運用時を想定してのことと思いますが、開発環境では On を設定しておきましょう。
370 | ;
371 | ; Default
372 | ;
373 | ;display_errors = Off
374 | display_errors = On
375 |
log_errors
エラーをサーバのエラーログファイルに出力するかどうかを指定します。デフォルトは Off (出力しない)です。運用時は log_errors を On、display_errors を Off とすると良いと思います。開発時でもエラーを出力するとロジックが保てなくなる場合もありますので基本的に On にしておくと良いと思います。
386 | ; Log errors into a log file (server-specific log, stderr, or error_log (below))
386 | ; As stated above, you're strongly advised to use error logging in place of
386 | ; error displaying on production web sites.
386 | ;log_errors = Off
387 | log_errors = On
388 |
variables_order
PHPの外部で設定されるグローバルな値(Environment、Get、Post、Cookie、Server)を、PHPのスーパーグローバル変数に展開する値と優先順位を指定します。
デフォルトは "EGPCS" 、php.ini-recommended では "GPCS" が設定してあります。$_SERVER で $_ENV の値を得られるからでしょうか?$_ENV が消された理由はわかりませんが、次の register_globals が Off ならばどちらでも不都合は無いと思います。
452 | ; This directive describes the order in which PHP registers GET, POST, Cookie,
453 | ; Environment and Built-in variables (G, P, C, E & S respectively, often
454 | ; referred to as EGPCS or GPC). Registration is done from left to right, newer
455 | ; values override older values.
456 | ;variables_order = "GPCS"
457 | variables_order = "EGPCS"
458 |
register_globals
PHPの外部で設定されるグローバルな値(Environment、Get、Post、Cookie、Server)を、グローバル変数に展開するかどうかを設定します。デフォルトは Off (展開しない)です。PHP4.1以前はデフォルト値が On でしたが、セキュリティホールになる可能性があるため Off に変更されました。PHP6ではこの設定自体が廃止される見込みです。
これを On で運用するメリットはありませんので、特別な理由が無い限りは Off に設定しておきましょう。
464 | ;
465 | ; You should do your best to write your scripts so that they do not require
466 | ; register_globals to be on; Using form variables as globals can easily lead
467 | ; to possible security problems, if the code is not very well thought of.
468 | register_globals = Off
469 |
magic_quotes_gpc
クライアントから得られる値(GET・POST・COOKIE)に含まれる PHP で特殊な意味を持つ文字を自動的にエスケープするかどうかを指定します。デフォルトは On で、php.ini-recommended は Off が設定されています。
よさそげなエスケープですが、エスケープ文字を取り除いてからデータとして利用する事の方が圧倒的に多いのが実際です。文字エンコードが Shift_JIS の場合 「表」や「ソ」など一部の文字に余分な「\」が付くのもこの影響です。この自動エスケープによるメリットはほとんどありません。
ユーザからの入力値は可能な限りそのまま受け入れ、必要な時に最小限のエスケープをおこなう方が混乱を招かずに済みます。また PHP6ではこの設定そのものが廃止の予定です。特に理由が無い限り Off を設定しましょう。
492 |
493 | ; Magic quotes for incoming GET/POST/Cookie data.
494 | ;magic_quotes_gpc = On
495 | magic_quotes_gpc = Off
496 |
include_path
include() や require() で外部のファイルを読み込む際、ファイルを探す対象のパスを指定します。指定したいパスが複数の場合は「;」で区切って指定します。PHPは左のパスから順番にファイルを探します。
コメントアウトしてありますが何も設定されてないわけではなく、デフォルトでは「.;C:\php5\pear」となっています。(phpinfo()で確認できます).htaccess やPHPスクリプトでも設定できますので、php.iniでは最小限必要なパスを設定しておけば良いと思います。
リクエストされたファイルのあるフォルダを示す「.」は何は無くとも書いておいたほうが良いでしょう。PEARライブラリを使う場合はPEARのフォルダ(PHPをインストールしたフォルダ下の /PEAR )を書き加えます。この他は必要に応じてフォルダ名を書き足します。
525 | ;
526 | ; Windows: "\path1;\path2"
527 | ;include_path = ".;c:\php\includes"
528 | include_path = ".;C:\usr\local\php5\PEAR"
529 |
extension_dir - 必須
PHP の拡張モジュールのフォルダを指定します。Windows版PHPの拡張モジュールは DLLで提供されており、PHP5の場合インストールしたフォルダ下の「/ext」に収めてあります。このフォルダ名を extension_dir に指定します。
これを正しく設定してないと mbstring や PDO などの拡張機能がまったく使えませんので、実質必須の設定と思ってください。必ず実際のパスを設定しておきましょう。
540 | ; Directory in which the loadable extensions (modules) reside.
541 | ;extension_dir = "./"
542 | extension_dir = "C:\usr\local\php5\ext"
543 |
session.save_path
セッションはアクセスをまたいで値を保持する仕組みで、クライアント毎にカスタマイズしたサービスを提供するのに用います。セッションの値はサーバーのディレクトリにファイルとして保存しますので、この場所を session.save_path に指定します。
session.save_path はスクリプトでも指定できますが、デフォルトの保存場所は指定しておきましょう。実在するパスを指定しないとセッションは使えませんので、任意のディレクトリを作ってパス指定しましょう。
1046 | ; where MODE is the octal representation of the mode. Note that this
1047 | ; does not overwrite the process's umask.
1048 | ;session.save_path = "C:/tmp"
1049 | session.save_path = "D:\home\localhost\tmp\session"
1050 |
拡張モジュールを有効にする
PHPの機能の一部は拡張モジュールとして提供されています。php.ini には「extension=php_xxxx.dll」を行頭の「;」でコメントアウトしていますのでこの「;」を削除して必要な拡張モジュールを有効にします。
ただし、ここでは拡張モジュールを読み込むよう指定しているだけです。拡張モジュールによっては別途外部ライブラリを必要としたり依存関係があるものもありますので、拡張モジュール毎にマニュアルを確かめて下さい。
mbstring拡張モジュール
ASCII以外のマルチバイト文字を扱う拡張モジュールです。
文字エンコーディングを検出したり、Shift-JIS と EUC-JP を相互変換したり、半角カナを全角カナに変換したりといった機能はこの拡張モジュール無しでははじまりません。使わない事はまず無いと思いますので mbstring拡張モジュールは有効にしておきましょう。mbstring拡張モジュールは PHPに含まれてるのでこの設定を有効にするだけでOKです。
673 | ;extension=php_interbase.dll
674 | ;extension=php_ldap.dll
675 | extension=php_mbstring.dll
676 | ;extension=php_mcrypt.dll
677 | ;extension=php_mhash.dll
mysql拡張モジュール
PHPに Mysqlクライアントの機能を付加する拡張モジュールです。PHP4では設定する必要はありませんでしたが PHP5では設定が必要となりました。mysql拡張モジュールの他に外部ライブラリ(libmysql.dll)を必要としますが、PHPをインストールしたフォルダにありますのでので別途用意する必要はなく、パスが通ったところに libmysql.dll があればOKです。
681 | ;extension=php_msql.dll
682 | ;extension=php_mssql.dll
683 | extension=php_mysql.dll
684 | ;extension=php_mysqli.dll
685 | ;extension=php_oci8.dll
mbstring - 日本語の環境設定
PHP 内部の文字エンコーディング、ブラウザに向け出力する文字エンコーディング、フォームなど外部から来るテキストの文字エンコーディング、また OS や連携するアプリケーションの文字文字エンコーディングなどを考慮して以下の値を設定します。
mbstring.http_input 以外は .htaccess か PHPスクリプトからも制御できますので、ここでは「標準設定」程度に考えておくと良いと思います。
俗に「文字化け」と呼んでいる現象のほとんどは、間違った文字エンコーディングの検出や誤変換によるものです。全てをひとつの文字エンコーディングに統一できればこれが原因の文字化けはおこりませんが、OSやブラウザ・アプリケーションソフト・データフォーマット毎に用いられている文字エンコーディングは様々でとても無理な話です。統一が無理だとしても、文字エンコーディング変換を1回でも減らせれば、その分文字化けの可能性も減らせます。
送信フォームなどの外部から来る値は実行時でなければわからないのでしかたありません。これ以外の PHPスクリプトファイルやデータベースなどはあらかじめわかりますので、これらを内部エンコーディングに統一すれば文字化けの可能性をぐっと減らせます。
データベースの文字エンコーディングが EUC-JP に決まっているなら全てを EUC-JP に統一する。XMLをデータとして用いるなら UTF-8 に統一する。といったように、「データの文字エンコーディング」を基準に考えると PHP で設定する文字エンコーディングはおのずと決まってきます。
Windows でなじみの深い Shift_JIS ですが、マニュアルの PHP の文字エンコーディングに関する要件 では、PHPで動作しないと思われる文字エンコーディングに含まれており、実際 Shift_JIS で特定の文字が化けたり誤検出したりといった現象が多いと感じます。やってやれないことはありませんが PHPスクリプトで Shift_JIS 固有の対策を施すのは結構な手間です。
実際のところ PHPやデータベースの文字エンコーディングを EUC-JP か UTF-8 に統一するよう調整を図ったほうが、少ない手間で字化けの可能性を減らせます。
以下は「UTF-8」で統一を図ってみた設定例です。これによって PHPスクリプトファイルやブラウザとの入出力は全て UTF-8 として扱うことになります。
mbstring.language は mbstringライブラリが基準とする言語を指定するものです。はじめから Japanese になってますのでここはコメントアウトの「;」を削除するだけです。
1246 | [mbstring]
1247 | ; language for internal character representation.
1248 | mbstring.language = Japanese
1249 |
この後がよくよく考える必要がある、内部エンコーディング・入力エンコーディング・出力エンコーディングの設定です。
mbstring.internal_encoding は PHP内部とPHPスクリプトファイルの文字エンコーディングを指定します。
1250 | ; internal/script encoding.
1251 | ; Some encoding cannot work as internal encoding.
1252 | ; (e.g. SJIS, BIG5, ISO-2022-*)
1253 | ;mbstring.internal_encoding = EUC-JP
1254 | mbstring.internal_encoding = UTF-8
1255 |
mbstring.http_input はフォームのテキストなどクライアントが送信してくる文字エンコーディングを指定します。
たいていのブラウザ(クライアント)は、Shift_JIS のフォームからは Shift_JIS で、EUC-JP のフォームなら EUC-JP で文字をサーバに送信してくれますが、決まり事ではないので全てのクライアントがそうだとは限りません。意地悪で想定外の文字エンコーディングで送信してくるかもしれません。クライアント依存だけに実際テキストが来てみないとわからないのが現状です。なのでクライアントを固定出来ない限り特定の文字エンコーディングを指定しても意味がありません。
auto(自動検出)を設定して mbstring.encoding_translation を On にするか、pass(何もしない)を設定して PHPスクリプトで内部エンコーディングに変換するのが得策です。
1256 | ; http input encoding.
1257 | mbstring.http_input = auto
1258 | ;mbstring.http_input = pass
1259 |
mbstring.http_output は PHP が出力する文字エンコーディングを指定します。
この値が HTMLの文字エンコーディングとなるので、METAタグのでキャラクターセット指定もこれにあわせて content="text/html;charset=utf-8" となります。
これを mbstring.internal_encoding と異なる値にする場合は出力時に変換が必要なので、output_handler にoutput_handler を設定します。
1259 | ; http output encoding. mb_output_handler must be
1260 | ; registered as output buffer to function
1261 | ;mbstring.http_output = SJIS
1262 | mbstring.http_output = UTF-8
1263 |
mbstring.encoding_translation は クライアントから来た入力エンコーディングを内部エンコーディングに自動変換すかどうかを設定します。mbstring.http_input = auto を設定した場合は On に設定します。
1264 | ; enable automatic encoding translation according to
1265 | ; mbstring.internal_encoding setting. Input chars are
1266 | ; converted to internal encoding by setting this to On.
1267 | ; Note: Do _not_ use automatic encoding translation for
1268 | ; portable libs/applications.
1269 | ;mbstring.encoding_translation = Off
1270 | mbstring.encoding_translation = On
1271 |
mbstring.detect_order は auto(自動検出)を指定した時の検出順を指定します。入力エンコーディングの自動検出だけでなく、文字エンコーディング名を引数にとる関数にも影響します。
検出させたい順に「,」で区切って文字エンコーディング名を指定します。
1272 | ; automatic encoding detection order.
1273 | ; auto means
1274 | ;mbstring.detect_order = auto
1275 | mbstring.detect_order = ASCII, UTF-8, EUC-JP, eucJP-win, SJIS, sjis-win, JIS
1276 |
mbstring.substitute_character は、文字エンコーディング変換の際、文字列に含まれている無効な文字を置き換える「代替文字」を指定します。この機能を利用するかどうかはサービス内容やビジネスロジックによるところが大きいと思いますので、ここはコメントアウトのままにして必要な時にスクリプト側で対処する方が得策です。
1277 | ; substitute_character used when character cannot be converted 1278 | ; one from another 1279 | ;mbstring.substitute_character = none; 1280 |
mbstring.func_overload は、mail関数、文字列関数、正規表現関数が呼ばれた時に、暗黙のうちにマルチバイト対応関数で処理するかを指定します。
マルチバイト処理を必要とするところは設計時にわかります。頻繁に使う文字列関数や正規表現関数全てに対して余分な負荷をかけることになりますし、混乱を招く可能性も高くなるので、ここは一切置き換えない「0」を指定して、スクリプト側で使い分けることをオススメします。
1281 | ; overload(replace) single byte functions by mbstring functions.
1282 | ; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
1283 | ; etc. Possible values are 0,1,2,4 or combination of them.
1284 | ; For example, 7 for overload everything.
1285 | ; 0: No overload
1286 | ; 1: Overload mail() function
1287 | ; 2: Overload str*() functions
1288 | ; 4: Overload ereg*() functions
1289 | mbstring.func_overload = 0
1290 |
mbstring.strict_detection は、厳密な文字エンコーディング検出をおこなうかどうかを指定します。
PHP 5.2 から採用されましたが、私自身まだ使い倒してないので「厳密」の示す範囲や影響がわかりません。エンコード検出の精度があがるのは嬉しいことですが、php.ini-dist にこの記述はありませんし、PHP4との互換性を考慮すれば コメントアウトのままか Off にしておく方が良いと思います。何か気付いたら報告したいと思います。
1291 | ; enable strict encoding detection.
1292 | ;mbstring.strict_encoding = Off
1293 | ;mbstring.strict_detection = On
1294 |
元々の記述は ;mbstring.strict_encoding = Off となってますが、このような設定項目はマニュアルにないので記述の間違いだと思います。
ざっくりやってみましたが我流の解釈はあいかわらず含まれていますので悪しからず。またPHPの仕様変更もあると思いますので、念のため PHPマニュアルの php.ini ディレクティブ で最新の情報を確かめていただければと思います。
さて次は、Mysql4.1をインストールします。


