CodeIgniter 한국사용자포럼 BETA
빠르고, 유연한 PHP Framework!

CI 코드


Codeigniter 에서 세션 사용하기(세션이 비정상적으로 동작시)      
서치 0 2,768 0 0 2010-05-27 01:32:10
2007년 개인 블로그에 작성한 글입니다.. 퍼갈시 출처 표기 바랍니다.
-------------------------
CodeIgniter 에서 제대로 세션이 동작되지 않는 경우가 있다.

난 비록 얼마 사용하지 않았지만.. 이번에 좀 큰 시스템을 개발 중인데 이같은 문제가 발생해 난감해 하던차에 구글을 뒤져 다음과 같은 코드로 바꿔치기 하면 된다는 사실을 알았다.

단 이때 코드는 system/libraries 에 있는 Session.php 를 다른 이름으로 바꾸고 그 다음에 아래 내용을 Session.php 로 저장해서 넣으면 된다.

즐거운 CodeIgniter 생활이 되기를..


<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Code Igniter
*
* An open source application development framework for PHP 4.3.2 or newer
*
* @package     CodeIgniter
* @author      Dariusz Debowczyk
* @copyright   Copyright (c) 2006, D.Debowczyk
* @license     http://www.codeignitor.com/user_guide/license.html
* @link        http://www.codeigniter.com
* @since       Version 1.0
* @filesource
*/

// ------------------------------------------------------------------------

/**
* Session class using native PHP session features and hardened against session fixation.
*
* @package     CodeIgniter
* @subpackage  Libraries
* @category    Sessions
* @author      Dariusz Debowczyk
* @link        http://www.codeigniter.com/user_guide/libraries/sessions.html
*/
class CI_Session {

 var $flash_key = 'flash'; // prefix for "flash" variables (eg. flash:new:message)

 function CI_Session()
 {
  $this->object =& get_instance();
  log_message('debug', "Native_session Class Initialized");
  $this->_sess_run();
 }

 /**
    * Regenerates session id
    */
 function regenerate_id()
 {
  // copy old session data, including its id
  $old_session_id = session_id();
  $old_session_data = $_SESSION;

  // regenerate session id and store it
  session_regenerate_id();
  $new_session_id = session_id();

  // switch to the old session and destroy its storage
  session_id($old_session_id);
  session_destroy();

  // switch back to the new session id and send the cookie
  session_id($new_session_id);
  session_start();

  // restore the old session data into the new session
  $_SESSION = $old_session_data;

  // update the session creation time
  $_SESSION['regenerated'] = time();

  // session_write_close() patch based on this thread
  // http://www.codeigniter.com/forums/viewthread/1624/
  // there is a question mark ?? as to side affects

  // end the current session and store session data.
  session_write_close();
 }

 /**
    * Destroys the session and erases session storage
    */
 function destroy()
 {
  unset($_SESSION);
  if ( isset( $_COOKIE[session_name()] ) )
  {
   setcookie(session_name(), '', time()-42000, '/');
  }
  session_destroy();
 }

 /**
    * Reads given session attribute value
    */    
 function userdata($item)
 {
  if($item == 'session_id'){ //added for backward-compatibility
   return session_id();
  }else{
   return ( ! isset($_SESSION[$item])) ? false : $_SESSION[$item];
  }
 }

 /**
    * Sets session attributes to the given values
    */
 function set_userdata($newdata = array(), $newval = '')
 {
  if (is_string($newdata))
  {
   $newdata = array($newdata => $newval);
  }

  if (count($newdata) > 0)
  {
   foreach ($newdata as $key => $val)
   {
    $_SESSION[$key] = $val;
   }
  }
 }

 /**
    * Erases given session attributes
    */
 function unset_userdata($newdata = array())
 {
  if (is_string($newdata))
  {
   $newdata = array($newdata => '');
  }

  if (count($newdata) > 0)
  {
   foreach ($newdata as $key => $val)
   {
    unset($_SESSION[$key]);
   }
  }
 }

 /**
    * Starts up the session system for current request
    */
 function _sess_run()
 {
  session_start();

  $session_id_ttl = $this->object->config->item('sess_expiration');

  if (is_numeric($session_id_ttl))
  {
   if ($session_id_ttl > 0)
   {
    $this->session_id_ttl = $this->object->config->item('sess_expiration');
   }
   else
   {
    $this->session_id_ttl = (60*60*24*365*2);
   }
  }

  // check if session id needs regeneration
  if ( $this->_session_id_expired() )
  {
   // regenerate session id (session data stays the
   // same, but old session storage is destroyed)
   $this->regenerate_id();
  }

  // delete old flashdata (from last request)
  $this->_flashdata_sweep();

  // mark all new flashdata as old (data will be deleted before next request)
  $this->_flashdata_mark();
 }

