Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите с функцией "курс-валют"
 
 автор: sl1p   (14.07.2009 в 04:18)   письмо автору
 
 

я щас головой бабахнусь :(
написал вот такое, сижу уже в печали :(

Функция должна делать следующее:
если сессии нет, берём данные из файла.
если условие ($ts >= intval(@$curData[0])) положительное тогда начинаем дёргать сайт с валютой для обновления. Если сайт не рабочий, записываем время обновления + 30 минут( пока не поднимут сервер ) и берём старые данные.

Постоянно происходят непонятные сбои в работе,
не могу просто отследить что и как ломается..
Если кто-то видит очевидную ошибку, тыкните пожалуйста.

Есть ли смысл тут вообще использовать сессии?
Так как сессии это и есть файлы, надеюсь на то что она работает быстрее чем тупо постоянно брать данные из файла. Или ошибаюсь?


<?
function getCurrency() {
    
// cfg
    
$xml       'http://bank-ua.com/export/currrate.xml';
    
$file      'inc/currency.txt';
    
$need_vals = array(840 => 'usd'978 => 'eur'); //fgc_code => name
    //
    
$is_session = isset($_SESSION['web_currency']);
    
$curData    $is_session $_SESSION['web_currency'] : mtrim(file($file));
    
$ts         time();
    
$wasUpdate  false;
    
    if(
$ts >= intval(@$curData[0])) {
        
        
$curData   = array();
        
$wasUpdate true;
        
        if((
$fgc = @file_get_contents($xml))) {
            
//echo 'fgc';
            
preg_match_all('#<code>([^<]+).+?<size>([^<]+).+?<rate>([^<]+)#sx'$fgc$out2);
            foreach(
$out as $a => $b)
                if(
array_key_exists($out[$a][1], $need_vals))
                    
$val[$need_vals[$out[$a][1]]] = $curData[$need_vals[$out[$a][1]]] = $out[$a][3] / $out[$a][2];
            
$cur_write  $curData[0] = strtotime('tomorrow'); // MUST UPDATE
            
$curData[1] = $ts;
            
$cur_write .= "\n" $ts// LAST UPDATE
            //print_r($curData);
            
foreach($val as $a => $b)
                
$cur_write .= "\n" $a "\n" $b;
            
fwrite_save($file$cur_write);
        } else {
            
//echo 'else';
            
$curData $is_session $_SESSION['web_currency'] : mtrim(file($file));
            
//echo 'else'.print_r($curData).'/else';
            
$curData[0] = strtotime('+30 minutes');
            if(
$is_session$_SESSION['web_currency'][0] = $curData[0];
            else 
fwrite_save($file$curData);
            
//echo 'ssssssss'.print_r($curData);
        
}
    }
    
//var_dump($fgc);
    
if(!$is_session && ($wasUpdate && !@$fgc)) {
        
//echo "<br>this<br>";
        
$temp    $curData;
        
//echo 'temp'.print_r($curData).'/temp';
        
$curData = array();
        for(
$i 2$j count($temp); $i $j$i+=2)
            
$curData[$temp[$i]] = $temp[$i 1];
        
$curData[0] = $temp[0];
        
$curData[1] = $temp[1];
    }
    
$curData[0] = intval($curData[0]);
    
$curData[1] = intval($curData[1]);
    
    
$_SESSION['web_currency'] = $curData;
    
//print_r($curData);
    
return $curData;
}



function 
fwrite_save($file$mixed) {
    if(
is_string($file)) $file = @fopen($file'w');
    if(!
$file) return false;
    
    if(
flock($fileLOCK_EX)) {
        
$mixed is_array($mixed) ? implode("\n"$mixed) : $mixed;
        
fwrite($file$mixed);
        
flock($fileLOCK_UN);
        return 
true;
    }
    
fclose($file);
    
    return 
false;
}

  Ответить  
 
 автор: Trianon   (14.07.2009 в 08:45)   письмо автору
 
   для: sl1p   (14.07.2009 в 04:18)
 

Что сделает скрипт, когда к нему обратится десяток разных клиентов в одну минуту?

  Ответить  
 
 автор: sl1p   (14.07.2009 в 12:52)   письмо автору
 
   для: Trianon   (14.07.2009 в 08:45)
 

об этом я тоже задумался..
и мысли огорчили :\

а как быть то?(

  Ответить  
 
 автор: Trianon   (14.07.2009 в 12:56)   письмо автору
 
   для: sl1p   (14.07.2009 в 12:52)
 

насколько я помню, правила большинства банков крайне не рекомендуют дергать сервер чаще раза в сутки, так как торги всяко проходят не чаще, и как правило в одно и то же (или близкое) время суток .

таким образом вечером банковского дня есть смысл дернуть сервер раз в полчаса.
Делать тоже самое ночью, днем или утром смысла нет никакого.

  Ответить  
 
 автор: sl1p   (14.07.2009 в 13:07)   письмо автору
 
   для: Trianon   (14.07.2009 в 12:56)
 

Ну так здесь раз в сутки и происходит обновление с сервера.

Пол часа это если сервер не рабочий..
Или я не правильно Вас понял?)

  Ответить  
 
 автор: Trianon   (14.07.2009 в 13:09)   письмо автору
 
   для: sl1p   (14.07.2009 в 13:07)
 

или курс старый.

  Ответить  
 
 автор: sl1p   (14.07.2009 в 14:38)   письмо автору
 
   для: Trianon   (14.07.2009 в 13:09)
 

в общем переписал так:
потестил вроде бы всё нормально.

проблем не должно быть с одновременным обращением?

<?
function getCurrency() {
    
// cfg
    
$xml        'http://bank-ua.com/export/currrate.xml';
    
$file       'inc/currency.txt';
    
$need_vals  = array(840 => 'usd'978 => 'eur'); //fgc_code => name
    //
    
$ts         time();
    
    
$curData    = @mtrim(@file($file));
    
    if(!
$curData || $ts >= @intval($curData[0])) {
        if((
$fgc = @file_get_contents($xml))) {
            
$curData   = array();
            
            
$curData[0] = strtotime('tomorrow'); // MUST UPDATE
            
$curData[1] = $ts// LAST UPDATE
            
            
preg_match_all('#<code>([^<]+).+?<size>([^<]+).+?<rate>([^<]+)#sx'$fgc$out2);
            foreach(
$out as $a => $b)
                if(
array_key_exists($out[$a][1], $need_vals)) {
                    
$curData[] = $need_vals[$out[$a][1]];
                    
$curData[] = $out[$a][3] / $out[$a][2];
                }
        } else {
            
$curData[0] = strtotime('+30 minutes');
            
fwrite_save($file$curData);
        }
        
fwrite_save($file$curData);
    }
    
    
$temp    $curData;
    
$curData = array();
    
$curData[0] = intval($temp[0]);
    
$curData[1] = intval($temp[1]);
    for(
$i 2$j count($temp); $i $j$i+=2)
        
$curData[$temp[$i]] = $temp[$i 1];
    
    return 
$curData;
}

  Ответить  
 
 автор: sim5   (14.07.2009 в 15:03)   письмо автору
 
   для: sl1p   (14.07.2009 в 14:38)
 

Не проще ли записывать курсы в базу, и если текущая дата больше даты имеющихся курсов то получать курс. В любом случае первый же пользователь обновит курс, если требуется, и если сервер доступен. А по каким причинам у вас intval не будет выполнен?

  Ответить  
 
 автор: sl1p   (14.07.2009 в 15:06)   письмо автору
 
   для: sim5   (14.07.2009 в 15:03)
 

если не существует файла.

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

  Ответить  
 
 автор: sim5   (14.07.2009 в 15:16)   письмо автору
 
   для: sl1p   (14.07.2009 в 15:06)
 

А проверяем по $curData. У вас пока не было запроса курса, вообще не существует файла, так неужели нельзя это проверить, а кучу собак вешать?

  Ответить  
 
 автор: sl1p   (14.07.2009 в 15:20)   письмо автору
 
   для: sim5   (14.07.2009 в 15:16)
 

ну я у себя подправил на просто
if($ts >= @intval($curData[0]))


тут уже по-моему как кому нравится)

  Ответить  
 
 автор: Trianon   (14.07.2009 в 15:30)   письмо автору
 
   для: sim5   (14.07.2009 в 15:03)
 

А по каким причинам у вас intval не будет выполнен?

Да ни по каким.
В $curData в любом случае будет лежать null.

  Ответить  
 
 автор: Саня   (14.07.2009 в 12:57)   письмо автору
 
   для: sl1p   (14.07.2009 в 12:52)
 

В момент первого обращения записать данные в локальный файл и в дальнейшем обращаться только к нему. Соответственно обновлять данные в файле раз в сутки (или когда там обновляются данные на удалённом файле).

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования