Когда я вызываю вызов API автозаполнения Google Адресов (более https) из PHP с помощью cURL, я нахожу, что он намного медленнее, чем выбор того же URL-адреса из веб-браузера: на PHP такой вызов обычно занимает около 200 мс, а выборки того же URL-адреса в веб-браузере, согласно Firebug, занимает не более 45 мс. Это замедление в 4-5 раз. Более точно: первый вызов в веб-браузере может занимать до 250 мс, но последующие выборки в веб-браузере, даже при использовании разных параметров, бывают быстрыми.
Обратите внимание, что оба теста протестированы на одном компьютере, поэтому я не думаю, что вы можете обвинить его в скорости моей сети.
Теперь при добавлении туда-обратно из мобильного приложения на мой сервер такая задержка очень заметна, почти неприемлема.
Поэтому мой вопрос: в чем причина этого дополнительного замедления, и есть ли способ исправить это?
Мое первое предположение заключается в том, что SSL-квитирование и проверка сертификата API Google могут быть частью проблемы, и, возможно, поэтому первая выборка в браузере одинаково медленная. Но что бы я ни пытался, я не могу найти способ сделать это быстрее в PHP. Я думал о добавлении явного кэша для сертификата, я даже не знаю, технически ли это возможно.
Обновление: демонстрационный код (вам нужно будет заполнить свой собственный ключ API):
<?php $input = isset($_GET['input']) ? $_GET['input'] : 'vla'; define('APIKEY', 'your api key'); $params = array( 'input' => $input, 'types' => '(regions)', 'sensor' => 'false', 'language' => 'nl', 'key' => APIKEY, ); $url = "https://maps.googleapis.com/maps/api/place/autocomplete/json?" . http_build_query($params); // Initialize session and set URL. $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); // Set so curl_exec returns the result instead of outputting it. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // accept any CA curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $t = array(microtime(true)); // Get the response $json = curl_exec($ch); $t[] = microtime(true); // close the channel. curl_close($ch); echo '<plaintext>'; echo $url, "\n"; // show benchmark time printf("%s\t%0.6fs\n", 'Time', $t[sizeof($t)-1]-$t[0]); // show JSON echo $json;