Курсы валют с cbr.ru на PHP, с запасным вариантом и кэшированием

function CBR_XML_Daily_Ru() {
  $json_daily_file = $_SERVER['DOCUMENT_ROOT'].'/CBR_XML_daily.json';
  
  if (!is_file($json_daily_file) || filemtime($json_daily_file) < time() - 3600) {
    // Стучимся в CBR
    $cbr_url = "http://www.cbr.ru/scripts/XML_daily.asp";
    $cbr_valid = false;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $cbr_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $cbr_output = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    $json_daily_temp = simplexml_load_string($cbr_output);
    if($http_code === 200 AND $json_daily_temp){
      $cbr_valid = true;
    }
    if($cbr_valid){
      $valute = array();
      foreach($json_daily_temp->Valute as $k => $v){
        $ta = [];
        $ta["ID"] = (string) $v->attributes()->ID;
        $ta["NumCode"] = (string) $v->NumCode;
        $ta["CharCode"] = (string) $v->CharCode;
        $ta["Nominal"] = (string) $v->Nominal;
        $ta["Name"] = (string) $v->Name;
        $ta["Value"] = (float) str_replace(",",".", $v->Value);
        $valute[$ta["CharCode"]] = $ta;
      }
      file_put_contents($json_daily_file, json_encode(array(date("c") => $valute), JSON_UNESCAPED_UNICODE));
    }else{
      // Пробуем достучаться до альтернативы
      $json_daily = json_decode(file_get_contents('https://www.cbr-xml-daily.ru/daily_json.js'), true);
      file_put_contents($json_daily_file, "  ".json_encode(array($json_daily['Timestamp'] => $json_daily['Valute']), JSON_UNESCAPED_UNICODE));
    }
  }
  return json_decode(file_get_contents($json_daily_file), true);
}

$cbr_value = CBR_XML_Daily_Ru();
print_r($cbr_value);

Комментарии (1)

  1. Аександр 15 августа 2019, 11:54 # 0
    Попробуйте currate.ru там проще будет с курсами работать, в одну строку кода можно получить курсы
    *Комментарий будет опубликован после проверки модератором

    [MODx] Генератор настроек MIGX

    [MODx, MIGx] Документация на русском по MIGX

    [MODX] Импорт и экспорт в MiniShop2. Реализация 1

    [MODx] minishop2 tips

    [JS] Маска для ввода телефона +7(___)___-__-__

    [MODx, miniShop2] Генерация YML для выгрузки в маркет

    Как включить HTTPS (SSL) в MODX - Подробная инструкция

    [MODx] Подсказки по API

    [OpenCart] Вывести на главную все категории с картинками

    [MODx, MIGX] Примеры использования

    [MODx] Сайт на обслуживании (выключить сайт)

    Универсальная форма обратной связи — feedBackForm

    [PHP, JSON] Пример перевода с помощью Yandex Translate API

    [MODx, Gallery] Галерея. Вывести обложки альбомов и фотографии

    Расширение свойств товаров minishop2

    [Opencart] Вернуть английский язык, если вы его удалили

    [OpenCart] Вывести модуль напрямую через контроллер

    [MODx, Quip] Более рабочий вариант.

    [MODX, MIGX] Вывести getImageList только если он не пустой

    [MODX, MIGX] Тип поля "Список ресурсов" (resourcelist) с ограничением по родителю (parents)

    Красивое адаптивное меню под pdoMenu

    [MODx] Создать источник файлов

    [MODx] Вывод tv-параметров в формате [название TV] - [значение TV]

    [PHP] Простое логирование

    [MODX] Вывести список всех опций MiniShop2

    Все записи