Где и как хранить курсы валют? - PullRequest
3 голосов
/ 14 января 2010

Я написал скрипт, который получает текущие ставки PayPals по сравнению с долларом каждый час (валюта, в которой мои продукты по умолчанию).

Пользователь может установить свою валюту в своих настройках, которая хранится в пользовательской таблице.

Моя первоначальная идея состояла в том, чтобы хранить все курсы валют в базе данных, а затем, когда пользователь входит в систему, сохранять код валюты и курс в своем сеансе. Затем вокруг каждой цены у меня есть функция, которая умножает цену на ставку пользователя и добавляет код валюты в конце.

Меня беспокоит только то, что переменная сессии может существовать некоторое время и потенциально может сделать цену совершенно неправильной.

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

Как это обычно достигается?

Ответы [ 4 ]

7 голосов
/ 14 января 2010

Не могли бы вы вместо этого показать цены в валюте, в которой они указаны, и показать приблизительную цену в выбранной пользователем валюте с оговоркой о том, что фактический курс может варьироваться в зависимости от времени их оформления

2 голосов
/ 14 января 2010

Просто кэшируйте звонки, которые получают курсы валют от PayPal. Это все, что нужно сделать. Пока кеш не устарел, ваши пользователи будут умножаться на кэшированные значения. Если кэш устареет, будет получена новая скорость, например, ( искусственный код )

$currency = 'usd';
if (!$cache->has("exRate-$currency")) {
    $exRate = ForEx::find($currency);
    $cache->save("exRate-$currency");
} else {
    $exRate = $cache->get("exRate-$currency");
}
CurrencyConverter::setRate($currency, $exRate);
CurrencyConverter::convert(100, 'eur', 'usd');

Для кешей используйте APC или memcached .

0 голосов
/ 14 января 2010

Позволяет совершить «Опасность».

Можно ли использовать $ _SERVER как глобальный объект всего приложения, похожий на объект Application в ASP? Если нет, есть ли объект приложения PHP?

Если это так, вы можете сохранить курс валюты в $ _SERVER, а затем обновить его при необходимости (например, когда Paypal обновит курс своей валюты)

0 голосов
/ 14 января 2010

Вы можете изменить время жизни сеанса по умолчанию - оно хранится в переменной php.ini session.gc_maxlifetime. По умолчанию установлено значение 1440 (24 часа), после чего сеанс будет очищен следующей сборкой мусора.

Переменная может быть отредактирована напрямую (в файле) или с помощью ini_set:

ini_set('session.gc_maxlifetime', 60); // set to 1 hour

Редактировать

Вы можете увеличить вероятность запуска сборки мусора при любом вызове, используя переменные session.gc_probability и session.gc_divisor. Документация на http://www.php.net/manual/en/session.configuration.php

...