スポンサーリンク

このドキュメントの内容は、以下の通りです。

はじめに

インターネットでは、たくさんのウェブサービスが提供されています。一般の利用者は、パソコンやスマホで、ウェブサービスにアクセスしています。ブラウザで検索エンジンやソーシャルネットワーキングなどのサイトにアクセスするとき、ブラウザとウェブサービスの間では、HTTPプロトコルなどを利用して、通信が行われ、サービス・情報が提供されます。
そのウェブサービスは、いろいろなシステムと通信をして、サービスを提供していることもありますし、ウェブサービスにプログラムでアクセスして、データの取得・更新などを行うこともあるでしょう。
インターネットでは、いろいろなプロトコルが利用されていますが、よく使われているプロトコルの1つがHTTPでしょう。

スクリプト言語の PHP では、HTTPのウェブサービスにアクセスする方法として、 curl のエクステンションがあります(ほかにも方法はありますが)。
curl は、libcurl のラッパーです。libcurl は、C言語などで使われているライブラリです。

HTTPレスポンスの構造

HTTPでは、HTTPリクエストがあり、その応答として、HTTPレスポンスがあります。
いわゆる、HTTPクライアントがHTTPサーバに対して、HTTPリクエストを送信し、HTTPサーバがそのリクエストを処理して、HTTPレスポンスを返します。
HTTPレスポンスは、レスポンスヘッダとレスポンスボディで構成されています。

HTTPレスポンスヘッダを取得する

PHP で HTTP リクエストを送り、データを取得した時に、レスポンスヘッダを確認したい時があります。
curl_exec から取得した レスポンスヘッダリクエストボディが返ってきます。ヘッダとボディを簡単にパースする方法をあります。

curl_getinfo()で、ヘッダサイズ header_size を取得できます。
サイトによって、 download_content_length を得られないので、 header_size から計算したほうが簡単かと思います。

サンプルコード


手順は、以下の通りです。

  • curl で HTTP リクエストを送り、レスポンスでヘッダとボディを受け取ります。
  • curl_getinfo() でヘッダサイズを調べ、HTTPレスポンスを分割します。
<?php

$ch = curl_init ();

$url = 'http://www.yahoo.co.jp/';

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_HTTPHEADER,
	array()
);

curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$r = curl_exec ($ch);

$info = curl_getinfo ($ch);
var_dump ($info);

// ヘッダ部分を取得
$header = substr ($r, 0, $info["header_size"]);
//$body = substr ($r, -$info["download_content_length"]);

// ボディ部分を取得
$body = substr ($r, $info["header_size"]);

// 画面に表示
echo "header", PHP_EOL;
echo "$header",PHP_EOL;
echo "body", PHP_EOL;
echo "$body",PHP_EOL;
?>

実行例


実行例を以下に示します。

最初の var_dump() は、curl_getinfo() で取得した情報です。

array(26) {
  ["url"]=>
  string(23) "http://www.yahoo.co.jp/"
  ["content_type"]=>
  string(24) "text/html; charset=utf-8"
  ["http_code"]=>
  int(200)
  ["header_size"]=>
  int(553)
  ["request_size"]=>
  int(54)
  ["filetime"]=>
  int(-1)
  ["ssl_verify_result"]=>
  int(0)
  ["redirect_count"]=>
  int(0)
  ["total_time"]=>
  float(0.335876)
  ["namelookup_time"]=>
  float(0.036065)
  ["connect_time"]=>
  float(0.053037)
  ["pretransfer_time"]=>
  float(0.053392)
  ["size_upload"]=>
  float(0)
  ["size_download"]=>
  float(24778)
  ["speed_download"]=>
  float(73771)
  ["speed_upload"]=>
  float(0)
  ["download_content_length"]=>
  float(-1)
  ["upload_content_length"]=>
  float(0)
  ["starttransfer_time"]=>
  float(0.082993)
  ["redirect_time"]=>
  float(0)
  ["certinfo"]=>
  array(0) {
  }
  ["primary_ip"]=>
  string(15) "203.216.243.240"
  ["primary_port"]=>
  int(80)
  ["local_ip"]=>
  string(13) "192.168.0.202"
  ["local_port"]=>
  int(20477)
  ["redirect_url"]=>
  string(0) ""
}
header
HTTP/1.1 200 OK
Date: Mon, 24 Dec 2012 10:07:12 GMT
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Expires: -1
Pragma: no-cache
Cache-Control: private, no-cache, no-store, must-revalidate
X-XRDS-Location: http://open.login.yahoo.co.jp/openid20/www.yahoo.co.jp/xrds
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8


body
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">

省略

</body>
</html>
<!-- p07.f11.top.tnz.yahoo.co.jp uncompressed/chunked Mon Dec 24 19:07:12 JST 2012 -->

このように簡単に HTTP レスポンスのヘッダとコンテンツ部分を分割できました。

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー