SOFTELメモ

Softel Inc.

【php】file_get_contents(‘http://~~~’) するとレスポンスにゴミが混じる

問題

file_get_contents()関数にURLを渡すとコンテンツを取得してくれますよね。

すごく便利なんですが、時々以下のようなゴミが混じることがあります。

これは何ですか?phpのバグ?相手Webサーバーの不具合?

525d ← これ
{"aaaa":{"bbbb":{"cccc":"dddd","eeee":"fmt=json&q=ab","param":{"fmt":"json","limit":"10","o":0,"q":"ab","style":"0"},"http_ho...
......(中略)......
}
0 ← これ

php file_get_contents

答え

5.3.0より前のphpはHTTPのTransfer-Encoding: chunked に対応していない。

protocol_version float

HTTP プロトコルのバージョン。
デフォルトは 1.0 です。

注意:

5.3.0 より前のバージョンの PHP では chunked transfer decoding を実装していません。 この値を 1.1 に設定するなら、 1.1 準拠にするのは自分の責任となります。

HTTP コンテキストオプションの説明のページより)

ごみに見えたのは、分割されたchunkのサイズを示すもので、Transfer-Encoding: chunked で返ってきたレスポンスに含まれる情報。

HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked

6
hello 
5
world
0

対応しているクライアントでデコードされれば、ちゃんと「hello world」になる。

対応していないクライアント(古いphpのfile_get_contents関数)はレスポンスボディをそのまま取得してくれたりする。

curl関数の方は対応しているようなので、file_get_contentsがダメなときはcurlで対応するのがよさそう。

ちなみに、file_get_contentsはHTTP/1.0としてリクエストしているはずなので、Transfer-Encoding: chunked なレスポンスを返してくるサーバーにも若干問題はあるが、1.1しか相手にしないと言われれば仕方がない。

関連するメモ

コメント