Получаем курс валют с cbr.ru , скачиваем в корень, и вытаскиваем значения текущего курса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
<?php class Rates { public function getXmlRates () // Получаем котировки { $dateNow = date("d-m-Y"); if (file_exists("XML_daily_last.asp")) { $dateCreateFile = date("d-m-Y" , filemtime('XML_daily.asp')); } else { $dateCreateFile = date("d-m-Y", time()-86400); } if ($dateNow != $dateCreateFile) { $url = "http://www.cbr.ru/scripts/XML_daily.asp"; exec("wget -O XML_daily.asp {$url}"); // получаем курс на сегодня exec("wget -O XML_daily_last.asp {$url}?date_req=".date("d/m/Y", time() - 86400)); // получаем курс за вчера } } public function __construct() { $this->getXmlRates(); } public function getRates ($type, $last = 0) // Получаем курс { $type = strtoupper($type); $xml = simplexml_load_file('XML_daily.asp'); $xml_last = simplexml_load_file('XML_daily_last.asp'); foreach ($xml as $key => $value) { if($value->CharCode == $type){ $res = $value->Value; } } foreach ($xml_last as $key => $value) { if($value->CharCode == $type){ $resLast = $value->Value; } } if ($last == 0) { return str_replace(",", ".", $res); } elseif ($last == 1) { return str_replace(",", ".", $resLast); } } public function changeRates ($type) // Сравнение курса, сегодня/вчера { $type = strtoupper($type); if ($this->getRates($type) > $this->getRates($type, 1)) { return 1; } elseif (($this->getRates($type)) < ($this->getRates($type, 1))) { return -1; } elseif ($this->getRates($type) == $this->getRates($type, 1)) { return 0; } } } $out = new Rates; echo "Текущий курс EUR: {$out->getRates("EUR")} | Курс вчера: {$out->getRates("EUR",1)}<br />Текущий курс USD {$out->getRates("USD")}"; ?> |
Ещё вариант , напрямую с сервера cbr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php class Rates { function rateOut ($value) { // Определяем Валюту $value = strtoupper($value); if ($value == "USD") { $val = 1; } elseif ($value == "EUR") { $val = 5; } return $this->getRates($val); } function getRates ($value) { // Получаем значение валюты return simplexml_load_file("https://wm.exchanger.ru/asp/XMLWMList.asp?exchtype=$value")->BankRate; } } $obj = new Rates; echo $obj->rateOut("usd"); ?> |
Если на сервере запрещен вызов функции exec, стоит воспользоваться командой
file_get_contents($url);
и записать результат с помощью
fwrite();
Например:
1 2 3 4 5 6 |
<?php $getRates = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp"); $file = fopen("XML_daily.asp", "w+"); fwrite($file, $getRates); fclose($file); ?> |
Иногда стоит использовать абсолютный путь к файлу
1 2 |
$ROOT_DIR = $_SERVER['DOCUMENT_ROOT']; $xml = simplexml_load_file("$ROOT_DIR/XML_daily.asp"); |
Вариант загрузки котировок без exec
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function getRatesPos () { $dateNow = date("d-m-Y"); $dateCreateFile = date("d-m-Y" , filemtime('XML_daily.asp')); if ($dateNow != $dateCreateFile) { $xml_to_day = fopen("XML_daily.asp", "w+"); fwrite($xml_to_day, file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=".date("d/m/Y"))); fclose($xml_to_day); $xml_to_last = fopen("XML_daily_last.asp", "w+"); fwrite($xml_to_last, file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=".date("d/m/Y", time() - 86400))); fclose($xml_to_last); } } |
ВАЖНО создать файлы
XML_daily.asp
XML_daily_last.asp
И дать права 777 на файлы
New Version
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
<?php /** * Class для работы с cbr.ru * Получаем курс валют */ class ExchangeRates { /** * Папка в той же директории где и скрипт */ const __DIR__ = 'tmp/'; /** * Загружаем/обновляем курсы валют * @return NULL создаются/обновляются файлы */ public function getRates() { $date = new DateTime(); $dateNow = $date->format('d/m/Y'); $dateYesterday = $date->modify("-1 day")->format('d/m/Y'); $dateCreateFile = file_exists(self::__DIR__ . "XML_daily_last.asp") ? $date->setTimestamp(filemtime(self::__DIR__ . 'XML_daily.asp'))->format('d-m-Y') : $date->modify("-1 day")->format('d-m-Y'); if ($dateNow != $dateCreateFile) { $url = "http://www.cbr.ru/scripts/XML_daily.asp"; $this->updateFile("XML_daily.asp", file_get_contents($url . "?date_req=" . $dateNow)); $this->updateFile("XML_daily_last.asp", file_get_contents($url . "?date_req=" . $dateYesterday)); } } /** * Загружаем файл * @param string $file_name Название файла * @param string $message Содержание файла * @return NULL Запись в файл */ public function updateFile($file_name, $message) { $file = fopen(self::__DIR__ . $file_name, 'w+'); fwrite($file, $message); fclose($file); } /** * Вывод ошибок * @param string $msg Сообщение об ошибке * @return NULL Ошибка и die */ public function printError($msg) { die("Error: " . $msg . PHP_EOL); } /** * Формирование ошибок * @return NULL формирование ошибок и вывод */ public function errors() { if (!is_dir(self::__DIR__ ) && !mkdir(self::__DIR__)){ $this->printError("No found dir and can't create dir " . self::__DIR__); } } /** * Стартуем юху */ public function __construct() { $this->errors(); $this->getRates(); } /** * Получаем котировку * @param string $type Валюта * @param integer $last 0 - текущий день / 1 - предыдущий день * @return integer курс */ public function get($type, $last = 0) { $type = strtoupper($type); $xml = simplexml_load_file(self::__DIR__ . 'XML_daily.asp'); $xml_last = simplexml_load_file(self::__DIR__ . 'XML_daily_last.asp'); foreach ($xml as $key => $value) { if($value->CharCode == $type){ $res = $value->Value; } } foreach ($xml_last as $key => $value) { if($value->CharCode == $type){ $resLast = $value->Value; } } if ($last == 0) { return str_replace(",", ".", $res); } elseif ($last == 1) { return str_replace(",", ".", $resLast); } } /** * Изменение курса * @param string $type Валюта * @return integer 1 - курс больше / -1 - меньше / 0 - без изменеинй */ public function change($type) { $type = strtoupper($type); if ($this->get($type) > $this->get($type, 1)) { return 1; } elseif (($this->get($type)) < ($this->get($type, 1))) { return -1; } elseif ($this->get($type) == $this->get($type, 1)) { return 0; } } } |