スポンサーリンク

file_get_contents関数にてHTTP/1.1で通信させる

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関数が使えない環境もあり得ますので、ここに情報として記しておきます。

AzurePHP
スポンサーリンク

コメント

PAGE TOP
タイトルとURLをコピーしました