我正在尝试通过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);
答案 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了解详情。