Kredensial database yang ditaruh langsung di kode akan ikut terbawa ke Git, muncul di pesan error, dan sulit diganti saat pindah server. Cara menyimpan konfigurasi database di PHP yang rapi adalah menaruhnya di luar direktori publik, baik sebagai environment variable maupun file yang tidak di-commit. Tujuh pendekatan berikut bisa dipilih sesuai skala proyek dan tingkat kenyamanan tim.

Sebelum memilih, tentukan batasnya dulu

Semua cara di bawah mengasumsikan satu hal: file konfigurasi tidak boleh berada di dalam folder public_html atau www. Kalau file berisi kata sandi bisa diakses lewat browser, isinya sudah bocor sebelum sempat dibaca kode.

Selain lokasi, tentukan juga apakah konfigurasi perlu berbeda untuk tiap orang di tim. Proyek yang cuma jalan di satu server cukup pakai satu file. Proyek yang tiap developer punya MySQL lokal sebaiknya memakai nilai default dengan penimpaan lewat environment.

1. File PHP murni yang mengembalikan array

Cara paling sederhana: buat file di luar direktori publik yang mengembalikan array, lalu panggil dengan require.

<?php
// config/database.php
return [
    'host' => '127.0.0.1',
    'db'   => 'toko',
    'user' => 'app',
    'pass' => 'rahasia',
];

Pemakaiannya:

<?php
$config = require __DIR__ . '/../config/database.php';

Karena berupa file PHP, kesalahan sintaks akan langsung terlihat, dan editor bisa memberi pelengkapan otomatis. Kelemahannya, nilai ini gampang ter-commit ke repositori. Tambahkan nama file ke .gitignore dan sediakan versi contohnya, misalnya database.example.php.

2. File INI atau JSON

Format non-PHP memisahkan data dari kode, tapi butuh langkah parsing tambahan.

<?php
$config = parse_ini_file(__DIR__ . '/../config/database.ini', true);

JSON lebih kaku tapi mudah dibaca alat lain. Keduanya sama-sama tidak bisa mengeksekusi kode, sehingga relatif lebih aman kalau file-nya sampai terbaca lewat celah tertentu. Kekurangannya, tidak ada validasi: kalau ada kunci yang salah tulis, error baru muncul saat koneksi gagal.

3. File .env dengan vlucas/phpdotenv

Pola ini populer karena mengikuti kebiasaan aplikasi Twelve-Factor. Nilai disimpan sebagai pasangan kunci-nilai di file .env, lalu dimuat ke $_ENV dan getenv().

<?php
require __DIR__ . '/vendor/autoload.php';

$dotenv = DotenvDotenv::createImmutable(__DIR__ . '/..');
$dotenv->load();

$dsn = sprintf(
    'mysql:host=%s;dbname=%s;charset=utf8mb4',
    $_ENV['DB_HOST'],
    $_ENV['DB_NAME']
);

Pakai createImmutable() agar nilai dari environment sistem tidak bisa ditimpa file. Untuk produksi, jangan biarkan .env ada di server kalau environment variable sudah diset langsung oleh penyedia hosting.

4. Environment variable dari web server

Apache dan Nginx bisa menyuntikkan variabel ke proses PHP. Di Apache, tambahkan pada virtual host:

SetEnv DB_HOST 127.0.0.1
SetEnv DB_NAME toko

Di Nginx dengan PHP-FPM, gunakan direktif fastcgi_param. Cara ini menjaga kredensial benar-benar di luar direktori aplikasi. Sayangnya, nilai ini ilegal untuk diubah tanpa restart layanan dan sulit direplikasi di lingkungan lokal tanpa konfigurasi tambahan.

5. Secret manager milik penyedia cloud

Layanan seperti AWS Secrets Manager, Google Secret Manager, atau Vault menyimpan kredensial terenkripsi dan bisa diaudit siapa yang mengaksesnya. Aplikasi mengambil nilai saat boot, biasanya lewat SDK.

  • Cocok untuk sistem yang punya banyak layanan dan butuh rotasi kata sandi otomatis.
  • Menambah ketergantungan pada jaringan dan layanan pihak ketiga saat aplikasi start.
  • Perlu strategi cache supaya tidak memanggil API setiap request.

