<
  • Главная
Статьи

Парс курси валют на php і кешіруем їх в 1с-Бітрікс

  1. Отримуємо і обробляємо дані
  2. Кешіруем результат в 1с-Бітрікс
  3. Схожі записи

Досить часто власники сайтів просять поставити на свої проекти індикатори курсів валют і їх динаміку. Можна скористатися готовими інформерамі, але вони не завжди дозволяють належним чином налаштувати зовнішній вигляд.

Тому зараз ми зробимо парсер курсу валют на php з сайту cbr.ru , Відобразимо динаміку зміни курсу і в кінці закешіруем отримані дані для ефективного використання в 1с-Бітрікс.

Отримуємо і обробляємо дані

Найсвіжіші дані ми будемо отримувати з xml-файлу, який абсолютно безкоштовно надає нам сайт cbr.ru. Адреса файлу має вигляд - http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=10/02/2011&date_req2=26/02/2011&VAL_NM_RQ=R01235

Тут date_req1 - дата початку періоду; date_req2 - дата кінця періоду, за який потрібна динаміка; VAL_NM_RQ - ідентифікатор валюти (R01235 для USD, R01239 для EUR)

Структура отриманого xml-файлу така:

<ValCurs ID = "R01239" DateRange1 = "18/02/2011" DateRange2 = "19/02/2011" name = "Foreign Currency Market Dynamic"> <Record Date = "18.02.2011" Id = "R01239"> < Nominal> 1 </ Nominal> <Value> 39,6821 </ Value> </ Record> <Record Date = "19.02.2011" Id = "R01239"> <Nominal> 1 </ Nominal> <Value> 39,7682 </ Value> </ Record> </ ValCurs>

Як ми бачимо, записи йдуть в порядку зростання дати і потрібне значення зберігається в тезі і його легко отримати регулярним виразом.

// формуємо 2 дати - "завтра" і кілька днів тому $ curDate = date ( 'd / m / Y', mktime (0,0,0, date ( "n"), date ( "j") + 1, date ( "Y"))); $ CurDate2 = date ( 'd / m / Y', mktime (0,0,0, date ( "n"), date ( "j") - 10, date ( "Y"))); // xml з сайту ЦБ РФ $ currencyXML = file_get_contents ( 'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.$curDate2.'&date_req2='.$curDate.'&VAL_NM_RQ=R01235') ; // прибираємо переноси рядків $ currencyXML = str_replace (Array ( "\ r \ n", "\ n", "\ r"), '', $ currencyXML); // регулярний вираз отримує все значення тегів <Value> в масив $ arValues ​​preg_match_all ( '# <Value> (. *?) </ Value> #', $ currencyXML, $ arValues, PREG_PATTERN_ORDER); // якщо збігів більше одного, тобто в xml були дані як мінімум за 2 дні і можна відстежити динаміку if (count ($ arValues ​​[1])> = 2) {// розгорнемо масив, щоб першими йшли свіжі дані $ arValues ​​[1] = array_reverse ($ arValues ​​[1 ]); // зробимо резделітелем цілої і дробової частини точку $ kurs = str_replace ( ",", ".", $ ArValues ​​[1] [0]); // різниця курсів, округлена до 4х знаків після коми $ diff = round (floatval (str_replace ( ",", ".", $ ArValues ​​[1] [0])) - floatval (str_replace ( ",", "." , $ arValues ​​[1] [1])), 4); }

«Завтра» і «кілька днів тому» вибрані не просто так - курс валюти іноді з'являється заздалегідь, а іноді не з'являється взагалі, наприклад по неділях або свят.
Тепер можна вивести в потрібному місці значення змінних $ kurs і $ diff і радіти отриманому результату :)

Але смикати xml на кожному хіті користувача недобре, тому все це справа потрібно закеширувати

Кешіруем результат в 1с-Бітрікс

Кешувати будемо результуючий html-код, для цього використовуємо клас CPageCache.

&lt;? If (! Defined ( "B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED! == true) die (); // створюємо об'єкт $ obCache = new CPageCache; // час кешування - 6 годин $ life_time = 60 * 60 * 6; // формуємо ідентифікатор кеша в залежності від усіх параметрів // які можуть вплинути на результуючий HTML $ cache_id = "iammegacachhhhhhhhhhhe"; // инициализируем буферізірованіе виведення if ($ obCache-> StartDataCache ($ life_time, $ cache_id, "/")): // формуємо 2 дати - "завтра" і кілька днів тому $ curDate = date ( 'd / m / Y' , mktime (0,0,0, date ( "n"), date ( "j") + 1, date ( "Y"))); $ CurDate2 = date ( 'd / m / Y', mktime (0,0,0, date ( "n"), date ( "j") - 10, date ( "Y"))); // xml з сайту ЦБ РФ $ currencyXML = file_get_contents ( 'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.$curDate2.'&date_req2='.$curDate.'&VAL_NM_RQ=R01235') ; // прибираємо переноси рядків $ currencyXML = str_replace (Array ( "\ r \ n", "\ n", "\ r"), '', $ currencyXML); // регулярний вираз отримує все значення тегів <Value> в масив $ arValues ​​preg_match_all ( '# <Value> (. *?) </ Value> #', $ currencyXML, $ arValues, PREG_PATTERN_ORDER); // якщо збігів більше одного, тобто в xml були дані як мінімум за 2 дні і можна відстежити динаміку if (count ($ arValues ​​[1])> = 2) {// розгорнемо масив, щоб першими йшли свіжі дані $ arValues ​​[1] = array_reverse ($ arValues ​​[1 ]); // зробимо резделітелем цілої і дробової частини точку $ kurs = str_replace ( ",", ".", $ ArValues ​​[1] [0]); // різниця курсів, округлена до 4х знаків після коми $ diff = round (floatval (str_replace ( ",", ".", $ ArValues ​​[1] [0])) - floatval (str_replace ( ",", "." , $ arValues ​​[1] [1])), 4); } Else {$ kurs = ""; $ Diff = ""; }?> USD: &lt;? = $ Kurs?> <br /> Зміна: &lt;? = $ Diff?> &lt;? // записуємо попередньо буферізірованний висновок в файл кеша $ obCache-> EndDataCache (); endif; ?>

Пара слів про вибір часу кешування і ідентифікатора кеша. Так як на всіх сторінках сайту результат роботи скрипта однаковий, то є сенс залишити ідентифікатором константу, тоді буде один періодично оновлюваний (6 годин на прикладі) файл кеша. Також можна прив'язати ідентифікатор до дати і збільшити час життя кешу, тоді нові дані будуть тягнутися рівно 1 раз на добу, але на кожен день з'явиться окремий файл.

Це не єдиний спосіб отримати дані про курси валют і спрямований, в першу чергу, на визначення динаміки їх зміни. Якщо потрібні тільки поточні значення, то логічніше його парсити з xml-файлу http://www.cbr.ru/scripts/XML_daily.asp, який містить відразу всі валюти.

Схожі записи

Якщо вам сподобалася стаття, підписуйтесь на оновлення блогу по rss або приєднуйтесь в twitter Поділитися посиланням з друзями:Asp?
Asp?
Lt;?
Kurs?
Diff?
Записуємо попередньо буферізірованний висновок в файл кеша $ obCache-> EndDataCache (); endif; ?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью