Получить курсы валют с 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(in_array($code, $data)){
      return $data[$code]['v'];
    }else{
      return false;
    }
  }
  return $data;
}

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

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

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

    Документация на русском по MODX MIGX

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

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

    [MODX] Подсказки по работе и заготовки для MiniShop2

    jQuery.Maskedinput js - документация на русском с примерами

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

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

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

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

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

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

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

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

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

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

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

    [MODX, MiniShop2] Примеры выборки where, optionFilters, innerJoin

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

    [MODX] pThumb - ресайз изображений. Примеры использования.

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

    Отключить автозаполнение input

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

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

    Настройка Webpack - несколько точек входа и разделение на чанки

    Все записи

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