Memahami Session dalam Aplikasi Web

Session dalam aplikasi web adalah untuk mengatasi masalah yang berkaitan dengan sifat stateless dalam protokol HTTP. Contohnya apabila kita melayari satu laman web, dan membuka laman utama dan kemudian laman yang kedua, server tidak akan dapat mengenalpasti orang yang mengakses laman kedua adalah orang yang sama mengakses laman pertama tadi. Ini menyebabkan masalah apabila kita ingin membangunkan aplikasi di mana sebahagian daripada laman kita adalah untuk pengguna tertentu sahaja.

Atau pun aplikasi yang perlu menyimpan data apa yang user lakukan pada laman pertama, dan seterusnya memaparkan di laman yang kedua atau seterusnya. Contohnya sebuah laman e-commerce yang mempunyai fungsi shopping cart. Di laman pertama, pengguna akan add barangan yang ingin dibeli ke dalam cart. Bila pengguna membuka laman lain di website tersebut, kita mungkin ingin memaparkan kepada pengguna apa yang telah mereka masukkan ke dalam cart.

Protokol HTTP mempunyai konsep cookie, di mana apabila pengguna mengakses laman web kita, kita boleh 'tanam' data yang akan disimpan dalam komputer pengguna. Setiap kali mereka mengakses laman kita, data tersebut akan dihantar sekali. Ini membolehkan kita mengenalpasti pengguna ini telah pun melawat laman kita sebelum ini. Jadi secara teori, kita boleh menggunakan cookie ini untuk menyelesaikan masalah berkaitan shopping cart sebelum ini. Kita boleh simpan barang yang pengguna masukkan ke dalam cart di dalam cookie. Cookie bagaimana pun mempunyai beberapa masalah seperti saiz yang terhad (4K) dan juga pengguna boleh mengubah data yang disimpan di dalam cookie sesuka hati mereka. Ada cara untuk mengelakkan data dalam cookie diubah namun ia di luar skop artikel ini.

Jadi satu teknik baru untuk menyimpan data pengguna digunakan - ia dipanggil session. Ia masih menggunakan cookie tetapi tidak menyimpan kesemua data ke dalam cookie. Sebaliknya apa yang disimpan dalam cookie hanyalah rujukan (reference / pointer) kepada data sebenar yang di simpan di bahagian server. Apa yang disimpan dalam cookie hanyalah ID unik yang boleh digunakan untuk query data store di server bagi mendapatkan data sebenar. data store ini boleh jadi berbentuk file (default storage PHP session), row dalam database dan sebagainya. Dalam tulisan ini, saya cuba menunjukkan konsep asas implementasi session menggunakan bahasa pengaturcaraan PHP.

Berikut adalah kod utama yang akan implement session bagi web aplikasi kita. Kod ini boleh disimpan dalam fail bernama mysession.php:-

<?php
/* This is for learning purpose only - just to show how session in theory being
implemented. For real session usage, use the session provided by your web framework.
*/

$HERE = realpath(dirname(__FILE__));
$SESSION_CLOSED = False;

function end_session() {
    if (!$GLOBALS['SESSION_CLOSED']) {
        $session_file = $GLOBALS['HERE'] . '/' . $GLOBALS['_MYSESSID'] . '.session';
        file_put_contents($session_file, serialize($GLOBALS['_MYSESSION']));
        $GLOBALS['SESSION_CLOSED'] = True;
    }
}

function start_session() {
    if (array_key_exists('mysessid', $_COOKIE)) {
        $mysessid = $_COOKIE['mysessid'];
        $session_file = $GLOBALS['HERE'] . '/' . $mysessid . '.session';
        if (file_exists($session_file)) {
            $GLOBALS['_MYSESSION'] = unserialize(file_get_contents($session_file));
        }
        else {
            $GLOBALS['_MYSESSION'] = array();
        }
    }
    else {
        $mysessid = uniqid('MYSESSID');
        setcookie('mysessid', $mysessid);
        $GLOBALS['_MYSESSION'] = array();
    }
    $GLOBALS['_MYSESSID'] = $mysessid;
    register_shutdown_function('end_session');
}

Dan bagi setiap page yang ingin menggunakan fungsi session ini, contohnya index.php:-

<?php

include 'mysession.php';

start_session();
print_r($_MYSESSION);
$_MYSESSION['name'] = 'kamal';

Page yang kedua, index2.php:-

<?php

include 'mysession.php';

start_session();
print_r($_MYSESSION);
$_MYSESSION['on_index2'] = True;

Dalam contoh di atas, apabila pengguna melawat index2.php, data dalam $_MYSESSION['name'] yang disetkan pada laman pertama akan dipaparkan. Dalam function start_session(), apa yang berlaku adalah kita check jika pengguna mempunyai nilai cookie mysessid, jika ada kita akan cuba load data yang disimpan dalam file $mysessid.session ke dalam variable global $_MYSESSION. Manakala setiap kali script tersebut berakhir, kita akan simpan balik data dalam variable $_MYSESSION ke dalam file $mysessid.session. Ini adalah konsep asas bagaimana session berfungsi. Di sini kita menyimpan data di dalam file namun boleh saja data tersebut disimpan di dalam database table dengan mysessid berfungsi sebagai primary key bagi rekod tersebut.

Mengenai penulis

Kamal Mustafa adalah Web developer dengan lebih 10 tahun pengalaman dalam bidang pembangunan aplikasi web (PHP/Python) dan IT secara umum. Bersedia untuk berkongsi ilmu berkaitan IT dan pengaturcaraan melalui penulisan, bengkel, seminar atau personal coaching. Aktif menulis di blog peribadi ImportError dan Twitter @k4ml.

Kamal Mustafa is a Web Developer with more than 10 years experience in web application development (PHP/Python) and IT in general. Interested in sharing knowledge about IT and programming through writing, workshop, seminar or personal coaching. Actively sharing his thought at personal blog ImportError and Twitter @k4ml.

comments powered by Disqus