guzzleのClientを複数作るとasyncでも直列処理になる

guzzleのasyncによる非同期リクエストは並列処理になって処理順がバラバラになります。なってほしいです。
しかしどうも書いていると直列っぽく動作しているので、サンプルで確認。並列になっています。

<?php
require 'vendor/autoload.php';

$client = new \GuzzleHttp\Client;

$promises = [];
for ($i = 0; $i < 5; $i++) {
    $promises[] = $client->requestAsync(
        'GET',
        'https://google.co.jp/',
        [ 'on_stats' => function ($stats) { echo $stats->getTransferTime() . "\n"; } ]
    )->then(
        function ($res) use($i) {
            echo "ok $i\n";
        },
        function ($res) use($i) {
            echo "ng $i\n";
        }
    );
}

$results = \GuzzleHttp\Promise\settle($promises)->wait();

実行結果。

$ time php test1.php 
0.120568
0.127015
0.136196
0.138116
0.164962
0.139618
ok 1
0.134759
ok 3
0.13847
ok 2
0.123677
ok 4
0.134104
ok 0

real    0m0.391s
user    0m0.142s
sys 0m0.040s

ここまでは良し。
ちょっともしかしてと思って、Clientを都度生成してしまったら……

<?php
require 'vendor/autoload.php';

$promises = [];
for ($i = 0; $i < 5; $i++) {
    $client = new \GuzzleHttp\Client;  // ←Clientを都度生成してしまうと……

    $promises[] = $client->requestAsync(
        'GET',
        'https://google.co.jp/',
        [ 'on_stats' => function ($stats) { echo $stats->getTransferTime() . "\n"; } ]
    )->then(
        function ($res) use($i) {
            echo "ok $i\n";
        },
        function ($res) use($i) {
            echo "ng $i\n";
        }
    );
}

$results = \GuzzleHttp\Promise\settle($promises)->wait();

実行。

$ time php test2.php 
0.187323
0.356126
ok 0
0.10658
0.138877
ok 1
0.147102
0.161913
ok 2
0.123902
0.128758
ok 3
0.117988
0.134
ok 4

real    0m1.654s
user    0m0.118s
sys 0m0.019s

直列処理になってしまいました。Clientは横に並ばないんですね。へー。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください