PHP curl レスポンスヘッダとレスポンスボディの分割
スポンサーリンク
このドキュメントの内容は、以下の通りです。
はじめに
インターネットでは、たくさんのウェブサービスが提供されています。一般の利用者は、パソコンやスマホで、ウェブサービスにアクセスしています。ブラウザで検索エンジンやソーシャルネットワーキングなどのサイトにアクセスするとき、ブラウザとウェブサービスの間では、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 レスポンスのヘッダとコンテンツ部分を分割できました。
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 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