第9回 HTTP_Request クラス - HTTPリクエスト支援ライブラリ (2) - PEAR講座
くまっち先生のPEAR講座
Lecutures on PHP
第9回 HTTP_Request クラス - HTTPリクエスト支援ライブラリ (2) (その4)
レスポンスデータを取り扱う (2)
HTTPの仕様に基づくヘッダの分析とそれらに伴う処理を実施した後は、レスポンスデータのボディとして情報を読み込み格納します。リスト6がその処理を行うコードの抜粋です。
リスト6. レスポンスボディの抽出・格納
while (!$this->_sock->eof() &&
(is_null($this->_toRead) || 0 < $this->_toRead)) {
if ($chunked) {
$data = $this->_readChunked();
} elseif (is_null($this->_toRead)) {
$data = $this->_sock->read(4096);
} else {
$data = $this->_sock->read(min(4096, $this->_toRead));
$this->_toRead -= strlen($data);
}
if ('' == $data) {
break;
} else {
$hasBody = true;
if ($saveBody || $gzipped) {
$this->_body .= $data;
}
$this->_notify($gzipped? 'gzTick': 'tick', $data);
}
}

一部変数の値による分岐処理(変数値はレスポンスヘッダの値によるもの)もありますが、基本はNet_Socketからデータが取得できる限り、指定する容量分を読み込みそれらをボディ部データとして$this->_bodyクラスプロパティへ追加格納していく反復処理を実施する処理の流れがお分かりかと思います。
反復処理が完了すると、リクエストに対するレスポンスデータがHTTP_Responseオブジェクトとして完成するということになります。sendRequestメソッド1つでこれら処理が一気に実施されますので、あとはゆっくりとレスポンスデータを頂くだけです。
リスト7は、HTTP_Requestにおけるレスポンスボディを取得するgetResponseBodyメソッドです。HTTP_Requestのクラスプロパティ_responseがHTTP_Responseクラスのオブジェクトですので、そのクラスのプロパティ_bodyが実際のレスポンスボディになります。
リスト7. getResponseBodyメソッド
function getResponseBody()
{
return isset($this->_response->_body) ? $this->_response->_body : false;
}
HTTP_Requestでは実装されていませんが、Requestに対してResponseオブジェクトそのものを返し、利用者はHTTP_Responseオブジェクトに対してgetCode, getBodyといったメソッドを実施し必要なデータを参照する、という仕組みにするのも面白いでしょう。
- くまっち先生のワンポイント講座 -
クラスとPHPファイルの関係

HTTP_Requestでは、PEARディレクトリ以下の「HTTP/Request.php」という1つのPHPファイル内に、HTTP_RequestクラスとHTTP_Responseクラスの2つがあわせて定義されています。
これとは別に、ある1つのクラスに対しては1つのPHPファイルをそれぞれ準備するという構成方法があります。すなわち、HTTP_RequestクラスがHTTP/Request.phpとするならば、HTTP_ResponseクラスもまたHTTP/Response.phpとして1つのファイルにするということです。
後者の場合、今回のケースならばHTTP_RequestクラスがHTTP_Responseクラスを使用して処理を行っているためrequire_onceなどを使用してHTTP/Response.phpを読み込む必要がありますが、その一方でクラス名とファイル・ディレクトリの内容が一致するため開発者にとっても他の人にとっても構造が理解・把握しやすいものとなります。
これはPEARにおける規約には定められていませんし各々の開発者に委ねられている(*4)部分のお話ですが、PEARでは現在のところ後者の方法がよく利用されています。
複数パッケージが専用のディレクトリで共存しているPEARでは、クラス名が重複してはいけない現在のPHPの仕組み上、存在しているクラスを示すため個々のファイルとして準備しておくのが得策ということでしょう。
リクエスト&レスポンス
やや掻い摘む形での紹介でしたが、先のHTTP_Download、および今回のHTTP_Requestの両パッケージを取り上げることで、リクエスト(要求)に対するレスポンス(応答)の処理そして受け取ったレスポンス内容に対する処理という、データ通信に関する基本のやり取りとその一連の流れに触れることができました。
普段Webブラウザなどを介して行っている馴染みあるものがPHPのコードで表現されていますので、データ通信の仕組みを学習することもできますし、既に仕組みがお分かりなのであれば逆にPHPコードの学習にもなることでしょう。
今回取り上げ切れなかった箇所は、まさにHTTP通信の仕様そのものをPHPコード化したものになります。より高度で複雑なプログラム内容となっていますが、興味のある方はぜひご覧になってみてください。
----
*4) http://pear.php.net/manual/ja/standards.bestpractices.php
その他の記事も見る
- 第1回 File クラス - ファイル操作のテクニック
- 第2回 HTTP クラス - RFCに従ったプロトコル通信
- 第3回 HTTP_Header クラス - ヘッダフィールドを扱う
- 第4回 HTTP_Download クラス - ダウンロード支援ライブラリ
- 第5回 HTTP_Download クラス - ダウンロード支援ライブラリ (2)
- 第6回 Net_URL クラス - URL構築ライブラリ
- 第7回 Net_Socket クラス - ソケット通信用ライブラリ
- 第8回 HTTP_Request クラス - HTTPリクエスト支援ライブラリ
- 第9回 HTTP_Request クラス - HTTPリクエスト支援ライブラリ (2)
- 第10回 Net_UserAgent_Mobile クラス - 携帯端末情報取得ライブラリ
- 第11回 Net_UserAgent_Mobile クラス - 携帯端末情報取得ライブラリ (2)
- 第12回 Net_UserAgent_Mobile クラス - 携帯端末情報取得ライブラリ (3)
- >>「くまっち先生のPEAR講座」一覧ページに戻る
- くまっち先生
本名:熊倉 洋介 株式会社アイサイト所属
電子、ネットワーク技術を経て現在のWebアプリケーション開発の世界へ。システム設計およびコーディングがメインで、趣味の範囲内を仕事として行うことができることに感謝しながら過ごす日々。関西を中心に、勉強会やセミナーといった PHP 技術者向けコミュニティで活動を続けており、現在はPiece Frameworkプロダクトへコミットメント中。





ページのトップへ


GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。