Парсер курса доллара на PHP (функция)

06.03.2012 04:27 Администратор PHP
Печать

Довольно часто на сайте нужно вывести курс доллара, евро или любую другую валюту. Данные как вы уже поняли будем просто брать с другого сайта (парсить) и выводит на нашем. Данные будем брать с Центрального банка Российской Федерации.

 Брать на прямую данные с сайта cbr.ru не особо правильно, так как придется загружать всю их страницу, а потом с ней работать. К счастью у них есть XML видимо специально для разработчиков. Вот именно оттуда мы и будем брать курс по id валюты. Где взять id валюты? Да в том же XML файле http://www.cbr.ru/scripts/XML_daily.asp?date_req=06.03.2012 ищем нужную нам валюту и запомниаем его id (к примеру R01135)

Собственно перейдем к написанию кода

 function valuta($id){
$date = date("d/m/Y");
$link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date";
$str = file_get_contents ($link);
preg_match('#<Valute ID="'.$id.'">.*?.<Value>(.*?)</Value>.*?</Valute>#is', $str, $value);
preg_match('#<Valute ID="'.$id.'">.*?.<CharCode>(.*?)</CharCode>.*?</Valute>#is', $str, $code);
$write = $code[1].' '.$value[1];
return $write;
}
echo valuta('R01239');

 Вот вроде бы и все у нас выводится курс евро, так же можно меняя id выводить и другие валюты. Код получился маленький, но у него есть один большой недостаток, он будет запрашивать курс доллара после каждого обновления страницы что ни есть хорошо. Так мы будем создавать нагрузку за которую возможно и бан получить. Представьте если все будут так же при кажом обновлении запрашивать курс, сервер будет тупить и отдавать нам курс уже не так быстро.

К счастю выход есть всегда - сделать кеш.

Приступим к добавлению кеша в функцию

function valuta($id){
$cache=0;
 $time_cache=10800; // время жизни кеша
$time = time();
if(file_exists($id)){
$str = file_get_contents($id);
$str = explode(":", $str);
if($str[0]<$time) {
$cache=1;
}
else{
return $str[1];
}
}
else{
$cache=1;
}
if($cache==1){
$date = date("d/m/Y");
$link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date";
$str = file_get_contents ($link);
preg_match('#<Valute ID="'.$id.'">.*?.<Value>(.*?)</Value>.*?</Valute>#is', $str, $value);
preg_match('#<Valute ID="'.$id.'">.*?.<CharCode>(.*?)</CharCode>.*?</Valute>#is', $str, $code);
if($value[1]!=''){
$write = $code[1].' '.$value[1];
file_put_contents($id, $time+$time_cache.':'.$write);
return $write;
}
}
}

echo valuta('R01239');
echo "<br />";
echo valuta('R01235');

 Вот теперь все. Скрипт записывает полученные данные в файл и при последующих обращениях берет данные из файла при условии что кеш актуален.

Вот что у меня выводит данный скрипт: