GuzzleHttps - 如何发送异步。数据通过POST(使用池)

时间:2016-09-12 19:40:16

标签: php guzzle

我正在尝试通过Guzzle Library中的POOL发送POST数据。但是,在数据发送的地址POST是完全空的 - 我不明白。

$client = new Client();

$requests = function ()
{
    foreach($this->urls as $url)
    {
        yield new Request('POST', $url, [
            'body' => '...'
        ]);
    }
 };

我也尝试过form_params和multiparts,不再工作(POST再次为空,$ _REQUEST& $ _GET)。

当然这段代码(为了完整性):

$pool = new Pool($client, $requests(), [
    'concurrency' => count($this->urls),
    'fulfilled'   => function ($response) {},
    'rejected' => function ($reason) {},
});

$promise = $pool->promise();
$promise->wait();

Guzzle正确发送请求(在第二台服务器上输入),但本身没有任何数据。

我做错了什么?谢谢!

编辑:

我只是想用Guzzle替换这个代码(现在在一个循环中重复):

$ch = curl_init();
$url = 'https://example.cop';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'mehehe_net');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 59000);
curl_setopt($ch, CURLOPT_POST, true);
$dt = ["data" => json_encode($queue)];

curl_setopt($ch, CURLOPT_POSTFIELDS, $dt);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$cont = curl_exec($ch);
curl_close($ch);

3 个答案:

答案 0 :(得分:1)

这个解决方案很棒! : - )

$pss = [];
$client = new Client();
$uri = "https://example.com";
foreach($data as $alarm)
{
    $pss[] = $client->postAsync($uri, ['form_params' => ["alarms" => json_encode($alarm)]])->then(function ($response) use ($alarm)
    {
         // $response->getBody();
    });
 }
 \GuzzleHttp\Promise\unwrap($permis);

不要忘记循环后使用unwrap(wait)! : - )

答案 1 :(得分:1)

这是我使用的解决方案。

$requests = function ($endpoints, $data) {

            foreach ($endpoints as $endpoint) {
                yield new Psr7\Request(
                   'POST', 
                   $endpoint, 
                   ['Content-Type' => 'application/x-www-form-urlencoded'],
                   http_build_query($data, null, '&'));
            }
            echo "\n";
        };

答案 2 :(得分:0)

解决方案的其他信息:请考虑将each_limit()与生成器一起使用而不是unwrap

它将允许您控制并发级别(并行查询的数量)。当您在服务器端有大量请求和一些限制时(通常对来自客户端的同时请求数量有一些限制),它非常有用。

$generator = function () {
    return $client->postAsync($uri, ['form_params' => ["alarms" => json_encode($alarm)]])->then(function ($response) {
        // ...
    });
}

// Allow only 10 simultaneous requests.
each_limit($generator(), 10)->wait();

阅读this article了解详情。