Почему функция одновременных запросов Guzzle не работает быстрее?

Я пытаюсь ускорить выполнение сценария с помощью функции одновременного запроса Guzzle, однако два сценария, которые у меня, похоже, занимают одинаковое количество времени.

У меня есть два php-скрипта, которые просто извлекают последние 100 постов из учетной записи instagram пользователя, чтобы получить код для встраивания каждого поста. Instagram имеет ограничение в 20 сообщений на запросы, поэтому он просматривает 5 раз. В Instagram также используется oembed, поэтому, когда я получаю URL каждого сообщения, мне нужно отправить его в конечную точку oembed, чтобы получить соответствующий html.

В исходном сценарии, не использующем параллельные запросы, он извлекает 100 почтовых URL-адресов, а затем просматривает запрашиваемые данные.

public function getinstagramPosts2($instagram_id,$token)
{
$url = 'https://api.instagram.com/v1/users/' . $instagram_id . '/media/recent/';

$urlparams = [
'access_token' => $token,
];

$count = 0;

for($i=1 ; $i<6; $i++)
{
$response = $this->getURLResponse($url, $urlparams);

foreach ($response['data'] as $instapost)
{
$url = 'http://api.instagram.com/publicapi/oembed/?url=' . $instapost['link'];

$embedresponse = $this->getURLResponse($url);

$posts[$count]['html'] = $embedresponse['html'];

$count++;

}
if(isset($response['pagination']['next_url']))
{
$url = $response['pagination']['next_url'];
}else
{
break;
}
}

return $posts;
}

Во втором сценарии он извлекает 100 сообщений, а затем использует функцию одновременных запросов Guzzle для загрузки объединенных запросов и их параллельного выполнения.

public function getinstagramPosts($instagram_id,$token)
{
$url = 'https://api.instagram.com/v1/users/' . $instagram_id . '/media/recent/';

$urlparams = [
'access_token' => $token,
];

$count = 0;

for($i=1 ; $i<6; $i++)
{
$response = $this->getURLResponse($url, $urlparams);

foreach ($response['data'] as $instapost)
{

$url = 'http://api.instagram.com/publicapi/oembed/?url=' . $instapost['link'];

$promises[$count] = $this->getHttpClient()->getAsync($url);

$count++;

}
if(isset($response['pagination']['next_url']))
{
$url = $response['pagination']['next_url'];
}else
{
break;
}
}

$results = Promise\unwrap($promises);

$count = 0;

foreach($results as $result)
{

$body = json_decode($result->getBody(),true);

$posts[$count]['html'] = $body['html'];

$count++;
}

return $posts;

}

Я бы подумал, что это значительно сократит время, но это займет столько же времени, сколько и в оригинальном сценарии. С чего бы это? Что мне не хватает? Спасибо за любую помощь.

0

Решение

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

Сказав это, вы можете увидеть лучшие результаты с GuzzleHttp \ Pool. У меня были хорошие результаты с этим. Ваш конкретный случай может отличаться.

1

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector