【问题标题】:Simultaneous HTTP requests with goutte带有 gotte 的同时 HTTP 请求
【发布时间】:2020-02-07 05:24:47
【问题描述】:

我知道goutte 是建立在guzzle 之上的。 Here's a sample 的并发 HTTP 请求与 guzzle。

<?php
$client->send(array(
    $client->get('http://www.example.com/foo'),
    $client->get('http://www.example.com/baz'),
    $client->get('http://www.example.com/bar')
));

同时请求也可以通过 goutte 运行吗?

【问题讨论】:

标签: php http curl guzzle goutte


【解决方案1】:

查看 Goutte 的代码,很快就发现它不支持多个请求。

但是,如果您愿意,您可以通过收集 Guzzle 请求并创建一个新的 Symfony\Component\BrowserKit\Response 对象来模仿 Goutte,这是 Goutte 返回供用户交互的对象.

Check out their createResponse() function(不幸的是受到保护)了解更多信息。

<?php

// Guzzle returns an array of Responses.
$guzzleResponses = $client->send(array(
    $client->get('http://www.example.com/foo'),
    $client->get('http://www.example.com/baz'),
    $client->get('http://www.example.com/bar')
));

// Iterate through all of the guzzle responses.
foreach($guzzleResponses as $guzzleResponse) {
    $goutteObject = new Symfony\Component\BrowserKit\Response(
           $guzzleResponse->getBody(true), 
           $guzzleResponse->getStatusCode(), 
           $guzzleResponse->getHeaders()
    );

    // Do things with $goutteObject as you normally would.
}

注意,当您在 $guzzleResponses 中等待收集响应时,它将等待所有异步完成。如果您想立即回复,请查看Guzzle documentation for handling async requests

【讨论】:

  • 感谢埃文!我完全同意你的观点,并开始亲自攻击 Goutte。不过,我提出的更改略有不同。我在 goutte 客户端中添加了doRequestMulti,在 BrowserKit 客户端中添加了requestMulti(还没有时间测试!)。显然,一些功能将丢失(对 cookie、“绝缘”、重定向和历史记录的支持),但它可能适用于我的用例,因为我不想爬过这些多请求页面中的任何一个。让我做一个小测试,然后和你一起回过头来。
  • @quickshiftin 是的,Goutte 在请求时提供的一些功能会丢失,但它为返回的内容提供了一些遍历能力。 (在这种情况下会使 goutte 无用)
猜你喜欢
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多