Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
10.8K subscribers
1.62K photos
27 videos
26 files
4.39K links
Все самое полезное для пхпшника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/bca892d6

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Download Telegram
✔️ PHP-тест: Typed Properties + Lazy Initialization + Объект в статике

Баг, который живёт в проде месяцами и проявляется только под нагрузкой 👇

📦 Задание

Команда пишет модуль биллинга. Ты написал быстрый класс-обёртку для работы с тарифами. Код прошёл ревью, всё работало на стейджинге. В проде через неделю начались жалобы: у части пользователей неправильно считается стоимость. Причём только в пиковые часы.

// 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
🔥102👍1🌚1