【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 ← これ
答え
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しか相手にしないと言われれば仕方がない。
コメント