หายไปซะนาน วันนี้มาคุยกันเรื่อง session ใน CI พอหอมปากหอมคอกันดีกว่า

ไม่ได้มาอัพซะนาน จนเกือบจะลืมไปละ ชื่อเว็บ ตัวเองสะกดยังไง 555+

พักนี้ไปทำตัวไร้สาระ ซะจนเบื่อ พอละ เลยมา อัพเดทซะหน่อยกลัวจะลืม กัน อิอิ

เรื่องที่จะพูดวันนี้ไม่ใช้ jQuery นะครับ แต่เป็น session library ใน CI ซึ่งตัวเองก็เพิ่ง มีโอกาสได้ลองใช้ ที่ไม่ได้ลองไม่ใช่เพราะมันไม่ดีนะครับ แต่ตอนนั้น ผมมีปัญหาว่า session ใน CI มันไม่ยอม สลาย หลังจาก ปิด Browser ซึ่ง บางโอกาส มันก็ไม่เหมาะกับงานของผม ก็เลย เขียน session lib ใหม่ ซึ่งเป็น native ใช้งาน เอง (session lib ของ CI จะทำงานด้วย Cookie) แต่ตอนนี้ อยากมาลองดูบ้าง เพราะเห็นมันบอกว่า “offering more flexibility for developers” จะดูซิว่าจริงรึเปล่า?

ก็เลย จับมาเทส โดยเอามาโม นิดนึง ให้มัน ทำลายตัวเองได้หลังจากปิด browser โดยการ extends lib มันมาแก้ นิดเดียว (เดี๋ยวจะบอกวิธีแก้ตอนท้ายของบทความ) แล้วก็เลยได้รู้ว่า ” ของเค้าดีจริง ”

โดยปกติ ผมไม่ชอบใช้งาน session อยู่แล้ว ด้วยเหตุผลหลาย อย่าง เช่น ต้องมา config ถ้าใช้งาน ผ่าน load balancer, session ค้างไม่ยอมลบ ออกจากระบบ File System ทำให้ Node เต็ม เป็นต้น

ผมจึงชอบที่จะใช้ Cookie และก็พอดี session lib ของ CI มัน base on cookie

วันนี้ผมก็เลยเอาซะหน่อย มาเล่าเรื่อง (แปล manual) ของ lib ตัวนี้กัน

ขี้เกียจอธิบายไรมากละ มา Coding กันเลยดีกว่า….

การจะใช้ lib ของ CI ก็ทำเหมือนเดิมล่ะครับ คืือ

  1. $this->load->libary(’session’);

ซึ่งพอเราเรียกใช้งานแล้ว จะมีข้อมูลบางส่วนทำงานโดยทันทีคือ

  1. (
  2.      ’session_id’    => random hash,
  3.      ‘ip_address’    => ’string – user IP address’,
  4.      ‘user_agent’    => ’string – user agent data’,
  5.      ‘last_activity’ => timestamp
  6. )

ข้อมูลเหล่านี้จะถูก register โดยอัตโนมัติ ที่เรา set ค่า ให้ session ที่ทำงานผ่าน CI (ย้ำ ไม่ใช่ native PHP’s session)

โดยประโยชน์ที่เราน่าจะเอาไปใช้งานได้ดีที่สุดก็คือการทำ Authentication ให้กับ Web App นั่นเอง

ลองมาใช้งานดูกัน….

การ set

  1. $this->load->library(’session’);
  2. $userdata = array(‘username’ => ‘Tee++;’, ‘logged_in’ => TRUE);
  3. $this->session->set_userdata($userdata);

การ retrieve data

  1. $this->load->library(’session’);
  2. $this->session->userdata(‘username’);

อันนี้เป็น basic ง่ายๆ ครับ จริงๆ แล้วถ้าอ่านตาม manual ของเค้ามันจะมีความสามารถดังนี้คือ…
1. set ค่าเป็น ชุด array ได้
2. ตัวเวลาหมดอายุได้ผ่าน config หรือ config->set_item (default คือ 7200ms)
3. ตั้งชื่อ session name ได้
4. ตั้งค่า encrypt session ผ่าน config ได้ (recommended)
5. เก็บค่า session ใน db แทน cookie ได้
6. …… อ่าน manual เอาเถอะ -*-

จริงๆ จุดประสงค์ที่ผมเขียน บทความนี้เพราะผมชอบความสามารถนึงของมันมาก นั่นคือ Flashdata ครับ ไอ้ข้างบนมันแค่ พื้นๆ

flashdata ทำงานยังไง?

มันก็เหมือนกับการ append session 1 key ลงไป แต่ว่าที่เจ๋งของมันคือ มันจะทำงานแค่ครั้งเดียว ยังไงล่ะ?

