OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

database.php

3 KB
<?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,
    ],
];