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は横に並ばないんですね。へー。
最近のコメント