Автор Тема: как сделать парсер кэшируемым  (Прочитано 1826 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн jfrol82

  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
  • Версия modx: evo
как сделать парсер кэшируемым
« : 10 Декабрь 2014, 01:46:03 »
Приветствую всех форумчан.Прошу не ругать с php я далеко не в ладах.Есть сайт на modx EVO, есть парсер валют вот такой код:


<?php 

function getCourse($currency = array('R01235','R01239'),$shift = 0){
    $value = array();
    $td = mktime(0,0,0,date('m'),intval(date('d'))+$shift,date('Y'));
    $ystd = mktime(0,0,0,date('m'),intval(date('d'))+$shift-1,date('Y'));
    foreach($currency as $cur){
        $url = 'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.date('d/m/Y',$ystd).'&date_req2='.date('d/m/Y',$td).'&VAL_NM_RQ='.$cur;
        $xml = DOMDocument::loadXML(file_get_contents($url));
        if(!$xml) return null;
        $y =
        $t = 0;
        $nominal = 1;
        $xpc = new DOMXPath($xml);
        if($xpc->evaluate('count(//Record)')<2 && abs($shift)<10){
            return getCourse($currency,$shift-1);
        }
        $res = $xpc->query('/ValCurs/Record[@Date="'.date('d.m.Y',$ystd).'"]/Value/text()');
        if($res->length) $y = floatval(str_replace(',','.',$res->item(0)->data));
        $res = $xpc->query('/ValCurs/Record[@Date="'.date('d.m.Y',$td).'"]/Value/text()');
        if($res->length) $t = floatval(str_replace(',','.',$res->item(0)->data));
        $res = $xpc->query('/ValCurs/Record[@Date="'.date('d.m.Y',$td).'"]/Nominal/text()');
        if($res->length) $nominal = floatval(str_replace(',','.',$res->item(0)->data));
        $value[$cur]['date'] = $td;
        $value[$cur]['course'] = $t;
        $value[$cur]['nominal'] = $nominal;
        $value[$cur]['spread'] = $t-$y;
    }
    return $value;
}

$cache_file=$_SERVER['DOCUMENT_ROOT']."/cache/kurs.txt"; //права на папку cache 777

if (file_exists( $cache_file ) &&
    date('Y-m-d',filemtime($cache_file))==
    date("Y-m-d", mktime(0, 0, 0, date("m") , date("d"), date("Y")))){
    $f=fopen($cache_file,"rb"); 
   $kurs=fread($f,filesize($cache_file));
   fclose($f);
}else{
$style ='<style type="text/css">
ul{
margin: 0 auto;
}
</style>';

$val = array(
    'R01235' => 'USD ЦБ',
    'R01239' => 'EUR ЦБ'
);
$cur = getCourse(array_flip($val));


 
foreach($val as $i => $cur_name){
    $color = $cur[$i]['spread']>=0 ? '00CC00' : 'FF0000';        //красный, если понизился, зеленый, если повысился
    $spread = number_format($cur[$i]['spread']*100,0,',','');    //разницу в курсах переводим в копейки
    $course = number_format($cur[$i]['course'],2,',',' ');        //текущий курс
    if($cur[$i]['spread']>=0 )$plus = "+"; else $plus = "";
       
    $tab2 = $tab2.'
<b class="cashcol">'.$cur_name.'</b>  —  <b>'.$course.'</b> руб. <span style="color:#'.$color.'">'.$plus.$spread.' коп. </span></li>&nbsp&nbsp&nbsp
';

}

$tab3 = '</ul>';
$kurs = $style.$tab1.$tab2.$tab3;

   @file_put_contents($cache_file,$kurs);

}
echo $kurs;


 Парсер поставил на сайт, и он постоянно обращается к удаленному серваку ЦБ РФ когда пользователь заходит на сайт, при этом сайт может впасть в ступор секунд на 10 бывает и на все 30.Что мне и куда прописать чтобы курс заносился в кэш и обновлялся пару раз в сутки?? Подскажите пожалуйста

Оффлайн jean179

  • Главный модератор
  • Продвинутый
  • *****
  • Сообщений: 483
  • jean179.ru
    • Просмотр профиля
    • Отдых в Анапе в частном секторе
  • Версия modx: 1.12
Re: как сделать парсер кэшируемым
« Ответ #1 : 10 Декабрь 2014, 08:40:15 »
В парсере есть ошибки. Например:
$y = 
Проверьте линтером, чтобы таких ляпов не было.

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

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

Оффлайн jfrol82

  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
  • Версия modx: evo
Re: как сделать парсер кэшируемым
« Ответ #2 : 10 Декабрь 2014, 17:27:10 »
Спасибо что ответили.Про крон я слыхал, буду пытаться с ним разбираться.