Получить курс доллара, евро, гривны... на PHP

 Пример работы:
1 USD = руб
1 EUR = руб
1 UAH = руб

 Делать будем так, получаем данные о курсе с внешнего ресурса, разбираем, сохраняем и используем далее для своих нужд.

 Парсить курс будем developer.yahoo.com, лимит 2000 запросов в час с одного IP, во избежания бана IP будем сохранять спарсенный курс в обычный файл и обновлять будем его например каждые 5 минут (5 мин = 12 запросов в час).

 1 пример парсим формат JSON в виде объектов.

<?php
$json = json_decode(file_get_contents('https://query.yahooapis.com/v1/public/yql?q=select+*+from+yahoo.finance.xchange+where+pair+=+"USDRUB,EURRUB"&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys'));

// можем посмотреть что спарсилось
// var_dump($json);

// курс USD/RUB
echo $json->query->results->rate[0]->Rate;
?>

 2 пример парсим формат JSON в виде ассоциативного массива.

<?php
$json = json_decode(file_get_contents('https://query.yahooapis.com/v1/public/yql?q=select+*+from+yahoo.finance.xchange+where+pair+=+"USDRUB,EURRUB"&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys'), true);

// можем посмотреть что спарсилось
// var_dump($json);

// курс USD/RUB
echo $json["query"]["results"]["rate"][0]["Rate"];
?>

 Использовать буду 2-й способ, получим курсы USD/RUB и EUR/RUB

<?php
$json = json_decode(file_get_contents('https://query.yahooapis.com/v1/public/yql?q=select+*+from+yahoo.finance.xchange+where+pair+=+"USDRUB,EURRUB"&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys'), true);

// можем посмотреть что спарсилось
// var_dump($json);

// курс USD/RUB
echo $json["query"]["results"]["rate"][0]["Rate"];
// курс EUR/RUB
echo $json["query"]["results"]["rate"][1]["Rate"];
?>

 Ну и готовый код, проверяем время последней загрузки курса, если истекло то загружаем новые данные (сохраняем) и отдаем курс, если не истекло то отдаем уже загруженный курс из файла.

<?php
// путь и файл в котором будем хранить курс
$file_kurs = 'kurs.dat';
// проверяем по времени последнего изменения файла
if (time() >= filemtime($file_kurs) + 300) { // 300 секунд = 5 минут

	// открываем из внешнего источника
	$json = json_decode(file_get_contents('https://query.yahooapis.com/v1/public/yql?q=select+*+from+yahoo.finance.xchange+where+pair+=+"USDRUB,EURRUB"&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys'), true);

	// ложим значения в переменные обрезав по 2 лишних символа от числа
	$kurs_usd_rub = substr($json["query"]["results"]["rate"][0]["Rate"], 0, 5);
	$kurs_eur_rub = substr($json["query"]["results"]["rate"][1]["Rate"], 0, 5);

	// открываем файл kurs.dat для чтения и записи...
	$fop_kurs = fopen($file_kurs , "w+");
	// записываем данные в файл kurs.dat данные из переменных 
	fwrite($fop_kurs, $kurs_usd_rub."\r\n".$kurs_eur_rub); 
	// закрываем файл
	fclose($fop_kurs);

} else {

	// читаем содержание файла, строки в массив
	$ar_kurs = file($file_kurs);
	// курс USD/RUB, 1 строка файла
	$kurs_usd_rub = $ar_kurs[0];
	// курс EUR/RUB, 2 строка файла
	$kurs_eur_rub = $ar_kurs[1];
}

// выводим курсы на экран
echo $kurs_usd_rub;
echo '<br />';
echo $kurs_eur_rub;
?>

 В URL строке парсинга можно указать например валюту UAH получается так UAHRUB, тоесть если парсить сразу 3 валюты то нужно прописать так USDRUB,EURRUB,UAHRUB и соответственно получить далее значения данной валюты из массива в нужную переменную.

 Поддерживает XML, JSON, JSONP, но стоит учесть что лимит 2000 запросов в час с одного IP.

 *при первом запуске скрипта на сервере вы получите ошибку "Warning: filemtime(): stat failed..." ибо файл kurs.dat не существует, но при первом запуске он создается и дальше ошибок не будет.