12
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pecl-HTTPによる複数リクエストを並列実行するサンプル

Posted at

以前にcURLの例を書きましたが、もっと簡単なのはpecl-HTTPのHttpRequestPoolを使うことです。こっちの方が圧倒的に読みやすいのでおすすめ。

http://jp2.php.net/manual/ja/httprequestpool.construct.php
をベースにしていますが、cURLの例と同等になるように少しオプションを追加しています。

<?php
/**
 * pecl-HTTPで並列リクエストを行うサンプル
 *
 */
$urls = array(
    'http://localhost/sleep.php?wait=1',
    'http://localhost/sleep.php?wait=2',
    'http://localhost/sleep.php?wait=3',
);
try {
    $pool = new HttpRequestPool;
    foreach ($urls as $u) {
        $req = new HttpRequest($u);
        $req->setOptions(array(
            'timeout' => 10,
            'connecttimeout' => 10
        ));
        $pool->attach($req);
    }
    $pool->send(); //全リクエストが返ってくるまでブロックする

    //レスポンスを解析。
    foreach($pool as $req) {
        echo $req->getUrl(), ':', $req->getResponseCode(), PHP_EOL;
        echo $req->getResponseBody(), PHP_EOL;
    }
} catch (HttpException $e) {
    echo $e;
}

結果が返ってくるまでにそれぞれ1秒、2秒、3秒かかるAPIに同時リクエストしています。約3秒で処理が終わります。
Iteratorを実装していてforeachで全リクエストを操作できるなど、使いやすいインターフェースです。記述も短く、PHP5らしさの溢れる書き方ができます。

問題は共用レンタルサーバーでpecl-HTTPはあまり普及していない?ことでしょうか。

12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?