เปลี่ยนการเก็บ CI Banner

เปลี่ยนการเก็บ Session จาก File ไปเป็น Database บน Codeigniter

เปลี่ยนการเก็บ Session จาก File ไปเป็น Database ทำไปเพื่ออะไร ทำอย่างไร วิธีการ ขั้นตอนเป็นอย่างไร เดี๋ยวเรามาลองดูกันครับ ว่าจะต้องทำอย่างไรบ้าง

เปลี่ยนการเก็บ Session จาก File ไปเป็น Database

Session บน ระบบของ Codeigniter PHP Framework นั้น ถูกสร้างขึ้นมา ในลักษณะที่ ต้องมีการจัดเก็บ มีการตั้งเวลา การหมดอายุ ชื่อของ Cookie ที่จะใช้ ตรงนี้เราแบ่งเป็น Driver ทั้งหมด 4 แบบด้วยกัน

  1. files
  2. database
  3. redis
  4. memcached

วันนี้เราจะมาพูดกันถึง 2 แบบแรก คือ files ที่เป็น driver แบบตั้งต้น หรือ Default มาให้จาก codeigniter ไว้แล้ว เพราะเป็นแบบที่ เราไม่ต้องมานั่งปรับแต่ง อะไรกันเลย ถ้าเป็นแบบนี้ ปรกติแล้ว เวลา codeigniter สร้าง session ขึ้นมา ถ้าเราระบุเป็นค่า NULL ก็ไม่ต้องทำอะไร

เพราะว่า codeigniter จะใช้พื้นที่ของ PHP ใน function session_save_path() ซึ่งก็คือ temp folder ที่จะถูกสร้าง ขึ้นมาขั่วคราวนั้นเอง  และนั้นทำให้มักเกิดเป็นปัญหา บาง Server บาง environment user ทั่วไป อาจไม่สามารถ ตั้งค่าให้ ใช้สิทธิ์ หรือ permission  แบบที่สามารถ เขียน อ่านได้

  • Ubuntu จะเก็บ session path เอาไว้ที่ /var/lib/php5 หรือ php7
  • Debian เก็บเอาไว้ ที่เดียวกันกับ ubuntu
  • CentOS สร้าง folder ชื่อ session ขึ้นมาใน folder ของ PHP อีกที
  • xampp จะเก็บไว้ใน folder tmp ที่อยู่ folder ของ xampp เลย

permission ที่จะสามาถ ทำงานได้ คือ folder นั้นจะต้องเป็น 0700 หรือ 0777 เพื่อให้ อ่านออก เขียนได้ นั้นเอง ทีนี้บางคนไม่สามารถ แก้ไขในส่วนนี้ได้ ก็จะพบ error ประมาณว่า session save path มีปัญหา ก็เลยหันไปเลือกใช้ database driver กันแทน

แต่นอกจาก จะแก้ปัญหา ด้านบนแล้ว database driver ยังมีอีกหนึ่งเหตุผลพิเศษ ตรงที่ เราสามารถเข้าถึง session ได้ง่าย เหมือนเป็น table นึงใน database นั้นเอง

วิธีการใช้งาน database session คือ

แบบที่ 1.ของเดิม File Driver


$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

แบบที่ 2.Database Driver


$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 3000;
$config['sess_regenerate_destroy'] = FALSE;

ทีนี้เรามาลอง ดูวิธีการสร้าง Table สำหรับจัดเก็บ session กันบ้าง เราจะสามารถ สร้าง Table ได้ทั้ง ฐานข้อมูล MySQL และ PostgreSQL

CREATE TABLE IF NOT EXISTS `ci_sessions` (
 `id` varchar(128) NOT NULL,
 `ip_address` varchar(45) NOT NULL,
 `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
 `data` blob NOT NULL,
 KEY `ci_sessions_timestamp` (`timestamp`)
);

แบบนี้ก็สามารถ ใช้งานได้จริงแล้ว ส่วนใครที่ไม่อยากสร้าง ก็สามารถ Download ไฟล์ Table ได้ที่นี่เลยครับ

ci_sessions table

ส่วนใครที่อยากรู้ว่า session save path ของตัวเอง ในตอนนี้ อยู่ที่ไหน ก็สามารถ ใช้ var_dump ออกมาดูได้ ตามนี้เลยครับ var_dump(session_save_path());

อ้างอิงจาก

codeigniter user guide session