gpt4 book ai didi

php - 有没有更好的方法在 PHP 中获取货币汇率?

转载 作者:行者123 更新时间:2023-12-03 18:37:40 24 4
gpt4 key购买 nike

带有以下代码的货币汇率有时有效,有时无效,而且根本不可靠。有没有更好的方法在 PHP 中获取货币汇率?

public function getJPYtoUSDExchangeRate(){
$from = 'JPY';
$to = 'USD';
$amount = 1;
$data = file_get_contents("https://finance.google.com/finance/converter?a=$amount&from=$from&to=$to");
preg_match("/<span class=bld>(.*)<\/span>/",$data, $converted);
$converted = preg_replace("/[^0-9.]/", "", $converted[1][0]);
return number_format(round($converted, 3),2);
}

最佳答案

你有几个问题:

  • 您不是在调用实际的 API,而是在抓取网页,这意味着:
  • 您很可能违反了 Google 的 TOS
  • 如果您过于频繁地获取此页面,您在某些时候更有可能受到速率限制(或被检测为滥用并被列入黑名单)
  • 您依赖于网页的 HTML 结构中所做的任何更改
  • 每次需要将金额转换为另一种货币时,您都在抓取页面,这意味着任何失败都会使您的货币转换失败。

  • 你应该做什么:
  • 从合法提要或 API 加载汇率
  • 定期加载它们 (例如通过 cron 作业) 并将它们保存到本地数据库 ,该数据库将用于执行货币转换

  • 这样,即使 API 调用失败,您仍然可以访问稍微过时的汇率,这在大多数情况下比失败要好。

    您在哪里可以找到值得信赖的汇率信息?

    有很多 API,无论是否免费,都提供此服务。

    我知道的一个很好的来源是欧洲中央银行,它提供了一个已经存在多年的 XML feed 并提供了 32 种货币相对于 EUR 的汇率。

    OpenExchangeRates 还提供了一个免费计划,每月限制为 1,000 次请求,足以每小时刷新一次。它提供了 170 种货币的汇率,相对于 USD

    您如何将值存储在数据库中?

    无论您选择哪个提要,您都需要解析它(如果是 XML)或 json_decode() 它(如果是 JSON)并将值存储在您的数据库中。理想情况下,设置一个 cron 作业来每天甚至每小时运行您的导入脚本。

    实际的解析和导入步骤超出了这个问题的范围,但让我们假设一个包含记录的简单 MySQL 表:

    CREATE TABLE exchange_rate(
    target_currency CHAR(3) COLLATE ascii_bin NOT NULL PRIMARY KEY,
    exchange_rate DOUBLE NOT NULL
    );

    如何根据相对于单一货币的汇率正确处理货币转换?

    这是一个我有 answered recently 的问题。上面的提要为您提供了将基础货币( EURUSD )转换为另一种货币的汇率,但没有为您提供有关如何在两种任意货币之间转换的线索。我建议您使用合适的库来为您处理这些转换,例如 brick/money - 免责声明:我是作者。

    以下是您如何配置它以从上表加载您的汇率:

    use Brick\Money\CurrencyConverter;
    use Brick\Money\ExchangeRateProvider\PDOProvider;
    use Brick\Money\ExchangeRateProvider\PDOProviderConfiguration;
    use Brick\Money\ExchangeRateProvider\BaseCurrencyProvider;

    // set to whatever your rates are relative to
    $baseCurrency = 'USD';

    // use your own credentials, or re-use your existing PDO connection
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');

    $configuration = new PDOProviderConfiguration();

    $configuration->tableName = 'exchange_rate';
    $configuration->exchangeRateColumnName = 'exchange_rate';
    $configuration->targetCurrencyColumnName = 'target_currency';
    $configuration->sourceCurrencyCode = $baseCurrency;

    // this provider loads exchange rates from your database
    $provider = new PDOProvider($pdo, $configuration);

    // this provider calculates exchange rates relative to the base currency
    $provider = new BaseCurrencyProvider($provider, $baseCurrency);

    // this currency converter can now handle any currency pair
    $converter = new CurrencyConverter($provider);

    以及您将如何使用它:

    use Brick\Math\RoundingMode;
    use Brick\Money\Money;

    $money = Money::of(10, 'EUR'); // EUR 10.00
    $converter->convert($money, 'CAD', RoundingMode::DOWN); // CAD 15.27

    关于php - 有没有更好的方法在 PHP 中获取货币汇率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50691463/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com