session ของ Codeigniter นั้นทำงานแยกกันกับ session ของ PHP โดยสิ้นเชิง ซึ่งการเก็บข้อมูล session ของ CI นอกจากเก็บข้อมูลที่กำหนดให้แล้ว ยังเก็บข้อมูลต่างๆต่อไปนี้ด้วย
- session id
- ip address
- user agent
- last activity (การเรียกดูครั้งล่าสุด) โดยเก็บเป็น timestamp
แต่การใช้ session ของ CI แบบเดิมๆที่ยังไม่ผ่านการปรับแต่งใดๆมานั้น จะเก็บข้อมูลได้แค่ไม่เกิน 4KB เท่านั้น เพราะว่าเป็นการเก็บลง cookie.
ในการที่จะเก็บข้อมูลให้ได้มากกว่า 4KB จึงต้องใช้อีกวิธีหนึ่งที่ CI มีรองรับมาให้แล้ว นั่นคือการเก็บลงฐานข้อมูล. การเก็บลงฐานข้อมูล โดยไม่ว่าข้อมูลที่กำหนดใส่ session จะเป็น integer, string, array ก็จะมีผลเหมือนกันหมด เพราะหลักการทำงานเดียวกัน นั่นคือเก็บเฉพาะข้อมูลหลักตามรายการที่ลิสต์ด้านบน ลงคุกกี้ และข้อมูลที่เรากำหนดลงในฐานข้อมูล เมื่อมีการเรียกดู CI จะทำการดึงข้อมูลจากในฐานข้อมูลโดยอ้างอิงจาก session id ในคุกกี้
การเก็บข้อมูลในฐานข้อมูลนี้ จะเก็บในตารางประเภท TEXT ซึ่งรองรับขนาดข้อมูลได้มากถึง 64KB เลยทีเดียว.
วิธีทำ
เปิดไฟล์ application/config/config.php
แก้ไขค่า $config['sess_use_database'] = TRUE;
สร้างตารางใน mysql ด้วยคำสั่งนี้
CREATE TABLE IF NOT EXISTS `ci_sessions` (
session_id varchar(40) DEFAULT '0' NOT NULL,
ip_address varchar(45) DEFAULT '0' NOT NULL,
user_agent varchar(120) NOT NULL,
last_activity int(10) unsigned DEFAULT 0 NOT NULL,
user_data text NOT NULL,
PRIMARY KEY (session_id),
KEY `last_activity_idx` (`last_activity`)
);
จากนั้นทดลองใช้งานตามปกติ
ทดสอบ
กำหนดค่าให้ session
$this->load->library( 'session' );
$this->session->set_userdata( 'test', 'data store in session.' );
เรียกค่าจาก session
echo $this->session->userdata( 'test' );
เมื่อมีข้อความว่า 'data store in session.' ปรากฏถูกต้อง ให้เปิดดูในฐานข้อมูล ตาราง ci_sessions จะพบว่ามีข้อมูลอย่างน้อย 1 แถว และข้อมูล 1 ในนั้นในฟิลด์ user_data จะมีข้อมูลที่มีคำๆนี้เก็บอยู่ภายใน.
เมื่อตรวจสอบแล้วปรากฏตามนี้ถือว่าคุณได้ทำอย่างถูกต้องแล้ว
อ้างอิง: http://ellislab.com/codeigniter/user-guide/libraries/sessions.html