使用Guzzle 6并发呼叫并跟踪额外参数

时间:2016-07-28 21:46:58

标签: php concurrency promise guzzle guzzle6

所以我使用Guzzle 6进行不确定的并发api调用,但是我想要做的事情之一是跟踪承诺当前处理的数组值,因为我最初根据数据库查询结果处理api调用。之后,我想用从api返回的任何内容将值更新回数据库。

use GuzzleHttp\Pool;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;

$client = new Client();

$requests = function () {
    $uri = 'http://127.0.0.1:8126/guzzle-server/perf';
    foreach($database_result as $res) {

        /*the res array contains 
        ['id' => 'db id', 'query' => 'get query array'];
        */

        $url = $uri . '?' . http_build_query($res['query']);

        yield new Request('GET', $url);
    }
};

$pool = new Pool($client, $requests(), [
    'concurrency' => 5,
    'fulfilled' => function ($response, $index) {
        /**
         * HERE i want to be able to somehow 
         * retrieve the current responses db id
         * this way I can obviously update anything 
         * i want on the db side
         */
    },
    'rejected' => function ($reason, $index) {
        /**
         * HERE i want to be able to somehow 
         * retrieve the current responses db id
         * this way I can obviously update anything 
         * i want on the db side
         */
    },
]);

// Initiate the transfers and create a promise
$promise = $pool->promise();

// Force the pool of requests to complete.
$promise->wait();
...

任何帮助都会令人惊讶。我想就如何最好地处理这种情况提出建议。我宁愿以聪明,合乎逻辑的方式做到这一点。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

所以我想出来了。

基本上

    $requests = function () {
    $uri = 'http://127.0.0.1:8126/guzzle-server/perf';
    foreach($database_result as $key => $res) {

        /*the res array was updated to be  
        ['id' => 'get query array'];
        */

        $url = $uri . '?' . http_build_query($res);

        //here is the key difference in change
        yield $key => new Request('GET', $url);
    }
};

现在,池功能中的索引将包含您想要的索引。

希望这会有所帮助。

参考:https://github.com/guzzle/guzzle/pull/1203