总结
正如其标题所示,Guzzle 允许一次发送多个请求以节省时间,如下所示文档 http://docs.guzzlephp.org/en/latest/http-client/client.html#sending-requests.
$responses = $client->send(array(
$requestObj1,
$requestObj2,
...
));
(given that each request object is an instance of
Guzzle\Http\Message\EntityEnclosingRequestInterface)
当响应返回时,为了确定哪个响应是针对哪个请求的,我们可以循环每个请求并获取响应(仅在执行上述命令后可用):
$response1 = $requestObj1->getResponse();
$response2 = $requestObj2->getResponse();
...
B、问题
如果请求对象包含相同的数据。无法识别原始请求。
假设我们有以下场景,需要创建 2 篇文章:A 和 B 在远程服务器上:something.com/articles/create.json
每个请求都有相同的 POST 数据:
subject: This is a test article
创建后,Guzzle 会返回 2 个位置的响应:
something.com/articles/223.json
something.com/articles/245.json
使用上述方法将响应链接到其请求,我们仍然不知道哪个响应是针对哪篇文章的,因为请求对象是完全一样的.
因此在我的数据库中我无法写下结果:
article A -> Location: 245.json
article B -> Location: 223.json
因为也可以反过来:
article A -> Location: 223.json
article B -> Location: 245.json
解决方案是在 POST 请求中添加一些额外的参数,例如
subject: This is a test article
record: A
然而,距离服务器将返回错误并且不会创建文章,因为它不理解关键“记录”。距离服务器是第三方服务器,我无法改变它的工作方式。
另一个正确的解决方案是在请求对象上设置一些特定的 id/标签,以便我们以后可以识别它。但是,我查看了文档,但没有方法可以唯一标识请求,例如
$request->setID("id1")
or
$request->setTag("id1")
这个问题已经困扰我几个月了,但仍然无法解决这个问题。
如果您有解决方案,请告诉我。
非常感谢,你救了我!!!!
感谢您阅读这篇长文。