Получение курса валют

Статус
В этой теме нельзя размещать новые ответы.

akhkharu

Постоялец
Регистрация
26 Июн 2007
Сообщения
110
Реакции
19
Условия: PHP5. Можно запускать через прокси (передавать GetCurrencty ссылку на контекст). Результат сохраняет в файлик currency.cache. Типы валют тоже легко изменяются:

PHP:
$usd = $this->xml->xpath("//Valute[@ID='R01235']/Value");
$eur = $this->xml->xpath("//Valute[@ID='R01239']/Value");

PHP:
<?php

	define('USE_PROXY', false);

	class CCurrency {
		private $currency;
		private $xml;
		private $count;

		public function GetCurrency($url, $context) {
			if (USE_PROXY)
				$this->currency = file_get_contents($url, false, $context);
			else
				$this->currency = file_get_contents($url);
		}

		public function ProcessCurrency() {
			if (version_compare("5.0.0", phpversion()) <= 0	&& class_exists("SimpleXMLElement")) {
				$this->xml = new SimpleXMLElement($this->currency);
  			} else die("Ошибка: для работы функции получения курса валют должна быть установлена версия PHP не ниже 5 и должно быть установлено расширение SimpleXML.");
		}

		public function SaveCurrency() {
			$out = array();
			$cache = fopen("currency.cache", "w");
			$usd = $this->xml->xpath("//Valute[@ID='R01235']/Value");
			$eur = $this->xml->xpath("//Valute[@ID='R01239']/Value");
			$usd = (string) $usd[0]; $eur = (string) $eur[0];
			$usd = str_replace(".",",",round(str_replace(",",".",$usd),2));
			$eur = str_replace(".",",",round(str_replace(",",".",$eur),2));
			fwrite ($cache, $usd . ";" . $eur);
			fclose($cache);
		}
	}
	
	$currency = new CCurrency();
	$currency->GetCurrency("http://www.cbr.ru/scripts/XML_daily.asp", $proxy);
	$currency->ProcessCurrency();
	$currency->SaveCurrency();

?>
 

Slayter

Гуру форума
Регистрация
8 Апр 2006
Сообщения
231
Реакции
55
Блин, я подобные задачи всегда решал регулярками, до работы с DOM ч-з php, так же как и до XML с XPath руки не доходили. и, как оказывается, зря :( Спасибо за подсказанный метод :)

Но замечаний пара есть:
* php парсит документ перед обработкой построчно, и, если версия php < 5 он даже не доберётся до самой проверки (private $currency; вызовет ошибку уровня парс_еррор, в случае четвёрки)
* die не стоит использовать. Если не может отработать один компонент системы -- не стоит прекращать её работу.
* нет примера использования контектста
PHP:
$context = array(
    'http' => array(
        'proxy' => 'tcp://127.0.0.1:8080',
        'request_fulluri' => true,
        ),
    );
$context = stream_context_create($context);
$url = '';
$currency = new CCurrency();
$currency->getCurrency($url, $context);
$currency->processCurrency();
$currency->saveCurrency();
+ советую сделать chaining :) что бы вызывать можно было как $currency->getCurrency($url, $context)->process()->save();
+ советую у методово процесс и сэйв убрать постфикс Currency. ясно же понятно, к какому классу они относятся, просто писать больше
+ сделать обёртку для использования прокси
 

pixelranger

Постоялец
Регистрация
23 Июн 2006
Сообщения
381
Реакции
114
Вот прикладываю парсер курса валют на вчера, сегодня и завтра. у программиста кривые руки, регулярные выражения не использовал. может кому пригодится)
Второй архив с регулярными выражениями, заставлял его переделывать, но все так и не работает как должно.
 

Вложения

  • curs_parser.rar
    1,1 KB · Просмотры: 59
  • parser.rar
    451 байт · Просмотры: 40

Inviseble_Demon

Мой дом здесь!
Регистрация
11 Дек 2008
Сообщения
478
Реакции
377
Вот прикладываю парсер курса валют на вчера, сегодня и завтра. у программиста кривые руки, регулярные выражения не использовал. может кому пригодится)
Второй архив с регулярными выражениями, заставлял его переделывать, но все так и не работает как должно.

К стати это я :D:D
И я помню что в личке давненько отписывал что сделаю нормальный скрипт но увы времени нет...

А вобще не нужно тут так все иронизировать ! Не о каком кешеировании тогда речи не шло ! Да сделал на другой сайт НО ОН ДОСИХПОР РАБОТАЕТ !

Ну а в опровдание могу сказать что был молодой и не опытный;)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху