与Goutte的异步HTML解析器

时间:2016-01-08 20:35:04

标签: php symfony guzzle goutte

我试图在Goutte的帮助下编写HTML解析器。它工作得很好。但是Goutte使用阻止请求。如果您正在处理单个服务,这很有效。如果我想查询许多彼此独立的服务,这会导致问题。 Goutte使用BrowserKitGuzzle。我试图改变doRequest函数,但它失败了

  

参数1传递给   Symfony \ Component \ BrowserKit \ CookieJar :: updateFromResponse()必须是   Symfony \ Component \ BrowserKit \ Response

的一个实例
GET http://path/to/this/file.php HTTP/1.1
User-Agent: example
... other parameters

如何更改Goutte \ Client.php以便它以异步方式执行请求?这是不可能的,我如何运行同时针对不同端点的剪贴板?感谢

1 个答案:

答案 0 :(得分:1)

Goutte本质上是Guzzle和Symphony的Browserkit和DomCrawler之间的桥梁。

使用Goutte的最大缺点是所有请求都是同步的

要以异步方式完成任务,您必须放弃使用Goutte并直接使用Guzzle和DomCrawler。

例如:

$requests = [
    new GuzzleHttp\Psr7\Request('GET', $uri[0]),
    new GuzzleHttp\Psr7\Request('GET', $uri[1]),
    new GuzzleHttp\Psr7\Request('GET', $uri[2]),
    new GuzzleHttp\Psr7\Request('GET', $uri[3]),
    new GuzzleHttp\Psr7\Request('GET', $uri[4]),
    new GuzzleHttp\Psr7\Request('GET', $uri[5]),
    new GuzzleHttp\Psr7\Request('GET', $uri[6]),
];

$client = new GuzzleHttp\Client();

$pool = new GuzzleHttp\Pool($client, $requests, [
    'concurreny' => 5, //how many concurrent requests we want active at any given time
    'fulfilled' => function ($response, $index) {
        $crawler = new Symfony\Component\DomCrawler\Crawler(null, $uri[$index]);
        $crawler->addContent(
            $response->getBody()->__toString(),
            $response->getHeader['Content-Type'][0]
        );        
    },
    'rejected' => function ($response, $index) {
        // do something if the request failed.
    },
]);

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