У меня есть очень простой вызов PHP для Alpha Vantage API, чтобы заполнить таблицу (или список) ценами на акции NASDAQ:
<?php
function get_price($commodity = "")
{
$url = 'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=' . $commodity . '&outputsize=full&apikey=myKey';
$obj = json_decode(file_get_contents($url), true);
$date = $obj['Meta Data']['3. Last Refreshed'];
$result = $obj['Time Series (Daily)']['2018-03-23']['4. close'];
$rd_result = round($result, 2);
echo $result;
}
?>
<?php get_price("XOM");
get_price("AAPL");
get_price("MSFT");
get_price("CVX");
get_price("CAT");
get_price("BA");
?>
И это работает, но чертовски медленно. Это может занять более 30 секунд. для загрузки, пока файл json из Alpha Vantage загружается за доли секунды.
Кто-нибудь знает, где я ошибаюсь?
Да, но определенно должен быть другой способ ускорить процесс (то есть делать все звонки одновременно, а не подряд), потому что представьте, что я хочу получить простой список всех 100 компаний на NASDAQ, что довольно разумно, чтобы собрать их все, потребуется несколько минут ...
Существуют библиотеки PHP для выполнения асинхронных HTTP-запросов. Вы можете найти некоторые из них, попробовать их и посмотреть, работают ли они для вас.






ОБНОВЛЕНИЕ: Котировки на серийные запасы
Вы можете также рассмотреть возможность использования этого типа запроса. Множественные котировки акций за один звонок.
Кроме того, при использовании полного размера вывода используются данные за последние 20 лет, если это применимо. Уберите это из своего запроса и пусть API использует сжатый вывод по умолчанию.
РЕДАКТИРОВАТЬ: Согласно вышеизложенному, вы должны внести изменения в свой запрос. Но это также может быть проблема с вашим сервер. Я протестировал это для случая использования, над которым я работаю, и мне требуется несколько секунд, чтобы получить данные, хотя я использую только один символ акций на странице за раз.
Если вам кажется, что работа идет слишком медленно, попробуйте увеличить лимит памяти.
<?php
ini_set('memory_limit','500M'); // or your desired limit
?>
Кроме того, если у вас общий хостинг, проблема будет в мощь. Однако я недостаточно знаю о вашем сервере, чтобы ответить на этот вопрос полностью.
ссылка ничего не говорит о "пакетных котировках" ... ?
Это то, что я сделал, когда API потребовалось время, чтобы ответить, мое решение написано на C#, но логика была бы такой же.
string[] AlphaVantageApiKey = { "RK*********", "B2***********", 4FD*********QN", "7S3Z*********FRX", "U************I3" };
int ApiKeyValue = 0;
foreach (var stock in listOfStocks)
{
DataTable dtResult = DataRetrival.GetIntradayStockFeedForSelectedStockAs(stock.Symbol.Trim().ToUpper(), ApiKeyValue);
ApiKeyValue = (ApiKeyValue == 4) ? 0 : ApiKeyValue + 1;
}
Я использую от 5 до 6 разных ключей API, когда запрашиваю данные. Я зацикливался на каждом из них для каждого звонка. Там за счет уменьшения нагрузки на один перпендикулярный жетон.
Я заметил, что это значительно улучшило мою производительность. На получение данных по 50 акциям в течение дня у меня уходит меньше 1 минуты.
Еще один способ повысить производительность - использовать
outputsize=compact
compact возвращает только последние 100 точек данных во временном ряду.
Когда я пытался получить доступ к этим URL-адресам, мне требуется около 2-4 секунд, чтобы полностью их получить (каждый). При попытке вашего кода на выполнение всего этого потребовалось около 16-18 секунд, что правильно, поскольку вы получаете 6 URL-адресов. Если их API немного отстает (или ваш сервер, так как вы получаете много данных одновременно), иногда это может занять больше времени.