第9回 HTTP_Request クラス - HTTPリクエスト支援ライブラリ (2) - PEAR講座

PHP講座 HTML×CSS 初級編

くまっち先生のPEAR講座

Lecutures on PHP

第9回 HTTP_Request クラス - HTTPリクエスト支援ライブラリ (2) (その4)

 このエントリーをはてなブックマークに追加

レスポンスデータを取り扱う (2)

HTTPの仕様に基づくヘッダの分析とそれらに伴う処理を実施した後は、レスポンスデータのボディとして情報を読み込み格納します。リスト6がその処理を行うコードの抜粋です。

    リスト6レスポンスボディの抽出・格納

    
while (!$this->_sock->eof() && 
                    (
is_null($this->_toRead) || $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が実際のレスポンスボディになります。

    リスト7getResponseBodyメソッド

    
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

  • くまっち先生

本名:熊倉 洋介 株式会社アイサイト所属

電子、ネットワーク技術を経て現在のWebアプリケーション開発の世界へ。システム設計およびコーディングがメインで、趣味の範囲内を仕事として行うことができることに感謝しながら過ごす日々。関西を中心に、勉強会やセミナーといった PHP 技術者向けコミュニティで活動を続けており、現在はPiece Frameworkプロダクトへコミットメント中。

ご意見・感想フォーム

今回の「くまっち先生のPEAR講座」への評価・ご意見があればご記入下さい。

評価:
ご意見・感想:

  



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

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

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)