我试图在Goutte的帮助下编写HTML解析器。它工作得很好。但是Goutte使用阻止请求。如果您正在处理单个服务,这很有效。如果我想查询许多彼此独立的服务,这会导致问题。 Goutte使用BrowserKit和Guzzle。我试图改变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以便它以异步方式执行请求?这是不可能的,我如何运行同时针对不同端点的剪贴板?感谢
答案 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();