เอางี้สมมุติ ผมเป็น user คนนึง เข้ามาทำการ post อะไรสักอย่าง ผมก็สามารถ append status message ไปว่า “I’m just wrote something” แล้วก็ append session ตัวนี้ไปกับตัวผมเอง จากนั้น หน้าต่อมา ผมก็จะเห็น status message ของผม แต่ว่า….

มันจะทำงานแค่ครั้งเดียวครับ แล้วลบตัสเองออกไปเลย Cool!

มาดูวิธีใช้กันเลยดีกว่า

สมมุติผมเพิ่ง post กระทู้ลง forum ผมนะ

  1. <?php
  2. $this->load->library(’session’);
  3. $this->session->set_flashdata(’status_msg’, ‘Your message has been published’);
  4. ?>

หน้าถัดมาผมก็เอามาแสดงได้เลย

  1. <?php
  2. $this->load->library(’session’);
  3. echo $this->session->flashdata(’status_msg’);
  4. ?>

โดยที่ session “status_msg” จะ destroy ตัวเอง ทันที หลังจากที่แสดงไปแล้ว Yep!

ลองไปใช้กันเองละกัน ผมก็แค่เอามา แนะนำอ่ะ

เออ แถมอีกนิด สำหรับการโม session lib ตัวนี้ให้มัน destroy ตัวเองได้หลังจาก ปิด browser

File: MY_Sesssion.php

  1. <?php  if ( ! defined(‘BASEPATH’)) exit(‘No direct script access allowed’);
  2. class MY_Session extends CI_Session {
  3.  
  4.         function _set_cookie($cookie_data = NULL)
  5.         {
  6.                 if (is_null($cookie_data))
  7.                 {
  8.                         $cookie_data = $this->userdata;
  9.                 }
  10.  
  11.                 // Serialize the userdata for the cookie
  12.                 $cookie_data = $this->_serialize($cookie_data);
  13.  
  14.                 if ($this->sess_encrypt_cookie == TRUE)
  15.                 {
  16.                         $cookie_data = $this->CI->encrypt->encode($cookie_data);
  17.                 }
  18.                 else
  19.                 {
  20.                         // if encryption is not used, we provide an md5 hash to prevent userside tampering
  21.                         $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);
  22.                 }
  23.                
  24.                 // I’ve just changed a bit here. (Tee++;)
  25.                 if ($this->sess_expiration == -1)
  26.                 {
  27.                         $expiration = 0;
  28.                 }
  29.                 else
  30.                 {
  31.                         $expiration = $this->sess_expiration + time();
  32.                 }
  33.  
  34.                 // Set the cookie
  35.                 setcookie(
  36.                                         $this->sess_cookie_name,
  37.                                         $cookie_data,
  38.                                         $expiration,
  39.                                         $this->cookie_path,
  40.                                         $this->cookie_domain,
  41.                                         0
  42.                                 );
  43.         }
  44.  
  45. }
  46. ?>

**** เอา Code ด้านบนไปใส่ใน application/libraries/My_Session.php ****

เวลาเรียกใช้งาน แบบที่จะให้ทำลายตัวเองหลังจาก ปิด Browser

ให้เรียกตัวนี้ก่อนใช้งาน session lib ครับ

  1. $this->config->set_item(’sess_expiration’, -1);
  2. $this->load->library(’session’);

วันนี้อาจจะเห็นผมรีบเขียนแบบแปลกๆ จริงๆแล้วไม่ใช่อะไรเลยครับ “ผม มาววววววว” หลังจาก กระดก beer ไป สามขวด ก็นึกอยาก อัพเดทขึ้นมาน่ะ ทำใจหน่อยนะ อาจจะอ่านไม่รู้เรื่องไปบ้าง ก็ขอ อภัย อิอิ

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

6 Comments »

 
  • DominixZ says:

    บทความนี้ข้อหยิบ lib ไปใช้ครับ :D

  • ่^__^ says:

    ลองเอาไปทดลองใช้แล้ว มันฟ้อง แบบนี้ตลอดเลยครับ
    Cannot modify header information – headers already sent by (output started at C:\AppServ\www\ads\system\application\libraries\My_Session.php:1

  • Tee++; says:

    ^
    ^
    ลองไปเช็คพวก autoload ต่างๆ ว่าหลัว tag ปิด PHP แล้วมันมี ช่องว่างมั้ย ถ้ามีเอาออกให้หมด

    แล้วเวลาเขียน lib เอง อย่าให้มี space หลัง tag เปิด-ปิด PHP

    แล้วก็เวลาเรียก autoload แล้วอย่าเรียก lib มาซ้ำอีก

  • ่^__^ says:

    ขอบคุณมากครับ แก้ไ้ด้แล้ว
    แต่ลองแล้วเหมือน session destroy ตัวเองทุกครั้งเมื่อไปหน้าใหม่

  • ifew says:

    เจ๋งงง

  • dekza says:

    นี่ขนาดเมาน่ะคับ ยังรู้เรื่องกว่าผมเขียนอีก 5555

 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>