Скрипт курса валют

Discussion in 'PHP' started by mff, 1 Aug 2008.

  1. mff

    mff Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    2,074
    Likes Received:
    701
    Reputations:
    227
    Помогите со скиптом курса валют! Он работает, но бывает подглючивает и тормозит загрузку страницы. Не могу найти багу :confused:
    PHP:
    <?php
    $content 
    get_content(); 
    $pattern "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i"
    preg_match_all($pattern$content$outPREG_SET_ORDER); 
    $dollar ""
    $euro ""
    foreach(
    $out as $cur){ 
        if(
    $cur[2] == 840$dollar str_replace(",",".",$cur[4]); 
        if(
    $cur[2] == 978$euro   str_replace(",",".",$cur[4]); 

    echo
    '<table cellpadding="0" cellspacing="0">
    <tr>
    <td width="50%">Доллар: </td>
    <td><B>'
    .$dollar.'</B> руб.</td>
    </tr>
    <tr>
    <td width="50%">Евро: </td>
    <td><B>'
    .$euro.'</B> руб.</td>
    </tr></table>'
    ;
    function 
    get_content(){ 
        
    $date date("d/m/Y"); 
        
    $link "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date"
        
    $fd = @fopen($link"r"); 
        
    $text=""
        if(!
    $fd) echo "Запрашиваемая страница не найдена"
        else{ 
            while(!
    feof ($fd)) $text .= fgets($fd4096); 
        }  
        
    fclose ($fd); 
        return 
    $text

    ?>
    Спасибо!
     
  2. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    лагать он может изза того што ты берешь данные с другого сайта. то есть сервер сначала ее скачивает а потом отдает тебе.
     
    1 person likes this.
  3. mff

    mff Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    2,074
    Likes Received:
    701
    Reputations:
    227
    Это понятно, но может можно както оптимизнуть? Или есть у кого более стабильный скриптец? Спасибо!
     
  4. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    имхо ... я не пхп программист. но вроде тут и так всьо просто. штобы сервер не так тормозил могу предложить такую схему.
    вынести это в отдельный скрипт. а на страницу подгружать аяксом. тогда он не будет тормозить остальную страницу.
     
    1 person likes this.
  5. mff

    mff Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    2,074
    Likes Received:
    701
    Reputations:
    227
    Вот! Это уже лучше! Спасибо geezer.code, хороший совет!
     
  6. inlanger

    inlanger Elder - Старейшина

    Joined:
    7 Jan 2007
    Messages:
    985
    Likes Received:
    283
    Reputations:
    27
    Зачем аяксом? Просто кеш создай. А потом на кроне раз в час(например), обновляй этот кеш.
     
    1 person likes this.
  7. mff

    mff Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    2,074
    Likes Received:
    701
    Reputations:
    227
    inlanger подскажи как это реализовать? :(
     
  8. inlanger

    inlanger Elder - Старейшина

    Joined:
    7 Jan 2007
    Messages:
    985
    Likes Received:
    283
    Reputations:
    27
    То, что грабишь - не на страницу выдавай, а записывай в файл. И делай это в отдельном скрипте.
    А на странице - читай с файла.

    Таким образом, страница будет открываться моментом, так как она читает не с удалённого сервера, а из файла.

    А скрипт №1... Можешь руками его обновлять, а можешь на крон поставить ;)
     
    1 person likes this.
  9. mff

    mff Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    2,074
    Likes Received:
    701
    Reputations:
    227
    Сенкс inlanger! Идея тоже не плохая! Попробую так и сделать!
     
  10. .::BARS::.

    .::BARS::. Elder - Старейшина

    Joined:
    13 Oct 2007
    Messages:
    379
    Likes Received:
    45
    Reputations:
    10
    PHP:
    <?
    $host "wap.rbc.ru";
    $path "/valuta_new/index.wml";
    $fp fsockopen($host,80,$errno,$errstr,30);
    if(!
    $fp) echo"$errstr ($errno)<br />\n";
    else{
    $headers "GET $path HTTP/1.0\r\n";
    $headers .= "Host: $host\r\n";
    $headers .= "Accept: *\r\n";
    $headers .="Accept-Charset: UTF-8\r\n";  // <<====
    $headers .= "Accept-Charset: *\r\n";
    $headers .= "Accept-Encoding: deflate\r\n";
    $headers .= "Accept-Language: ru\r\n";
    $headers .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.01\r\n\r\n";
    fwrite($fp,$headers);
    while(
    $text != "\r\n"$text fgets($fp,128);
    $text "";
    while(!
    feof($fp)) $text .= fgets($fp,4096);
    fclose($fp);
    }

    $text=strstr($text,'<br/>');
    $end=strstr($text,'<a href="http://wap.rbc.ru/valuta_new/cis.wml');
    $text=str_replace($end''$text);
    $replace1=array (
    '<a href="http://wap.rbc.ru/valuta_new/dEUR.wml">EUR</a>',
    '<a href="http://wap.rbc.ru/valuta_new/dGBP.wml">GBP</a>',
    '<a href="http://wap.rbc.ru/valuta_new/dUSD.wml">USD</a>');
    $replace2=array (
    'EUR',
    'GBP',
    'USD');

    $text=str_replace($replace1$replace2$text);
    $data=date("d.m.Y");

    echo 
    "$data";
    echo 
    "$text";
    ?>
     
    1 person likes this.