Я пытаюсь ускорить выполнение сценария с помощью функции одновременного запроса 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;
}
Я бы подумал, что это значительно сократит время, но это займет столько же времени, сколько и в оригинальном сценарии. С чего бы это? Что мне не хватает? Спасибо за любую помощь.
Я думаю, что основная причина отсутствия разницы во времени связана с тем, как вы обрабатываете ответы. В первом примере ваши запросы и ответы выполняются последовательно. Выполнить запрос, получить ответ, обработать его. Во втором примере вы выполняете свои запросы, ожидаете все ответы, а затем последовательно обрабатываете ответы. Если предположить, что обработка ответов идентична, ваша единственная разница во времени будет результатом выполнения запросов асинхронно.
Сказав это, вы можете увидеть лучшие результаты с GuzzleHttp \ Pool. У меня были хорошие результаты с этим. Ваш конкретный случай может отличаться.
Других решений пока нет …