Session Dasar
Ingat data antar halaman: session_start, $_SESSION, dan menghapus session.
Analogi: Gelang Pengunjung
HTTP itu pelupa: setiap request adalah orang asing baru, server tidak ingat request sebelumnya. Padahal kita butuh ingatan: "user ini sudah login", "isi keranjangnya apa". Session seperti gelang yang dipasang ke pengunjung: gelang itu sendiri hanya berisi nomor ID, tapi di "ruang arsip" server tersimpan semua data milik nomor tersebut.
Cara kerjanya: saat session_start() dipanggil pertama kali, PHP membuat ID acak unik, menyimpannya di cookie browser (PHPSESSID), dan menyiapkan "loker" data di server ($_SESSION). Request berikutnya membawa ID itu, PHP membuka loker yang sama.
<?php
// Contoh 1: session sebagai penghitung kunjungan
session_start(); // WAJIB di baris paling atas, sebelum output apa pun!
$_SESSION["kunjungan"] = ($_SESSION["kunjungan"] ?? 0) + 1;
echo "Kamu sudah berkunjung " . $_SESSION["kunjungan"] . " kali.";
// Refresh: angka bertambah. Tutup browser, buka lagi: mulai dari 1 lagi? (tergantung cookie)$_SESSION adalah array super-global seperti $_GET/$_POST, tapi isinya bertahan antar halaman selama session hidup. Pola ($_SESSION["x"] ?? 0) + 1 adalah idiom "ambil atau default, lalu tambah".
<?php
// Contoh 2: menyimpan preferensi antar halaman
session_start();
if (isset($_GET["tema"])) {
// validasi dulu! hanya izinkan nilai yang dikenal
$_SESSION["tema"] = in_array($_GET["tema"], ["terang", "gelap"], true)
? $_GET["tema"] : "terang";
}
$tema = $_SESSION["tema"] ?? "terang";
echo "Tema aktif: $tema";
// Pindah ke halaman lain yang juga session_start(), $tema tetap "gelap"Session ideal untuk data sementara dan privat: status login, isi keranjang, pesan flash ("data tersimpan!"). Bukan untuk data permanen (itu tugas database) atau data besar (menyedot memori server).
Jebakan yang Sering Terjadi
session_start() setelah output. Sama seperti header(): session mengirim cookie lewat HTTP header, jadi harus sebelum output apa pun. Spasi sebelum <?php saja sudah memicu "headers already sent". Aturan: session_start(); selalu baris pertama file.
Lupa session_start() di halaman lain. $_SESSION di halaman tanpa session_start() hanyalah array kosong biasa. Setiap file PHP yang butuh session wajib memanggilnya. Lupa di satu halaman = data "hilang" misterius.
Session vs Pilihan Lain
Kapan memakai session, kapan yang lain?
- Session: data privat sementara (login, keranjang). Aman karena di server.
- Cookie: preferensi non-sensitif yang awet (tema, bahasa). Ringan, tapi terlihat user.
- Database: data permanen (profil, riwayat order). Selalu ada meski session habis.
- Cache (Redis): data sementara yang diakses super sering. Session default (file) lambat untuk traffic tinggi.
Contoh arsitektur nyata: status login di session, isi keranjang di database (agar tidak hilang saat session habis), preferensi tema di cookie, dan hasil query berat di cache. Tiap alat untuk tugasnya.
Catatan teknis: Secara default data session disimpan sebagai file di server (
/tmp). Di production dengan banyak server, penyimpanan dialihkan ke database atau Redis agar semua server berbagi session yang sama. Untuk belajar di XAMPP, default-nya sudah cukup.
Tantangan
Penghitung kunjungan
Buat counter.php: tiap refresh, tambah $_SESSION["kunjungan"] dan tampilkan "Ini kunjunganmu yang ke-X". Tambahkan link "Reset" ke counter.php?reset=1 yang menghapus session lalu redirect kembali.