Кэширование в парсере валют

A
На сайте с 26.02.2013
Offline
3
1369

Здравствуйте.

Есть рабочий код парсера нескольких валют с национального банка РБ.


<?PHP
$url = 'http://www.nbrb.by/statistics/Rates/RatesDaily.asp';
$val = file_get_contents($url);

// Евро
$spatern='/1 евро<td>([^(,*)<\/td>$]+)/';
if(preg_match($spatern, $val, $matches))
{
$eur = $matches[1];
}
// Доллар
$dpatern='/1 доллар США<td>([^(,*)<\/td>$]+)/';
if(preg_match($dpatern, $val, $matches)){
$doll = $matches[1];
}
// 1 российский рубль
$rpatern='/1 российский рубль<td>([^(,*)<\/td>$]+)/';
if(preg_match($rpatern, $val, $matches))
{
$rubl = $matches[1];
}
echo $eur, $doll, $rubl ;
?>

Все бы хорошо, но этот парсер существенно замедляет загрузку страницы сайта, на которой расположен.

Обновляются курсы валют не более 2-х раз за день.

Посоветуйте пож. как грамотно кэшировать результаты работы парсера, например в файл.

IL
На сайте с 20.04.2007
Offline
435
#1
anndmill:
Посоветуйте пож. как грамотно кэшировать результаты работы парсера, например в файл.

Советую:

1. Если файл существует && дата последнего изменения (filemtime) файла меньше (суток|x часов | y минут) пропускаем

2. скачать файл, сохранить в заранее условленное место

3. читать из локального файла

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
A
На сайте с 26.02.2013
Offline
3
#2
ivan-lev:
Советую:
1. Если файл существует && дата последнего изменения (filemtime) файла меньше (суток|x часов | y минут) пропускаем
2. скачать файл, сохранить в заранее условленное место
3. читать из локального файла

Спасибо. Но не совсем понятно. Скачать файл откуда? Я правильно понимаю, что должно быть:

1) открытие файла

2) запись(перезапись) этих 3-х курсов в файл (допустим 2 раза в сутки)

3) закрытие файла

4) чтение из файла

F
На сайте с 06.06.2008
Offline
51
#3

ТС, а что вам мешает хранить курсы в XML? Тем более, что у Вашего источника есть вариант в XML - http://www.nbrb.by/Services/XmlExRates.aspx.

Сохраняйте XML файл у себя и при необходимости выдачи курса валют на страницах сайта просто парсите свой же XML из кеша.

дани мапов
На сайте с 06.09.2012
Offline
204
#4

Какой движок? Можно использовать встроенные функции кеширования движка.

Написание и доработка скриптов (PHP, MySQL, JavaScript, jQuery) (/ru/forum/811046)
A
На сайте с 26.02.2013
Offline
3
#5
дани мапов:
Какой движок? Можно использовать встроенные функции кеширования движка.

Joomla 2.5

web2us
На сайте с 18.04.2012
Offline
19
#6
anndmill:
Здравствуйте.
Есть рабочий код парсера нескольких валют с национального банка РБ.


Все бы хорошо, но этот парсер существенно замедляет загрузку страницы сайта, на которой расположен.
Обновляются курсы валют не более 2-х раз за день.
Посоветуйте пож. как грамотно кэшировать результаты работы парсера, например в файл.

ну вот как то так

<?PHP
function valuta(){
$url = 'http://www.nbrb.by/statistics/Rates/RatesDaily.asp';
$val = file_get_contents($url);

// Евро
$spatern='/1 евро<td>([^(,*)<\/td>$]+)/';
if(preg_match($spatern, $val, $matches))
{
$eur = $matches[1];
}
// Доллар
$dpatern='/1 доллар США<td>([^(,*)<\/td>$]+)/';
if(preg_match($dpatern, $val, $matches)){
$doll = $matches[1];
}
// 1 российский рубль
$rpatern='/1 российский рубль<td>([^(,*)<\/td>$]+)/';
if(preg_match($rpatern, $val, $matches))
{
$rubl = $matches[1];
}
echo $eur, $doll, $rubl ;
}

function writeCache($filename, $content) {

$fp = fopen('./cache/' . $filename, 'w');

fwrite($fp, $content);

fclose($fp);

}

function readCache($filename, $expiry) {

if (file_exists('./cache/' . $filename)) {

if ((time() - $expiry) > filemtime('./cache/' . $filename))

return FALSE;

$cache = file('./cache/' . $filename);

return $cache;

}

return FALSE;

}
$fValuta = 'valuta.cache';
if(!$out = readCache($fValuta, 604800 )){
ob_start();
valuta();
$out = ob_get_contents();
ob_clean();
writeCache($fValuta,$out);
}
echo $out;
?>

А характер-то у меня - замечательный! Это просто у всех нервы какие-то слабые…
A
На сайте с 26.02.2013
Offline
3
#7
web2us:
ну вот как то так
<?PHP

function valuta(){
$url = 'http://www.nbrb.by/statistics/Rates/RatesDaily.asp';
$val = file_get_contents($url);

// Евро
$spatern='/1 евро<td>([^(,*)<\/td>$]+)/';
if(preg_match($spatern, $val, $matches))
{
$eur = $matches[1];
}
// Доллар
$dpatern='/1 доллар США<td>([^(,*)<\/td>$]+)/';
if(preg_match($dpatern, $val, $matches)){
$doll = $matches[1];
}
// 1 российский рубль
$rpatern='/1 российский рубль<td>([^(,*)<\/td>$]+)/';
if(preg_match($rpatern, $val, $matches))
{
$rubl = $matches[1];
}
echo $eur, $doll, $rubl ;
}

function writeCache($filename, $content) {

$fp = fopen('./cache/' . $filename, 'w');

fwrite($fp, $content);

fclose($fp);

}

function readCache($filename, $expiry) {

if (file_exists('./cache/' . $filename)) {

if ((time() - $expiry) > filemtime('./cache/' . $filename))

return FALSE;

$cache = file('./cache/' . $filename);

return $cache;

}

return FALSE;

}
$fValuta = 'valuta.cache';
if(!$out = readCache($fValuta, 604800 )){
ob_start();
valuta();
$out = ob_get_contents();
ob_clean();
writeCache($fValuta,$out);
}
echo $out;
?>

Спасибо! Буду пробовать!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий