Отправка нескольких запросов 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>'; } 

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

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

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

Хотя 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();