} */ public static function php(): array { return [ 'sapi' => PHP_SAPI, 'memory_limit' => self::bytes(ini_get('memory_limit')), 'max_execution_time' => max(0, (int) ini_get('max_execution_time')), 'upload_max_filesize' => self::bytes(ini_get('upload_max_filesize')), 'opcache' => self::opcache(), 'extensions' => self::extensions(get_loaded_extensions()), ]; } /** * Größenangabe aus php.ini in Bytes („256M“, „1G“, „-1“ für unbegrenzt) */ public static function bytes(string|false $value): ?int { if (! is_string($value) || trim($value) === '') { return null; } $value = trim($value); if ($value === '-1') { return -1; } if (preg_match('/^(\d+)\s*([kmg]?)b?$/i', $value, $m) !== 1) { return null; } $factor = ['' => 1, 'k' => 1024, 'm' => 1024 ** 2, 'g' => 1024 ** 3][strtolower($m[2])]; return (int) min((int) $m[1] * $factor, 1099511627776); } /** * @param list $loaded * @return list */ public static function extensions(array $loaded): array { $out = []; foreach ($loaded as $name) { $name = strtolower(trim($name)); if ($name !== '' && preg_match('/^[a-z0-9_ -]{1,64}$/', $name) === 1) { $out[] = $name; } } $out = array_values(array_unique($out)); sort($out); return array_slice($out, 0, self::MAX_EXTENSIONS); } /** * Datenbank aus der Kennung des Servers („10.11.6-MariaDB-0+deb12u1“, „8.0.39-0ubuntu0.22.04.1“, * „5.5.5-10.6.18-MariaDB“ – MariaDB meldet sich über ältere Protokolle mit vorangestelltem 5.5.5) * * @return array{type: string, version: ?string}|array{} */ public static function database(?string $serverInfo): array { if ($serverInfo === null || trim($serverInfo) === '') { return []; } $info = trim($serverInfo); $mariadb = stripos($info, 'mariadb') !== false; if ($mariadb && str_starts_with($info, '5.5.5-')) { $info = substr($info, 6); } return ['type' => $mariadb ? 'mariadb' : 'mysql', 'version' => preg_match('/^(\d+\.\d+(?:\.\d+)?)/', $info, $m) === 1 ? $m[1] : null]; } /** * Webserver aus SERVER_SOFTWARE („nginx/1.26.2“, „Apache/2.4.62 (Debian)“, „LiteSpeed“); nur Produkt und Version * * @return array{software: string, version: ?string}|array{} */ public static function server(mixed $software): array { if (! is_string($software) || preg_match('/^\s*([A-Za-z][A-Za-z0-9_.-]{0,31})(?:\/(\d+(?:\.\d+){0,3}))?/', $software, $m) !== 1) { return []; } return ['software' => strtolower($m[1]), 'version' => $m[2] ?? null]; } private static function opcache(): bool { if (! function_exists('opcache_get_status')) { return false; } $status = @opcache_get_status(false); return is_array($status) && ($status['opcache_enabled'] ?? false) === true; } }