初始版本
This commit is contained in:
256
application/libraries/session.php
Executable file
256
application/libraries/session.php
Executable file
@@ -0,0 +1,256 @@
|
||||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class CI_Session {
|
||||
|
||||
var $flash_key = 'flash'; // prefix for "flash" variables (eg. flash:new:message)
|
||||
|
||||
function __construct()
|
||||
{
|
||||
$this->object =& get_instance();
|
||||
log_message('debug', "Native Session Class Initialized");
|
||||
|
||||
ini_set('session.gc_maxlifetime', 7200);
|
||||
$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 sess_destroy()
|
||||
{
|
||||
unset($_SESSION);
|
||||
if ( isset( $_COOKIE[session_name()] ) )
|
||||
{
|
||||
setcookie(session_name(), '', time()-42000, '/');
|
||||
}
|
||||
session_destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads given session attribute value
|
||||
*/
|
||||
function userdata($item)
|
||||
{
|
||||
// added for backward-compatibility
|
||||
if ($item == 'session_id')
|
||||
{
|
||||
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($newdata = array(), $newval = '')
|
||||
{
|
||||
if (is_string($newdata))
|
||||
{
|
||||
$newdata = array($newdata => $newval);
|
||||
}
|
||||
|
||||
if (count($newdata) > 0)
|
||||
{
|
||||
$flashdata = array();
|
||||
|
||||
foreach ($newdata as $key => $val)
|
||||
{
|
||||
$flashdata[$this->flash_key . ':new:' . $key] = $val;
|
||||
}
|
||||
|
||||
$this->set_userdata($flashdata);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// END Native Session Class
|
||||
|
||||
/* End of file Session.php */
|
||||
/* Location: ./application/libraries/Session.php */
|
||||
Reference in New Issue
Block a user