|
|
|
| я щас головой бабахнусь :(
написал вот такое, сижу уже в печали :(
Функция должна делать следующее:
если сессии нет, берём данные из файла.
если условие ($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, $out, 2);
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($file, LOCK_EX)) {
$mixed = is_array($mixed) ? implode("\n", $mixed) : $mixed;
fwrite($file, $mixed);
flock($file, LOCK_UN);
return true;
}
fclose($file);
return false;
}
|
| |
|
|
|
|
|
|
|
для: sl1p
(14.07.2009 в 04:18)
| | Что сделает скрипт, когда к нему обратится десяток разных клиентов в одну минуту? | |
|
|
|
|
|
|
|
для: Trianon
(14.07.2009 в 08:45)
| | об этом я тоже задумался..
и мысли огорчили :\
а как быть то?( | |
|
|
|
|
|
|
|
для: sl1p
(14.07.2009 в 12:52)
| | насколько я помню, правила большинства банков крайне не рекомендуют дергать сервер чаще раза в сутки, так как торги всяко проходят не чаще, и как правило в одно и то же (или близкое) время суток .
таким образом вечером банковского дня есть смысл дернуть сервер раз в полчаса.
Делать тоже самое ночью, днем или утром смысла нет никакого. | |
|
|
|
|
|
|
|
для: Trianon
(14.07.2009 в 12:56)
| | Ну так здесь раз в сутки и происходит обновление с сервера.
Пол часа это если сервер не рабочий..
Или я не правильно Вас понял?) | |
|
|
|
|
|
|
|
для: sl1p
(14.07.2009 в 13:07)
| | или курс старый. | |
|
|
|
|
|
|
|
для: 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, $out, 2);
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;
}
|
| |
|
|
|
|
|
|
|
для: sl1p
(14.07.2009 в 14:38)
| | Не проще ли записывать курсы в базу, и если текущая дата больше даты имеющихся курсов то получать курс. В любом случае первый же пользователь обновит курс, если требуется, и если сервер доступен. А по каким причинам у вас intval не будет выполнен? | |
|
|
|
|
|
|
|
для: sim5
(14.07.2009 в 15:03)
| | если не существует файла.
то есть косяк будет если файла нет и недоступен сервер, но тут уже не решабельно по-моему.
значения то брать неоткуда, разве что дефолтные использовать.. | |
|
|
|
|
|
|
|
для: sl1p
(14.07.2009 в 15:06)
| | А проверяем по $curData. У вас пока не было запроса курса, вообще не существует файла, так неужели нельзя это проверить, а кучу собак вешать? | |
|
|
|
|
|
|
|
для: sim5
(14.07.2009 в 15:16)
| | ну я у себя подправил на просто
if($ts >= @intval($curData[0]))
|
тут уже по-моему как кому нравится) | |
|
|
|
|
|
|
|
для: sim5
(14.07.2009 в 15:03)
| | А по каким причинам у вас intval не будет выполнен?
Да ни по каким.
В $curData в любом случае будет лежать null. | |
|
|
|
|
|
|
|
для: sl1p
(14.07.2009 в 12:52)
| | В момент первого обращения записать данные в локальный файл и в дальнейшем обращаться только к нему. Соответственно обновлять данные в файле раз в сутки (или когда там обновляются данные на удалённом файле). | |
|
|
|