Sebenarnya ada banyak cara untuk menyimpan session di database, namun saya hanya akan membahas salah satu cara saja, yaitu dengan memanfaatkan fungsi session_set_save_handler().
Pada intinya fungsi session_set_save_handler() ini memungkinkan programmer untuk meng-override default metode untuk menyimpan data session. Dengan kata lain programmer bisa menentukan sendiri fungsi apa yang akan dipanggil ketika proses baca tulis session berlangsung.
Format dari fungsi tersebut adalah sebagai berikut:
bool session_set_save_handler ( callback $open, callback $close, callback $read, callback $write, callback $destroy, callback $gc );
Penggunaan fungsi tersebut bisa kita lihat pada listing 1. Pertama, buat sebuah file baru, misalnya kita beri nama session.php. Berikutnya tuliskan kode program pada file tersebut.
Listing 1.
class SessionManager
{
var $life_time;
function SessionManager()
{
//baca setting maxlifetime dari PHP
$this->life_time = get_cfg_var("session.gc_maxlifetime");
//registrasikan fungsi yang akan dipanggil pada saat
//terjadi proses baca tulis session
session_set_save_handler(
array(&$this, "open"),
array(&$this, "close"),
array(&$this, "read"),
array(&$this, "write"),
array(&$this, "destroy"),
array(&$this, "gc")
);
}
}
Perhatikan listing 1 di atas. Pemanggilan fungsi session_set_save_handler() dilakukan pada constructor SessionManager(). Dengan cara ini saat kita membuat objek SessionManager, maka otomatis fungsi tersebut akan dipanggil.
Ketika fungsi session_set_save_handler() tersebut dipanggil maka fungsi-fungsi pada session handling akan di-override dengan fungsi lain yang telah ditentukan yang terdapat pada class SessionManager.
Langkah selanjutnya kita perlu menambahkan fungsi open(), close(), read(), write(), destroy() dan gc() pada class SessionManager di atas.
Listing 2.
function open($save_path, $session_name)
{
global $sess_save_path;
$sess_save_path = $save_path;
return true;
}
Listing 3.
function close()
{
return true;
}
Kalau kita lihat pada kode di atas, fungsi open() dan close() tidak melakukan suatu tindakan apa-apa. Ini karena kita akan menyimpan semua informasi session pada database. Pada kasus ini kita mengambil asumsi bahwa koneksi ke database sudah terjadi.
Akan tetapi seandainya koneksi database belum ada, bisa saja kita menuliskan perintah untuk membuka database pada fungsi open() dan perintah untuk menutup database pada fungsi close().
Listing 4.
function read($id)
{
$data = '';
$time = time();
$newid = mysql_real_escape_string($id);
$sql = "SELECT data
FROM sessions
WHERE session_id = '" . $newid . "' AND expires > " . $time;
$rs = mysql_query($sql);
$a = mysql_num_rows($rs);
if ($a > 0)
{
$row = mysql_fetch_array($rs);
$data = $row['data'];
}
return $data;
}
Listing 5.
function write($id, $data)
{
$time = time() + $this->life_time;
$newid = mysql_real_escape_string($id);
$newdata = mysql_real_escape_string($data);
$sql = "REPLACE sessions (session_id, data, expires)
VALUES ('" . $newid . "','" . $newdata . "'," . $time . ")";
$rs = mysql_query($sql);
return true;
}
Kode pada listing 5 dan listing 6 di atas dipakai untuk membaca dan menyimpan informasi session pada database.
Listing 6.
function destroy($id)
{
$newid = mysql_real_escape_string($id);
$sql = "DELETE FROM sessions
WHERE session_id = '" . $newid . "'";
mysql_query($sql);
return true;
}
Fungsi destroy() dipakai untuk menghapus informasi session pada database sesuai dengan parameter session_id yang diberikan.
Listing 7.
function gc()
{
$sql = "DELETE FROM sessions
WHERE expires < UNIX_TIMESTAMP();";
mysql_query($sql);
return true;
}
PHP secara rutin akan memanggil fungsi garbage collection untuk menghapus semua informasi session yang sudah expire. Hal ini ditangani oleh fungsi gc().
(bersambung)




