Клиент Alpha Vantage слишком медленный

У меня есть очень простой вызов 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 загружается за доли секунды.

Кто-нибудь знает, где я ошибаюсь?

Когда я пытался получить доступ к этим URL-адресам, мне требуется около 2-4 секунд, чтобы полностью их получить (каждый). При попытке вашего кода на выполнение всего этого потребовалось около 16-18 секунд, что правильно, поскольку вы получаете 6 URL-адресов. Если их API немного отстает (или ваш сервер, так как вы получаете много данных одновременно), иногда это может занять больше времени.

Magnus Eriksson 24.03.2018 13:30

Да, но определенно должен быть другой способ ускорить процесс (то есть делать все звонки одновременно, а не подряд), потому что представьте, что я хочу получить простой список всех 100 компаний на NASDAQ, что довольно разумно, чтобы собрать их все, потребуется несколько минут ...

chancar 24.03.2018 13:43

Существуют библиотеки PHP для выполнения асинхронных HTTP-запросов. Вы можете найти некоторые из них, попробовать их и посмотреть, работают ли они для вас.

Magnus Eriksson 24.03.2018 13:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
3
2 720
2

Ответы 2

ОБНОВЛЕНИЕ: Котировки на серийные запасы

Вы можете также рассмотреть возможность использования этого типа запроса. Множественные котировки акций за один звонок.

Кроме того, при использовании полного размера вывода используются данные за последние 20 лет, если это применимо. Уберите это из своего запроса и пусть API использует сжатый вывод по умолчанию.


РЕДАКТИРОВАТЬ: Согласно вышеизложенному, вы должны внести изменения в свой запрос. Но это также может быть проблема с вашим сервер. Я протестировал это для случая использования, над которым я работаю, и мне требуется несколько секунд, чтобы получить данные, хотя я использую только один символ акций на странице за раз.

Если вам кажется, что работа идет слишком медленно, попробуйте увеличить лимит памяти.

<?php
  ini_set('memory_limit','500M'); // or your desired limit
?>

Кроме того, если у вас общий хостинг, проблема будет в мощь. Однако я недостаточно знаю о вашем сервере, чтобы ответить на этот вопрос полностью.

ссылка ничего не говорит о "пакетных котировках" ... ?

Jim 01.12.2020 05:07

Это то, что я сделал, когда 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 точек данных во временном ряду.

Другие вопросы по теме