わけあってIIS7でPHPを使おうと思いPHP Version 5.2.9-2のWindowsバイナリをダウンロードしてきて設定したのですが、gethostbyaddr()関数を使ったスクリプトで下記のエラーが出ることに気がつきました。
PHP Warning: gethostbyaddr() [function.gethostbyaddr]: Address is not in a.b.c.d form in・・・
引数が「a.b.c.d」という形式じゃないよというエラーなのですが、IPv6でアクセスしたのだから形式が異なって当然です。(IPv6アドレスはコロン(:)で区切りますからね。)
gethostbyaddr()はIPアドレスからホスト名を調べる関数なのですが、同様にIPv6で利用しているCentOS(Linux)上のPHPでは正常に使えているのです。
まさかWindowsバイナリだけPHPの「IPv6 Support」がdisabled(無効)になってるんじゃないかと思い、早速、phpinfo()関数でPHPの設定状況を確認したところ、IPv6 Supportはenabledでした。
結局、PHP BugsでWindowsバイナリではなぜかIPv6でgethostbyaddr()が使えないことと、Version. 5.3以上のWindowsバイナリではIPv6でgethostbyaddr()関数が使えることを知った次第です。
もうVersion.5.2では修正されないのでしょうかね・・・。
IPv6アドレスは逆引きが設定されていない場合も多いので、とりあえずIPv6アドレスが来たらgethostbyaddr()を使わないよう、スクリプトのソースを書き換えました。
$host = getenv(“REMOTE_ADDR”);
if ($host AND !strpos($host, “:”)) $host = gethostbyaddr($host);
インターネット接続サービスやネットワーク機器などインフラのIPv6対応はよく聞きますが、WebサービスなどアプリケーションのIPv6対応はまだまだ情報が少ないです。
“卵が先か、鶏が先か”ではないですけど、インフラに載るコンテンツの部分でもIPv6を普及していきたいですね。
「IPv6で何ができるの?」と言われて、「踊るひろゆきが見れるよ」だけでは寂しいので(笑