PHP-приложение для получения курсов валют с сайта Центрального Банка России (cbr.ru).
- PHP 8.4 + Symfony 7.4
- PostgreSQL 15 - основная база данных
- RabbitMQ - брокер сообщений для асинхронной обработки
- Redis - кеширование данных
- Docker + Docker Compose - контейнеризация
- Получение курса валюты на указанную дату
- Расчёт разницы курса с предыдущим торговым днём
- Поддержка кросс-курсов (например, USD/EUR)
- Кеширование данных в Redis
- Асинхронный сбор данных через RabbitMQ воркеры
- Консольная команда для загрузки исторических данных за 180 дней
# Инициализировать проект (запуск, установка зависимостей, миграции)
make init# Отправить задачи в очередь
make fetch-rates
# Воркер уже запущен автоматически (сервис worker в docker compose)
# Можно проверить логи воркера:
docker compose logs -f workerAPI доступно по адресу: http://localhost:8080
# Курс USD к рублю на конкретную дату
curl "http://localhost:8080/api/rate?date=2026-01-15¤cy=USD"
# Курс EUR к рублю
curl "http://localhost:8080/api/rate?date=2026-01-15¤cy=EUR"
# Кросс-курс USD к EUR
curl "http://localhost:8080/api/rate?date=2026-01-15¤cy=USD&base=EUR"{
"date": "2026-01-15",
"currency": "USD",
"base": "RUR",
"rate": 88.123456,
"diff": 0.234567,
"previous_date": "2026-01-14"
}curl "http://localhost:8080/api/health"Получить курс валюты.
Параметры запроса:
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| date | string | Да | Дата в формате Y-m-d |
| currency | string | Да | Код валюты (USD, EUR, GBP и т.д.) |
| base | string | Нет | Базовая валюта (по умолчанию RUR) |
Ответ:
| Поле | Тип | Описание |
|---|---|---|
| date | string | Дата курса |
| currency | string | Код валюты |
| base | string | Базовая валюта |
| rate | float | Курс валюты |
| diff | float|null | Разница с предыдущим торговым днём |
| previous_date | string|null | Дата предыдущего торгового дня |
Health check endpoint.
src/
├── Command/
│ └── FetchRatesCommand.php # Консольная команда загрузки
├── Controller/
│ └── CurrencyRateController.php # REST API endpoints
├── Dto/
│ ├── CurrencyRateDto.php # DTO для ответа API
│ └── RateDto.php # DTO для данных курса
├── Entity/
│ └── CurrencyRate.php # Doctrine Entity (БД)
├── Message/
│ ├── FetchRatesMessage.php # Сообщение для AMQP очереди
│ └── FetchRatesMessageHandler.php # Обработчик сообщений воркером
├── Repository/
│ └── CurrencyRateRepository.php # Запросы к БД
└── Service/
├── Exception/ # Исключения сервисов
│ ├── CbrApiClientException.php
│ └── CurrencyRateServiceException.php
├── CbrApiClient.php # HTTP клиент для CBR API
└── CurrencyRateService.php # Бизнес-логика и кеширование
Для управления проектом используй команды make:
# Инициализация проекта (один раз при клонировании)
make init
# Запуск/остановка контейнеров
make up
make down
make restart
# Логи
make logs
# Доступ в контейнер PHP
make shell
# Установка зависимостей и миграции
make composer
make migrate
# Загрузка курсов за N дней (по умолчанию 180)
make fetch-rates DAYS=10
# Очистка кеша Redis (все данные)
make cache-clear
# Запуск тестов
make test
# Показать все доступные команды
make help| Сервис | Порт | Описание |
|---|---|---|
| nginx | 8080 | Web сервер |
| php | 9000 | PHP-FPM |
| worker | - | Symfony Messenger worker |
| postgres | 5432 | PostgreSQL база данных |
| rabbitmq | 5672, 15672 | RabbitMQ (15672 - management UI) |
| redis | 6379 | Redis кеш |
Доступен по адресу: http://localhost:15672
- Username:
guest - Password:
guest
Используй .env.local для локальных секретов (например, APP_SECRET).
| Переменная | По умолчанию | Описание |
|---|---|---|
| APP_ENV | dev | Окружение (dev/prod) |
| APP_SECRET | - | Секретный ключ приложения |
| DATABASE_URL | - | URL подключения к PostgreSQL |
| MESSENGER_TRANSPORT_DSN | - | URL подключения к RabbitMQ |
| REDIS_URL | - | URL подключения к Redis |