$line) { // Пропускаем пустые строки if (trim($line) === '') { continue; } // Пропускаем комментарии if (strpos(trim($line), '#') === 0) { continue; } // Парсим KEY=VALUE if (strpos($line, '=') !== false) { list($key, $value) = explode('=', $line, 2); $key = trim($key); $value = trim($value); // Убираем кавычки если есть $value = trim($value, '"\''); // Сохраняем в $_ENV и наш массив $_ENV[$key] = $value; self::$vars[$key] = $value; $parsedCount++; // Логируем первые несколько переменных для отладки (только один раз) if ($parsedCount <= 3 && function_exists('file_put_contents') && !self::$loaded) { file_put_contents(__DIR__ . '/../../logs/debug.log', '[' . date('Y-m-d H:i:s') . '] EnvLoader: Parsed ' . $key . '=' . $value . PHP_EOL, FILE_APPEND); } } } self::$loaded = true; // Логируем успешную загрузку (только один раз) if (function_exists('file_put_contents') && !self::$loaded) { file_put_contents(__DIR__ . '/../../logs/debug.log', '[' . date('Y-m-d H:i:s') . '] EnvLoader: Loaded ' . count(self::$vars) . ' variables, S3_ACCESS_KEY=' . (self::$vars['S3_ACCESS_KEY'] ?? 'NOT_SET') . PHP_EOL, FILE_APPEND); } } public static function get($key, $default = null) { self::load(); return self::$vars[$key] ?? $_ENV[$key] ?? $default; } public static function getRequired($key) { $value = self::get($key); if ($value === null || $value === '') { throw new Exception("Required environment variable '{$key}' is not set"); } return $value; } public static function getBool($key, $default = false) { $value = self::get($key); if ($value === null) { return $default; } return in_array(strtolower($value), ['true', '1', 'yes', 'on']); } public static function getInt($key, $default = 0) { $value = self::get($key); return $value !== null ? intval($value) : $default; } public static function isLoaded() { return self::$loaded; } public static function getEnvPath() { return self::$envPath; } } }