Forwarded from Библиотека собеса по PHP | вопросы с собеседований
Баг, который живёт в проде месяцами и проявляется только под нагрузкой 👇
📦 Задание
Команда пишет модуль биллинга. Ты написал быстрый класс-обёртку для работы с тарифами. Код прошёл ревью, всё работало на стейджинге. В проде через неделю начались жалобы: у части пользователей неправильно считается стоимость. Причём только в пиковые часы.
// src/Billing/TariffCalculator.php
class TariffCalculator
{
private static TariffConfig $config;
private static array $cache = [];
public static function init(array $rawConfig): void
{
self::$config = new TariffConfig($rawConfig);
}
public static function calculate(int $userId, int $units): float
{
$key = $userId . ':' . $units;
if (isset(self::$cache[$key])) {
return self::$cache[$key];
}
$price = self::$config->getBasePrice()
* $units
* self::$config->getUserMultiplier($userId);
self::$cache[$key] = $price;
return $price;
}
public static function resetCache(): void
{
self::$cache = [];
}
}
// src/Billing/TariffConfig.php
class TariffConfig
{
private float $basePrice;
private array $multipliers;
public function __construct(array $config)
{
$this->basePrice = (float) $config['base_price'];
$this->multipliers = $config['multipliers'] ?? [];
}
public function getBasePrice(): float
{
return $this->basePrice;
}
public function getUserMultiplier(int $userId): float
{
return $this->multipliers[$userId] ?? 1.0;
}
}
// bootstrap.php — вызывается один раз при старте воркера
TariffCalculator::init(loadConfigFromDB());
// Где-то в обработчике запроса
$price = TariffCalculator::calculate($user->id, $request->units);
🔹 Задачи
— Найти все архитектурные и логические проблемы в коде (их несколько)
— Объяснить, почему баг проявляется только под нагрузкой и не воспроизводится на стейджинге
— Предложить правильное решение
Ставьте → 🔥 если нравится формат. Если нет → 🌚
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤2👍1🌚1