在哪里以及如何存储货币汇率?
Posted
技术标签:
【中文标题】在哪里以及如何存储货币汇率?【英文标题】:Where and how to store currency rates? 【发布时间】:2011-01-05 02:24:41 【问题描述】:我编写了一个脚本,用于获取 paypals 当前费率与每小时美元的比较(我的产品默认使用的货币)。
用户可以在他们的设置中设置他们的货币,并将其存储在用户表中。
我最初的想法是将所有货币汇率存储在数据库中,然后当用户登录时,将货币代码和汇率存储在他们的会话中。然后围绕每个价格,我有一个函数将价格乘以用户价格并在末尾附加货币代码。
我唯一担心的是会话变量可能存在一段时间,并且可能使价格完全错误。
我是否应该将汇率存储在会话中,而不是将其货币代码存储在内存表或文件系统中以便快速访问并让价格转换功能访问它?因此,价格与费率一样是最新的。
这通常是如何实现的?
【问题讨论】:
【参考方案1】:您能否改为以他们定价的货币显示价格,并以用户选择的货币显示近似价格,但需要注意的是实际汇率可能会随着他们结帐?
【讨论】:
是的,我考虑过。那我也可以保持简单......如果每天更新一次费率并不重要 我确实在浏览过的一些网店看到了这种做法,所以有先例。 这就是 ebay 的做法。 即使您有最新的汇率,用户也会从他们的银行收取费用,这很可能与您的汇率不同。这只是一个指南,所以我不会出汗。【参考方案2】:只需缓存从 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。
【讨论】:
感谢您的意见。我认为这是一个很好的解决方案。目前我还没有实现缓存......当我这样做时,我会回顾一下这个解决方案。【参考方案3】:您可以更改会话的默认生命周期 - 它存储在 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
【讨论】:
【参考方案4】:让我们做危险的事情。
是否可以将 $_SERVER 用作应用程序范围的全局对象,类似于 ASP 的 Application 对象?如果没有,是否有 PHP 应用程序对象?
如果是这样,您可以将汇率存储在 $_SERVER 中,然后在必要时更新(例如,当 Paypal 更新其汇率时)
【讨论】:
以上是关于在哪里以及如何存储货币汇率?的主要内容,如果未能解决你的问题,请参考以下文章