Session adalah sebuah varibel sementara yang diletakkan di server. Di mana PHP bisa mengambil nilai yang tersimpan di server walaupun kita membuka halaman baru. Biasanya session akan hilang jika anda menutup browser. Session paling banyak digunakan untuk otentifikasi pengguna aplikasi berbasis web. Setelah pengguna melakukan otentifikasi, pengguna tersebut dapat membuka halaman lain tanpa harus melakukan otentifikasi ulang karena pengguna tersebut telah dikenali oleh sistem. Sistem menyimpan data otentifikasi pengguna tersebut pada browser.

Session mempunyai umur tertentu. Umur tersebut bisa diatur oleh pembuat aplikasi. Akan tetapi, pada kondisi tertentu, server kadang menghapus data tersebut sebelum umurnya habis. Selain itu, aplikasi juga harus memberikan identitas kepada browser atau aplikasi klien agar tetap dapat mengakses halaman tersebut. Jika identitas tersebut hilang, maka pengguna tersebut harus melakukan otentifikasi ulang.

Kode program berikut sangat berguna untuk mengelola session pada server dan agar browser atau aplikasi klien mempunyai identitas yang bersifat permanen selama periode tertentu. Untuk menjaga agar data session tetap tersimpan di server selama periode tertentu, pembuat aplikasi bisa menggunakan file atau database. Untuk memberikan identitas kepada browser atau aplikasi klien agar dikenali oleh server selama periode tertentu, aplikasi pada server mengirimkan data yang dikenal sebagai cookie yang disimpan pada browser atau aplikasi klien. Dengan perpaduan ini, maka aplikasi server dapat mengenali aplikasi klien selama periode tertentu. Dengan kata lain, pengguna dapat mengakses aplikasi server tersebut tanpa harus melakukan otentifikasi ulang.

Programmer PHP sering mengalami masalah dalam menyimpan data session. Sistem yang dibuat dan telah berjalan sempurna pada localhost, kadang mengalami masalah pada server online, apalagi jika diakses dari domain yang berbeda.

Kode program berikut telah diuji pada server online dan diakses dari subdomain yang berbeda.

<?php

