PHPのfile_get_contentsのバグにより想定外の文字列が取得される問題&header関数により指定していないHTTPヘッダーが書き換わる問題
PHPのfile_get_contents関数は、通常のファイルだけでなくWeb上のファイルも取得できる便利な関数ですが、特定の条件でおかしな動作をすることが判りました。
具体的には、リクエストに対する返答でHTTP1.1の機能であるTransfer-Encoding: chunked を用いた場合に8000バイト以上のデータを正しく解釈できず、返り値の先頭にデータのバイト数を表す(1F2Bのような)4桁の文字列が付与されたり想定される内容と異なる形で表示されてしまう問題があります。
また、これとは別にPHPのheader関数を用いて、HTTPヘッダーを'HTTP/1.1 200 OK' などの様に修正すると、Transfer-Encoding: chunkedの機能が自動的に有効になってしまう現象が確認されました。
(Content-Typeの書き換えなどでは問題ない模様)
この二つの問題は下記のようなコードで確認できます。
なお、実証した環境は PHP 5.2.14、Apache/2.2.17 です。
<?php // test.php $text = '<8000文字以上の文字列>'; // ←ここは書き換えること header('HTTP/1.1 200 OK'); print($text); ?>
<?php // hoge.php // こちらにアクセスしてtest.phpを読むとバグが発現する $url = 'http://exsample.com/test.php'; $result = file_get_contents($url); echo var_export($result, true)."\n"; ?>
実行結果は下記のようになります。
'1f41 <8000文字以上の文字列> 0 '
・・・この問題で、結局2日間も時間が取られた・・・orz