Quelltext des aktuellen Standes
<?php
declare(strict_types=1);
/**
* Datenbankkonfiguration
*
* MySQL/MariaDB-Verbindungseinstellungen.
* Alle Werte werden aus Umgebungsvariablen geladen.
*/
return [
'driver' => 'mysql',
'host' => $_ENV['DB_HOST'] ?? 'localhost',
'port' => (int) ($_ENV['DB_PORT'] ?? 3306),
'database' => $_ENV['DB_DATABASE'] ?? 'it_docs',
'username' => $_ENV['DB_USERNAME'] ?? '',
'password' => $_ENV['DB_PASSWORD'] ?? '',
'charset' => $_ENV['DB_CHARSET'] ?? 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
// PDO-Optionen für sichere Verbindung
'options' => (function () {
$options = [
// SICHERHEITSKRITISCH: Prepared Statements erzwingen
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_STRINGIFY_FETCHES => false,
];
// Buffered Queries explizit aktivieren (PHP 8.4+ Pdo\Mysql ändert den Default)
if (class_exists('Pdo\Mysql') && defined('Pdo\Mysql::ATTR_USE_BUFFERED_QUERY')) {
$options[\Pdo\Mysql::ATTR_USE_BUFFERED_QUERY] = true;
} else {
$options[PDO::MYSQL_ATTR_USE_BUFFERED_QUERY] = true;
}
// Mehrfache Statements verhindern (SQL-Injection-Schutz)
// PHP 8.5+ verwendet Pdo\Mysql::ATTR_MULTI_STATEMENTS
if (class_exists('Pdo\Mysql') && defined('Pdo\Mysql::ATTR_MULTI_STATEMENTS')) {
$options[\Pdo\Mysql::ATTR_MULTI_STATEMENTS] = false;
} else {
@$options[PDO::MYSQL_ATTR_MULTI_STATEMENTS] = false;
}
return $options;
})(),
// Zusätzliche MySQL-Einstellungen
'strict_mode' => true,
'timezone' => '+00:00', // UTC
// Anzahl Verbindungsversuche bei sporadischen Verbindungsfehlern
// (z.B. "[2002] No such file or directory" während eines kurzen
// DB-Neustarts/Backups). Mit exponentiellem Backoff zwischen den Versuchen.
// - Web: fail-fast (Standard 3 Versuche, ~0,75s) — keine hängenden Seiten.
// - CLI/Cron: geduldig (Standard 8 Versuche, ~18s) — überbrückt nächtliche
// Backup-/Neustartfenster, statt dass der Cron-Job hart scheitert.
'connect_retries' => (int) ($_ENV['DB_CONNECT_RETRIES'] ?? 3),
'connect_retries_cli' => (int) ($_ENV['DB_CONNECT_RETRIES_CLI'] ?? 8),
// Verbindungspool-Einstellungen
'pool' => [
'min_connections' => 1,
'max_connections' => 10,
'connect_timeout' => 10,
'wait_timeout' => 600,
],
];