Это код, который я использую
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>'; }
Это работает, но требуется много времени для обработки? Есть ли способ сделать это быстрее.
Во-первых, нет ничего асинхронного в вашем примере кода. Это означает, что ваше приложение будет последовательно, выполнить запрос на получение, дождаться ответа, проанализировать ответ и затем выполнить обратный вызов.
Хотя 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();