PEAR::HTTP_Request_Listenerというものを知りました

HTTP_Request_Listenerなんてあったんですね。
PEAR :: Manual :: HTTP_Request_Listener

connect, sentRequest, gotHeaders, tick, gzTick, gotBody, dissconnectというイベントを補足し、その際の処理を記述出来るという事らしいですね。

元々は、Keep-Aliveについて「新しいので対応したような気が…」という事で調べていたのですが、棚からぼたもちです。1.3では無かった機構ですよね?あったかな?

何はともあれ、とりあえず触ってみました。ドキュメントのコードを少し変えて動作を確認した程度ですが、以下サンプルコードです。

<?php
 
require_once "HTTP/Request.php";
require_once "HTTP/Request/Listener.php";
require_once 'Console/ProgressBar.php';
 
class HTTP_Request_SampleListener extends HTTP_Request_Listener
{
    protected $_progressBar;
    protected $_loadedSize;
 
    public function __construct()
    {
        parent::__construct();
    }
 
    protected function _updateProgressBar($data)
    {
        $this->_loadedSize += strlen($data);
        $this->_progressBar->update(round($this->_loadedSize / 1024));
    }
 
    public function update(&$subject, $event, $data = null)
    {
        if ($event == 'connect') {
            // 接続後
            $url = $subject->getUrl();
            echo $url . "\n\n";
            echo $subject->_method . " "
                . preg_replace("|^https?://[^/]+(.*)$|", "$1", $url)
                . " HTTP/" . $subject->_http . "\n";
        } else if ($event == 'sentRequest') {
            // リクエスト送信後
            foreach ($subject->_requestHeaders as $name => $value) {
                echo $name . ": " . $value . "\n";
            }
            echo "\n";
        } else if ($event == 'disconnect') {
            // 切断後
            echo "\n-- disconnected --\n";
        } else if ($event == 'gotHeaders') {
            // レスポンスヘッダ受信後
            echo "HTTP/1.x "
                . $subject->_code . " "
                . "...\n";
            $size = (isset($data['content-length']) ? round($data['content-length'] / 1024) : 100);
            $this->_progressBar = new Console_ProgressBar(
                                                          '* -body- %fraction% KB [%bar%] %percent%',
                                                          '=>',
                                                          '-',
                                                          79,
                                                          $size
                                                          );
            $this->_loadedSize = 0;
            foreach ($subject->_headers as $name => $value) {
                echo $name . ": " . $value . "\n";
            }
            echo "\n";
        } else if ($event == 'tick') {
            // レスポンスボディの一部を受信した後
            $this->_updateProgressBar($data);
        } else if ($event == 'gzTick') {
            // gzip圧縮されたレスポンスボディの一部を受信した後
            $this->_updateProgressBar($data);
        } else if ($event == 'gotBody') {
            // レスポンスボディの全てを受信した後(デコード済み)
            echo "\n-- got body --\n";
        } else {
            // 不明(その他)
            throw new Exception($event);
        }
    }
}
 
$url = 'http://blog.koshigoe.jp/';
 
$request  = new HTTP_Request($url);
$listener = new HTTP_Request_SampleListener();
 
$request->attach($listener);
 
$request->addCookie("version", phpversion());
 
for ($i = 0; $i <= 1; $i++) {
    echo "==== Start Request ====\n";
    if ($i == 1) {
        $request->addHeader("Connection", "Keep-Alive");
        $request->addHeader("Keep-Alive", 300);
    }
    $request->sendRequest(false);
    $request->reset($url);
    echo "\n\n";
}
 
 
?>
==== Start Request ====
http://blog.koshigoe.jp/

GET / HTTP/1.1
host: blog.koshigoe.jp
user-agent: PEAR HTTP_Request class ( http://pear.php.net/ )
connection: close
accept-encoding: gzip
cookie: version=5.2.3

HTTP/1.x 200 ...
date: Wed, 01 Aug 2007 15:54:50 GMT
server: Apache/1.3.37 (Unix)
last-modified: Wed, 01 Aug 2007 14:24:10 GMT
etag: "887d27-5317-46b0978a"
accept-ranges: bytes
content-length: 21271
connection: close
content-type: text/html

* -body- 21/21 KB [==================================================>] 100.00%
-- got body --

-- disconnected --


==== Start Request ====
http://blog.koshigoe.jp/

GET / HTTP/1.1
host: blog.koshigoe.jp
user-agent: PEAR HTTP_Request class ( http://pear.php.net/ )
connection: Keep-Alive
accept-encoding: gzip
keep-alive: 300

HTTP/1.x 200 ...
date: Wed, 01 Aug 2007 15:54:50 GMT
server: Apache/1.3.37 (Unix)
last-modified: Wed, 01 Aug 2007 14:24:10 GMT
etag: "887d27-5317-46b0978a"
accept-ranges: bytes
content-length: 21271
keep-alive: timeout=3, max=8
connection: Keep-Alive
content-type: text/html

* -body- 21/21 KB [==================================================>] 100.00%
-- got body --


プロフィール

このブログ記事について

このページは、koshigoeが2007年8月 2日 00:55に書いたブログ記事です。

ひとつ前のブログ記事は「IEには異なるサーバにリクエストを送るバグがある(あった?)らしい」です。

次のブログ記事は「メモリ4GB購入」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。