Получить курсы валют с cbr.ru на PHP с кэшированием результатов

rates_cbr() — Получить весь список валют

rates_cbr("USD") — Получить курс рубля к конкретной валюте

function rates_cbr($code = false){
  $cache_file = $_SERVER['DOCUMENT_ROOT']."/rates_cbr.cache.php";
  $data = array();
  
  if (!is_file($cache_file) || filemtime($cache_file) < time() - 3600*6) {
    $url = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=".date("d/m/Y");
    $is_valid = false;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);
    
    $json_daily_temp = simplexml_load_string($output);
    if(curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200 && $json_daily_temp && !empty($json_daily_temp->Valute)){
      $is_valid = true;
    }
    curl_close($ch);
    if($is_valid){
      foreach($json_daily_temp as $k => $v){
        $ta = [];
        //$ta["ID"] = strval($v->attributes()->ID);
        //$ta["NumCode"] = strval($v->NumCode);
        //$ta["CharCode"] = strval($v->CharCode);
        //$ta["Nominal"] = strval($v->Nominal);
        $ta["n"] = (string) $v->Name;
        $ta["v"] = round(floatval(str_replace(",",".", $v->Value)) / intval($v->Nominal), 2);
        $data[strval($v->CharCode)] = $ta;
      }
      file_put_contents($cache_file, "<?php return " . var_export($data, true) . " ?>");
    }elseif(is_file($cache_file)){
      // Если не достучались до cbr, то продлеваем время жизни кэша
      $data = include $cache_file;
      file_put_contents($cache_file, "<?php return " . var_export($data, true) . " ?>");
    }
  }elseif(is_file($cache_file)){
    // Если не достучались до cbr, то продлеваем время жизни кэша
    $data = include $cache_file;
    file_put_contents($cache_file, "<?php return " . var_export($data, true) . " ?>");
  }
  if(!empty($code)){
    $code = strtoupper($code);
    if(!empty($data[$code])){
      return $data[$code]['v'];
    }else{
      return false;
    }
  }
  return $data;
}

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

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

    Похожие статьи

    Пример перевода с помощью Yandex Translate API

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

    Как поменять версию PHP, используемую в командной строке на Windows

    Как контролировать кэш CSS и скриптов

    Как поменять язык в Faker

    Транслитерация URL в Laravel. Примеры str_slug()

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

    Курсы валют с cbr.ru на PHP

    Разные фишки, заготовки

    Laravel Excel - Базовый экспорт

    Получить вложенный массив из плоского

    Namespace на примерах - Как понять пространства имен в PHP

    Заготовки для автоматического заполнения товарами магазина 1.5.5.1.2

    Как сделать middleware в Laravel 6 - простой пример

    Как обработать POST данные в PHP

    Примеры работы с API

    Загрузить файл для постобработки

    Получить время выполнения PHP скрипта. Решение в 3 строки кода

    Получить курсы валют с cbr.ru на PHP с кэшированием результатов

    Экспорт маршрутов из Laravel в JSON файл

    Фиксированная сортировка массива на основе хэша

    Вывести список всех файлов на сервере (и размер файла)

    Наш сайт использует куки, нажмите «ОК» если вы не против
    OK