ラボ > PHP:通信絡み

cURLでレスポンスヘッダの取得処理

「CURLOPT_HEADER:true」にすればいいけど、ヘッダとボディがまとまっているので分割させる

作成日:2018-02-15, 更新日:2021-04-24

基本

やりたいことは・・・「取得しようとしたURLがリダイレクトしたのか、リダイレクト先のステータスはどうなっているのか?」ってのが欲しい。

▼色々と省略しているけど・・・下記のような感じ。

$viewHeader = true; // ヘッダを出力させるなら「true」

curl_setopt($ch, CURLOPT_HEADER, $viewHeader);
$source = curl_exec($ch);
$curlInfo = curl_getinfo($ch);

if ( $viewHeader ) {
   // ヘッダを一緒に出力したときは分割させる
   $headerSize = 0;
   if ( isset($curlInfo["header_size"]) && $curlInfo["header_size"]!="" ) {
      $headerSize = $curlInfo["header_size"];
   }
   
   $strHead = substr($source, 0, $headerSize); // ヘッダ部
   $strBody = substr($source, $headerSize);    // ボディ部
}
else {
   // ヘッダを出力しないときはそのまま使う
   $strBody = $source;
}

ヘッダを1行ずつ配列に変換

上記で分割したヘッダは文字列なので、分割させて配列にしたい。
※最終的にはステータスコードが欲しい・・・。

$tmpHeader = explode("\n\n", str_replace("\r", "", trim($strHead)));
if ( is_array($tmpHeader) ) {
   $aryHeader = array();
   foreach ( $tmpHeader as $rowHeader ) {
      $aryHeader[] = explode("\n", $rowHeader);
   }
}
// var_dump($aryHeader);

▼こっちのほうが良いかも?(配列にキー・バリューの形で保存)

$_header = str_replace("\r", '', $strHead);
$tmp_header = explode("\n", $_header);
$ary_header = array();
foreach ($tmp_header as $row_data) {
	$tmp = explode(': ', $row_data);
	$key = trim($tmp[0]);
	if ( $key == '' ) {
		continue;
	}
	$val = str_replace($key.': ', '', $row_data);
	$ary_header[$key] = trim($val);
}

関連項目

PHPでHTTPリクエストのレスポンスヘッダの取得(get_headers()、$http_response_header、cUrl)