Archive for 28th 1月 2010

XServerでPHP

今まで別サーバで動作していたPHPのプログラムがXServerに持って行ったらなぜか動かなくなった。

最初はmbstring関連の文字コードの問題かなと思い、以下の.htaccessを作成して実行してみたら500エラーが出る。

php_value mbstring.http_input auto 
php_value mbstring.http_output pass

なんかしれないけどXServerでは使えないんだな、とこの時は思ったけど・・・。

.htaccessが使えないと判断したので、コードの先頭に以下のように記載してエラーを出力するようにした。

@ini_set( 'display_errors', 'on' );

そしたら、どうもfputcsv()関数が実行できていない。というか定義されていないと怒られる。

Call to undefined function: fputcsv()

fputcsvという関数は比較的新しめの奴だったよな、と思ってマニュアルを見てみると、

fputcsv
(PHP 5 >= 5.1.0)
fputcsv — 行を CSV 形式にフォーマットし、ファイルポインタに書き込む

とあり、5.1以降ならOKとあるのでなぜだろうと思ってハマっていたら、XServerはphp4と5がどちらも使える環境で、
デフォルトが4で動くらしいというメモを見つけた。

エックスサーバーPHP ver.5で若干速くなった?

灯台もと暗し・・・。というかこういう基本的な部分はハマると深いよなぁ。
.htaccessを作成して無事動作を確認できた。

AddHandler x-httpd-php5 .php

ちなみに、前述で.htaccessでInteral Server Errorが出た件も、多分php4であることを意識することが必要なのだと思う。
以下のようにすれば動いた。

<IfModule mod_php4.c>
php_value mbstring.http_input           auto
php_value mbstring.http_output          UTF-8
</IfModule>

そして、そのfputcsv関数で出力したファイルを見たら、機種依存文字が化けていた。うーーーん。
内部的には文字コードはUTF-8で処理していたのですが、CSVファイルはExcelで見たいとの要望で、ファイル出力部分だけはSJISに変換して出力していました。
なぜなら、ExcelはSJISしか読めないからです。([XL2002] UTF-8 形式のテキスト ファイルが文字化けする)

文字コードは色々な部分で調整が必要なので、面倒だなと思って調べていたら、PHPで文字コードをSJISからUTF8に変換する方法
という記事があって、今まではUTF-8→SJISとやっていたのを以下のように変更してみましたらビンゴ!

mb_convert_encoding($value, "sjis-win", "UTF-8");

これで無事に機種依存文字もCSVに出力されるようになりました。