Untuk situs kecil dengan satu server, biaya dan kerumitannya biasanya tidak sepadan.

6. Variabel lingkungan dari panel hosting

Banyak penyedia shared hosting menyediakan kolom environment variable di dashboard. Nilai ini masuk ke proses PHP dan bisa dibaca dengan getenv(). Praktis karena tidak perlu menyentuh file sama sekali.

Periksa apakah panel menyimpan nilainya dalam bentuk terenkripsi dan siapa saja yang punya akses ke halaman tersebut. Kalau akun hosting dipakai bersama banyak orang, batasi hak aksesnya.

7. Kelas konfigurasi dengan nilai default bertingkat

Pendekatan terakhir menggabungkan beberapa sumber: nilai default di kode, ditimpa file lokal, lalu ditimpa environment variable.

<?php
final class DatabaseConfig
{
    public static function load(): array
    {
        $defaults = [
            'host' => '127.0.0.1',
            'db'   => 'toko',
            'user' => 'root',
            'pass' => '',
        ];

        $lokal = is_file(__DIR__ . '/../config/database.php')
            ? require __DIR__ . '/../config/database.php'
            : [];

        $env = array_filter([
            'host' => getenv('DB_HOST') ?: null,
            'db'   => getenv('DB_NAME') ?: null,
            'user' => getenv('DB_USER') ?: null,
            'pass' => getenv('DB_PASS') ?: null,
        ]);

        return array_merge($defaults, $lokal, $env);
    }
}

Urutan prioritasnya jelas: environment menang atas file lokal, file lokal menang atas default. Developer baru bisa langsung jalan tanpa menyiapkan apa pun, sementara server produksi tetap memegang kredensial sebenarnya.

Perbandingan singkat

Cara Kemudahan Keamanan Cocok untuk
Array PHP Tinggi Rendah Proyek latihan
INI / JSON Sedang Sedang Skrip kecil
.env Tinggi Sedang Sebagian besar proyek
Env web server Rendah Tinggi Server terkendali
Secret manager Rendah Tinggi Banyak layanan

Kesalahan yang sering terjadi

Menaruh file konfigurasi di dalam folder yang disajikan web server adalah kesalahan paling umum. Hindari juga menampilkan detail koneksi pada halaman error produksi, karena pesan seperti Access denied for user sering menyertakan nama pengguna.

Cabut kredensial dari riwayat Git kalau sudah terlanjur ter-commit. Menghapus file di commit baru tidak menghilangkan isinya dari riwayat lama, jadi kata sandi tetap perlu diganti.

Ringkasan

Untuk proyek baru, mulai dari file .env yang di-.gitignore plus nilai default di kode. Naik ke environment variable web server kalau server sepenuhnya Anda kendalikan, dan pertimbangkan secret manager begitu jumlah layanan bertambah. Pastikan file berisi kata sandi tidak pernah bisa diakses lewat URL, sekalipun caranya sederhana.

Pertanyaan yang Sering Diajukan

Apakah file .env aman disimpan di server produksi?

Aman selama berada di luar direktori publik dan hak aksesnya dibatasi, misalnya hanya bisa dibaca oleh pengguna yang menjalankan PHP. Kalau penyedia hosting menyediakan environment variable di panel, opsi itu menghilangkan file dari server sama sekali.

Bagaimana kalau kredensial sudah ter-commit ke repositori publik?

Segera ganti kata sandi database, karena menghapus file di commit berikutnya tidak menghilangkan isinya dari riwayat. Setelah kata sandi baru aktif, bersihkan riwayat repositori atau pindahkan proyek ke repositori baru bila perlu.

Bisakah konfigurasi diganti tanpa mengubah kode?

Bisa, asalkan kode membaca nilai dari environment atau file eksternal, bukan menuliskannya langsung. Pola bertingkat pada cara ketujuh membuat perubahan cukup dilakukan di satu tempat tanpa menyentuh logika aplikasi.