class KamsSession
{
private $ks_db_connection;
private $ks_session;

var $ks_cfg_usedatabase = false;

var $ks_db_host;
var $ks_db_user;
var $ks_db_password;
var $ks_db_name;
var $ks_db_table = "sessions";

var $ks_cookie_name = "kscookie";
var $ks_cookie_lifetime = 86400;
var $ks_cookie_path = "/";
var $ks_cookie_domain = "";
var $ks_cookie_secure = false;
var $ks_cookie_httponly = false;

var $ks_session_id;
var $ks_session_name = "kssession";
var $ks_session_gc_probability = 50;
var $ks_session_save_handler = "user";
var $ks_session_method = 2;


function __construct()
{
}

function session_set_cookie_params($lifetime=0, $path="/",
$domain="", $secure=false, $httponly=false)
{
$this->ks_cookie_lifetime = $lifetime;
$this->ks_cookie_path = $path;
$this->ks_cookie_domain = $domain;
$this->ks_cookie_secure = $secure;
$this->ks_cookie_httponly = $httponly;
}
function session_set_database_params($host, $database,
$user, $password, $table="sessions")
{
$this->ks_db_host = $host;
$this->ks_db_user = $user;
$this->ks_db_password = $user;
$this->ks_db_name = $password;
$this->ks_db_table = $table;
}
function start()
{
if($this->ks_cfg_usedatabase)
{
$this->ks_session_id = $this->getmycookie($this->ks_cookie_name);

ini_set('session.gc_probability', $this->ks_session_gc_probability);
ini_set('session.save_handler', $this->ks_session_save_handler);
ini_set('session.gc_maxlifetime', $this->ks_cookie_lifetime);
ini_set('session.save_path', $this->ks_cookie_path);
ini_set('session.cookie_domain', $this->ks_cookie_domain);

session_set_save_handler(
array($this, 'open'),
array($this, 'close'),
array($this, 'read'),
array($this, 'write'),
array($this, 'destroy'),
array($this, 'gc'));
session_id(strrev(md5($this->ks_session_id)));
session_name($this->ks_session_name);
session_start();

$this->setmycookie($this->ks_cookie_name, $this->ks_session_id,
time()+$this->ks_cookie_lifetime, $this->ks_cookie_path,
$this->ks_cookie_domain, $this->ks_cookie_secure,
$this->ks_cookie_httponly);
setcookie($this->ks_session_name, md5(time().mt_rand(1,999999)),
time()+$this->ks_cookie_lifetime, $this->ks_cookie_path,
$this->ks_cookie_domain, $this->ks_cookie_secure,
$this->ks_cookie_httponly);

if($this->ks_session_method == 2)
{
if(is_array($this->ks_session) && count($this->ks_session))
{
foreach($this->ks_session as $key=>$gval)
{
$_SESSION[$key] = $this->ks_session[$key];
}
}
}
}
else
{
session_start();
}
}

function setmycookie($name, $value="", $lifetime=0, $path="/",
$domain="", $secure=false, $httponly=false)
{
$value = str_rot13(strrev($value));
setcookie($name."0", substr($value,24,8),
$lifetime, $path, $domain, $secure, $httponly);
setcookie($name."1", substr($value,0 ,8),
$lifetime, $path, $domain, $secure, $httponly);
setcookie($name."2", substr($value,16,8),
$lifetime, $path, $domain, $secure, $httponly);
setcookie($name."3", substr($value,8 ,8),
$lifetime, $path, $domain, $secure, $httponly);
}

function getmycookie($name){
$v0 = (isset($_COOKIE[$name."0"]))?($_COOKIE[$name."0"]):"";
$v1 = (isset($_COOKIE[$name."1"]))?($_COOKIE[$name."1"]):"";
$v2 = (isset($_COOKIE[$name."2"]))?($_COOKIE[$name."2"]):"";
$v3 = (isset($_COOKIE[$name."3"]))?($_COOKIE[$name."3"]):"";
$v = strrev(str_rot13($v1.$v3.$v2.$v0));
if($v=="")
return md5(microtime().mt_rand(1,9999999));
else
return $v;
}

public function open()
{
if ($this->ks_db_connection = mysql_connect($this->ks_db_host,
$this->ks_db_user, $this->ks_db_password))
{
return mysql_select_db($this->ks_db_name, $this->ks_db_connection);
}
return false;
}

public function close()
{
return mysql_close($this->ks_db_connection);
return true;
}

public function read($id)
{
$id = mysql_real_escape_string($id);
$sql = sprintf("SELECT `data`, `xdata`
FROM `".$this->ks_db_table."` WHERE `id` = '%s'", $id);
if($result = mysql_query($sql, $this->ks_db_connection))
{
if(mysql_num_rows($result))
{
$record = mysql_fetch_assoc($result);
if($this->ks_session_method == 2)
{
$xdata = str_rot13(stripslashes($record['xdata']));
$this->ks_session = unserialize($xdata);
}
return $record['data'];
}
}
return '';
}

public function write($id, $data)
{
if($this->ks_session_method == 2)
{
$xdata = str_rot13(serialize($_SESSION));
}
else
{
$xdata = "";
}
$sql = sprintf("REPLACE INTO `".$this->ks_db_table."`
VALUES('%s', '%s', '%s', '%s')",
mysql_real_escape_string($id),
mysql_real_escape_string($data),
mysql_real_escape_string($xdata),
mysql_real_escape_string(time())
);
return mysql_query($sql, $this->ks_db_connection);

}

public function destroy($id)
{
$sql = sprintf("DELETE FROM `".$this->ks_db_table."`
WHERE `id` = '%s'", $id);
return mysql_query($sql, $this->ks_db_connection);
}

public function gc($max)
{
$sql = sprintf("DELETE FROM `".$this->ks_db_table."`
WHERE `timestamp` < '%s'",
mysql_real_escape_string(time() - $max));
return mysql_query($sql, $this->ks_db_connection);
}
}

/*
CREATE TABLE `sessions` (
`id` varchar(32) NOT NULL,
`data` longtext NOT NULL,
`xdata` longtext NOT NULL,
`timestamp` bigint(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
*/



?>

Untuk menggunakan kelas di atas, pengguna harus membuat sebuah objek dari kelas tersebut. Berikut ini merupakan contoh kode program yang menggunakan kelas session di atas.

$ksession = new KamsSession();

// basic setting
$ksession->ks_cfg_usedatabase = true;

// database setting
$ksession->ks_db_host = "localhost";
$ksession->ks_db_name = "mydatabase";
$ksession->ks_db_user = "user";
$ksession->ks_db_password = "********";
$ksession->ks_db_table = "sessions";
// or session_set_database_params($host,
// $database, $user, $password, $table);

// cookie setting
$ksession->ks_cookie_name = "kscookie";
$ksession->ks_cookie_lifetime = 3600;
$ksession->ks_cookie_path = "/";
$ksession->ks_cookie_domain = ".example.com";
$ksession->ks_cookie_secure = false;
$ksession->ks_cookie_httponly = false;
// or session_set_cookie_params($lifetime,
// $path, $domain, $secure, $httponly);

// session setting
$ksession->ks_session_name = "kssession";
$ksession->ks_session_method = 2;
// set ks_session_method to 2 if session data
// unreadable on classic method
// default value of ks_session_method is 2

$ksession->start();
// now, session is ready to be used


// write session data
$_SESSION['name'] = "Kamshory"; // type string
$_SESSION['age'] = 28; // type integer
$_SESSION['gpa'] = 3.95; // type float
$_SESSION['job'] = array("Programmer", "Consultant"); // type array

// read session data
$name = $_SESSION['name'];
$age = $_SESSION['age'];
$gpa = $_SESSION['gpa'];
$job = $_SESSION['job'];

Perhatian:

Jika programmer ingin menggunakan session dengan database, pastikan bahwa host, database, username, password, dan tabel sudah siap untuk digunakan. Selain itu, programmer juga telah membuat konfigurasi sebelum memanggil method start pada object KamsSession.