 /**
    * Checks if session has expired
    */
 function _session_id_expired()
 {
  if ( !isset( $_SESSION['regenerated'] ) )
  {
   $_SESSION['regenerated'] = time();
   return false;
  }

  $expiry_time = time() - $this->session_id_ttl;

  if ( $_SESSION['regenerated'] <=  $expiry_time )
  {
   return true;
  }

  return false;
 }

 /**
    * Sets "flash" data which will be available only in next request (then it will
    * be deleted from session). You can use it to implement "Save succeeded" messages
    * after redirect.
    */
 function set_flashdata($key, $value)
 {
  $flash_key = $this->flash_key.':new:'.$key;
  $this->set_userdata($flash_key, $value);
 }

 /**
    * Keeps existing "flash" data available to next request.
    */
 function keep_flashdata($key)
 {
  $old_flash_key = $this->flash_key.':old:'.$key;
  $value = $this->userdata($old_flash_key);

  $new_flash_key = $this->flash_key.':new:'.$key;
  $this->set_userdata($new_flash_key, $value);
 }

 /**
    * Returns "flash" data for the given key.
    */
 function flashdata($key)
 {
  $flash_key = $this->flash_key.':old:'.$key;
  return $this->userdata($flash_key);
 }

 /**
    * PRIVATE: Internal method - marks "flash" session attributes as 'old'
    */
 function _flashdata_mark()
 {
  foreach ($_SESSION as $name => $value)
  {
   $parts = explode(':new:', $name);
   if (is_array($parts) && count($parts) == 2)
   {
    $new_name = $this->flash_key.':old:'.$parts[1];
    $this->set_userdata($new_name, $value);
    $this->unset_userdata($name);
   }
  }
 }

 /**
    * PRIVATE: Internal method - removes "flash" session marked as 'old'
    */
 function _flashdata_sweep()
 {
  foreach ($_SESSION as $name => $value)
  {
   $parts = explode(':old:', $name);
   if (is_array($parts) && count($parts) == 2 && $parts[0] == $this->flash_key)
   {
    $this->unset_userdata($name);
   }
  }
 }
}
?>
  목록  

번호 제   목 글쓴이 날짜 조회 추천수
580 CodeIgniter SimpleXML library [0] 타로 2012-02-05 29 0
577 CI 와 Smarty 템플릿의 결합 [2] 불의회상 2012-01-26 156 0
573 Okada Design Blog 소개 [3] 타로 2012-01-12 272 0
568 woctopus 계정관리도구 [2] milosz 2012-01-09 211 0
566 업로드된 이미지 정사각형으로 썸네일 만드는 함수 [3] 불의회상 2012-01-06 221 0
554 코드 이그나이터를 접하고 처음으로 만들어본 객체 입.. [6] 내일은 2011-11-11 1246 0
528 모델코드 생성기 [25] 불의회상 2011-10-13 1144 1
525 ci memo + tank_auth [2] milosz 2011-10-04 943 0
512 포럼소스를 2.0.1 버전에 맞게 수정하였습니다. [2] 탱크 2011-04-02 3546 2
509 CI 메뉴얼 CHM 버전(영문 2.0) [1] 브라이언 2011-03-30 1242 0
508 CI 메뉴얼 CHM 버전 [0] 브라이언 2011-03-30 1382 0
494 ci memo [8] pam 2011-02-20 1971 1
489 CI 압축 프로그램 [2] 준이 2010-12-27 1636 0
482 듬직이님의 헬퍼 ip 부분 추가. [0] 나이유미 2010-11-22 1998 0
475 SELECT() 사용 시 문제점 [2] 마냐 2010-09-16 2742 0
473 CI의 사용자 인증 소스파일 [2] corean 2010-09-12 3142 0
471 CI 1.7.2 한글 언어팩 1.1 [1] cleansugar 2010-08-26 2220 0
470 Upload 라이브러리 수정본 [0] sisco 2010-07-28 2398 0
464 iScaffold [4] 준이 2010-07-26 1981 0
458 이미지 등분하기_helper [0] 마냐 2010-06-18 2226 0