PHPのfile_get_contents関数はデフォルトではHTTP/1.0で通信をするようです。実は、Azure FunctionsにてcURL関数が使えなかったのでfile_get_contents関数を使うようにプログラムを修正したのですが、ローカルで検証したところ「failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request」が出て通信できなくなってしまったのです。いろいろ調べた結果、どうやら「HTTP/1.0」というメッセージがキモのようでしたので、HTTP/1.1で通信するように修正しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $header = array ( "Content-Type: application/x-www-form-urlencoded" , "Content-Length: " . strlen ( $req ), "Connection: Close" ); $context = array ( "http" => array ( "protocol_version" => "1.1" , "method" => "POST" , "header" => implode( "\r\n" , $header ), "content" => $req , "ignore_errors" => true ) ); $res = file_get_contents ( $redirecturl , false, stream_context_create( $context )); |
ちなみに、ignore_errorsはtrueにするとfile_get_contents関数でエラーになった時に詳しい状況を取得することが可能になります。デフォルトではfalseらしく、通信エラーの時には返り値がfalseにしかなりません。ここをtrueにすると、返り値自体はfalseなのですが、$http_response_header[0]を参照することでエラーコードを取得することができるようになります。
話は戻って、HTTP/1.1で通信するにはprotocol_versionに1.1を指定すればOKです。本来、cURL関数が使えればいいだけの話なので、ほとんどの情報が「cURL関数を使え」って書いてあるんですよねぇ。でも、cURL関数が使えない環境もあり得ますので、ここに情報として記しておきます。
コメント