スポンサーリンク

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で通信するように修正しました。

	$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
スポンサーリンク

コメント

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