PHP5.2.6のセットアップ (UTF-8化)

YUIのサンプリングがしばらくできそうにないので、PHP5.2.6(Windows版)のセットアップについての覚書をのこしておく。

YUIなどのAjaxライブラリをつかって、XMLHttpRequestのやり取りをする場合のサーバー側の言語として、PHPを選択した。
これは、単純に「以前、サンプリングしてた時に使っていたから」という理由。
当時は、5系が出たてだったので、4系で書いたものを「直すかなぁ」とか思っていた。
(結局、4系のコードは大概動くはずなので、「まぁ、時間ができたらでいいや」と放っておいたまま)。

先日、昔コミットしたSubversionから引っこ抜いたスクリプトは、当時のSmartyPEARが使っていて、Ajax以外の画面遷移なんかは、これらを使っている。
それと、ソースの文字コードセットがEUC-JP。
PHPを最新版にして、SmartyPEARも最新にして、文字コードUTF-8に変更しようと思っておおはまりした。

まず、PHP本家サイト(php.net)からstableのWindowsバイナリーを落としてくればよい。
Windows版は、インストーラー形式になっているし、extensionも全てビルドされた状態になっているから世話がない。(Linux版なんかだと、./configureのパラメータが膨大になってしまう)
c:\php5.2.6とか適当なディレクトリをしてインストールしてしまえばよい。

phpapacheにフォークして動かすつもりなので、Apache Http Server(Windows版)をApacheの本家サイトからとってきた。今日の時点で2.2.10がリリースされているが、開発機にいれたのは、2.2.9。
apacheは2.0系から2.2系になって、conf下の構成がばらばらになってしまった。
以前から、httpd.confに、コンフィグをincludeできたが、まさにそれが標準になってしまった。
phpをフォークさせる設定は、簡単。
c:\php5.2.6(phpのインストールディレクトリ)\binから、php5ts.dllをc:\Windows\System32(開発機はXPのSP3)に移動して(実際には、MySQL5.0系とphpMyAdminを入れたので、libmysql.dllとlibmcrypt.dllも移動)、httpd.confに以下を追加すればいい。

LoadModule php5_module "C:/php5.2.6/php5apache2_2.dll"...一行追加

DirectoryIndex index.html index.php … index.phpを追加

AddType application/x-httpd-php .php .php5 ... 一行追加

AddHandler application/x-httpd-php .php .php5 ... 一行追加


PHPで嫌なのが、php.ini(c:\window下に配備)のmb_stringの設定。なんとかencoding(たとえば、internal encodingなど)とか、意味がよく分からないものがならんでいる。以前作ったサンプルは、この変が面倒だったのでeuc-jpにしてしまったが、いまどきだから、UTF-8で行こうと決意(MySQLもデフォルトはUTF-8のcharsetだし、大抵のLinuxディストリビューションや、WebサービスUTF-8)。

この際に参考になったのが、このサイト記事すばらしい!!
ソースコードレベルでも、mb_kanaとか使ってると直さないといけない、と書いてある。

以下、長いのでphp.iniのポイントのみ。

これで、安心してコンテンツ(.php)をUTF-8にすることできる。

output_buffering = Off

; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "\path1;\path2"
include_path = ".;c:\php5.2.6\includes;c:\php5.2.6\PEAR"

; Directory in which the loadable extensions (modules) reside.
;extension_dir = "./"
extension_dir = "C:/php5.2.6/ext/"

;extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_exif.dll
;extension=php_fdf.dll
extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_gmp.dll
;extension=php_ifx.dll
;extension=php_imap.dll
;extension=php_interbase.dll
;extension=php_ldap.dll
extension=php_mbstring.dll
extension=php_mcrypt.dll
;extension=php_mhash.dll
;extension=php_mime_magic.dll
;extension=php_ming.dll
;extension=php_msql.dll
;extension=php_mssql.dll
extension=php_mysql.dll
extension=php_mysqli.dll
;extension=php_oci8.dll
;extension=php_openssl.dll
extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
;extension=php_pgsql.dll
;extension=php_pspell.dll
;extension=php_shmop.dll
;extension=php_snmp.dll
;extension=php_soap.dll
;extension=php_sockets.dll
extension=php_sqlite.dll
;extension=php_sybase_ct.dll
;extension=php_tidy.dll
;extension=php_xmlrpc.dll
;extension=php_xsl.dll
;extension=php_zip.dll

[mbstring]
; language for internal character representation.
mbstring.language = Japanese

; internal/script encoding.
; Some encoding cannot work as internal encoding.
; (e.g. SJIS, BIG5, ISO-2022-*)
mbstring.internal_encoding = EUC-JP

; http input encoding.
mbstring.http_input = pass

; http output encoding. mb_output_handler must be
; registered as output buffer to function
mbstring.http_output = pass

; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
; converted to internal encoding by setting this to On.
; Note: Do _not_ use automatic encoding translation for
; portable libs/applications.
mbstring.encoding_translation = Off

; automatic encoding detection order.
; auto means
mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII

; substitute_character used when character cannot be converted
; one from another
mbstring.substitute_character = none;

; overload(replace) single byte functions by mbstring functions.
; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
; etc. Possible values are 0,1,2,4 or combination of them.
; For example, 7 for overload everything.
; 0: No overload
; 1: Overload mail() function
; 2: Overload str*() functions
; 4: Overload ereg*() functions
;mbstring.func_overload = 0