Отправка нескольких запросов goutte асинхронно

Это код, который я использую

require_once 'goutte.phar';
use Goutte\Client;
$client = new Client();
for($i=0;$i<10;$i++){
$crawler = $client->request('GET', 'http://website.com');
echo '<p>'.$crawler->filterXpath('//meta[@property="og:description"]')->attr('content').'</p>';
echo '<p>'.$crawler->filter('title')->text().'</p>';
}

Это работает, но занимает много времени для обработки? Есть ли способ сделать это быстрее.

1

Решение

Для начала, в вашем примере кода нет ничего асинхронного. Это означает, что ваше приложение будет последовательно выполнять запрос get, ждать ответа, анализировать ответ и затем возвращаться обратно.

Хотя Goutte использует Guzzle для внутреннего использования, он не использует асинхронные возможности Guzzles.

Чтобы сделать ваш код асинхронным, вы можете обратиться к документации по Guzzle:

Ваш пример кода выше приведет к чему-то вроде:

require 'vendor/autoload.php' //assuming composer package management.

$client = new GuzzleHttp\Client();

$requests = [
$client->createRequest('GET', $url1),
$client->createRequest('GET', $url2),
$client->createRequest('GET', $url3),
$client->createRequest('GET', $url4),
$client->createRequest('GET', $url5),
$client->createRequest('GET', $url6),
$client->createRequest('GET', $url7),
$client->createRequest('GET', $url8),
$client->createRequest('GET', $url9),
$client->createRequest('GET', $url10),
];

$options = [
'complete' => [
[
'fn' => function (CompleteEvent $event) {
$crawler = new Symfony\Component\DomCrawler\Crawler(null, $event->getRequest()->getUrl());
$crawler->addContent($event->getResponse->getBody(), $event->getResponse()->getHeader('Content-Type'));
echo '<p>'.$crawler->filterXpath('//meta[@property="og:description"]')->attr('content').'</p>';
echo '<p>'.$crawler->filter('title')->text().'</p>';
},
'priority' => 0,    // Optional
'once'     => false // Optional
]
]
];

$pool = new GuzzleHttp\Pool($client, $requests, $options);

$pool->wait();
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]