第9回 HTTP_Request クラス - HTTPリクエスト支援ライブラリ (2) - PEAR講座
くまっち先生のPEAR講座
Lecutures on PHP
第9回 HTTP_Request クラス - HTTPリクエスト支援ライブラリ (2) (その1)
リクエストデータ送信メソッド sendRequest
前回の講座では、HTTPリクエストを行うための準備ステップとしてコンストラクタ処理、およびリクエスト対象となるURLの指定を行う処理を確認しました。今回の講座では、リクエストデータを送信する処理となるsendRequestメソッドを確認しながら、HTTPリクエスト処理そのものの仕組みとそのPHPコード例を紹介していきます。
断続的か持続的か

HTTPプロトコルは、基本的には断続的な通信を行う仕組みになっています。指定するサーバへ接続を行いリクエスト処理を行い、それに対するレスポンス内容を受け取った後に接続を終了して切断するという一連の流れを繰り返しています。
それに対しHTTP KeepAliveという機能を利用することで、一回のサーバ接続要求で複数回のリクエスト処理を行うこともできます。
最近のWebサイトではHTMLデータだけでなく画像データやスタイルシート、Javascriptといった複数のファイルを組み合わせて1つのページコンテンツとしていることが多いですが、1回のリクエストで取得できるデータはファイル単位のため1ファイルごとに接続と切断を繰り返すことは大変です。KeepAliveにより接続コネクションを持続させることで、切断を行うことなく連続してリクエスト処理を実施することが可能となります。
sendRequestメソッドでも、この2種類の接続方法に対する処理が準備されています。抜粋したものがリスト1のコードになります。
リスト1. 接続方法に伴う分岐処理
$keepAlive = (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http &&
empty($this->_requestHeaders['connection'])) ||
(!empty($this->_requestHeaders['connection']) &&
'Keep-Alive' == $this->_requestHeaders['connection']);
$sockets = &PEAR::getStaticProperty('HTTP_Request', 'sockets');
$sockKey = $host . ':' . $port;
unset($this->_sock);
if ($keepAlive && !empty($sockets[$sockKey]) &&
!empty($sockets[$sockKey]->fp))
{
$this->_sock =& $sockets[$sockKey];
$err = null;
} else {
$this->_notify('connect');
$this->_sock =& new Net_Socket();
$err = $this->_sock->connect($host, $port,
null, $this->_timeout, $this->_socketOptions);
}
接続の断続的・持続的は、リクエストデータとして送信されるヘッダ(クラスプロパティの$this->_requestHeaders)のconnectionキーに対する値により可変させます。すなわち、connectionキーの値が"Keep-Alive"ならば持続的、そうでないならば断続的になります。
「対象サーバとの接続」という情報にあたるものが、$socketsの値です。PHPプログラム内で単一の(そして共通の)値として扱うことのできる変数としてPEARクラスのgetStaticPropertyメソッドを利用して作成し、この変数内に接続情報をセットしようとしています。

指定するサーバとの接続は、第7回講座(*1)で紹介してNet_Socketクラスを使用して実現しています。初めての接続の場合は、クラスプロパティの$this->_sockにNet_Socketクラスを作成してconnectメソッドで対象となるサーバへ接続する処理を実施します。
対して、もし$keepAlive変数が正でありかつ$sockets変数に接続情報が含まれていた場合、すなわち持続的な接続処理を行うためのリクエストヘッダ情報が含まれつつ実際にNet_Socketクラスがオブジェクトとして格納されている場合は、そのオブジェクトを引き続き利用しようとします。
これで、既に確立されている接続状態を持続させていることが分かります。





ページのトップへ


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