У вас есть несколько проблем:
- Вы не вызываете реальный API, вы очищаете веб-страницу, что означает, что:
- вы, скорее всего, нарушаетеВ Google TOS
- у вас больше шансов получить ограничение по ставке (или быть замеченным как злоупотребление и попасть в черный список) в какой-то момент, если вы слишком часто выбираете эту страницу
- вы зависимыпри любых изменениях, внесенных в структуру HTML веб-страницы
- Вы очищаете страницу каждый раз, когда вам нужно конвертировать сумму в другую валюту, что означает, что любой сбой приводит ксбой конвертации валюты.
Что нужно сделать:
- загрузить курсы обмена из легального канала или API
- загружать их на регулярной основе (например, с помощью задания cron) и сохранять их в локальной базе данных , которая будет использоваться для конвертации валют
ЭтоКстати, даже если вызов API завершится неудачно, у вас все равно есть доступ к немногообменный курс, который в большинстве случаев лучше, чем сбой.
Где найти надежный фид обменного курса?
Существует множество API, бесплатных или нет, чтоПредложите эту услугу.
Хороший источник, о котором я знаю, - это Европейский центральный банк, который предоставляет XML-фид , который был там в течение многих лет, и предоставляет обменные курсы для 32 валют относительно EUR
.
OpenExchangeRates также предлагает бесплатный тариф с лимитом 1000 запросов в месяц, которого достаточно для обновления тарифов каждый час.Он предоставляет обменные курсы для 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
);
Как правильно обрабатывать конвертации валют на основе курсов по отношению к одной валюте?
На этот вопрос я недавно ответил .Вышеуказанные каналы дают вам курсы для конвертации базовой валюты (EUR
или USD
) в другую валюту, но не дают подсказки о том, как конвертировать между двумя произвольными валютами.Я хотел бы предложить вам использовать подходящую библиотеку, которая обрабатывает эти преобразования для вас, например 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