Modules
Kohana_Session_Database
extends Session
extends Kohana_Session
Database-based session class.
Sample schema:
CREATE TABLE `sessions` (
`session_id` VARCHAR( 24 ) NOT NULL,
`last_active` INT UNSIGNED NOT NULL,
`contents` TEXT NOT NULL,
PRIMARY KEY ( `session_id` ),
INDEX ( `last_active` )
) ENGINE = MYISAM ;
Class declared in MODPATH/database/classes/kohana/session/database.php on line 21.
Constants
- None
Properties
Properties
public static
string$defaultdefault session adapter
string(6) "native"public static
array$instancessession instances
array(0)protected
$_columnsprotected
array$_datasession data
protected
$_dbprotected
bool$_destroyedsession destroyed?
protected
bool$_encryptedencrypt session data?
protected
$_gcprotected
int$_lifetimecookie lifetime
protected
string$_namecookie name
protected
$_session_idprotected
$_tableprotected
$_update_id
Methods
public __construct( [ array $config = NULL , string $id = NULL ] ) (defined in Kohana_Session_Database)
Overloads the name, lifetime, and encrypted session settings.
Sessions can only be created using the Session::instance method.
Parameters
-
array$config = NULL - Configuration -
string$id = NULL - Session id
Tags
Return Values
void
Source Code
public function __construct(array $config = NULL, $id = NULL)
{
if ( ! isset($config['group']))
{
// Use the default group
$config['group'] = 'default';
}
// Load the database
$this->_db = Database::instance($config['group']);
if (isset($config['table']))
{
// Set the table name
$this->_table = (string) $config['table'];
}
if (isset($config['gc']))
{
// Set the gc chance
$this->_gc = (int) $config['gc'];
}
if (isset($config['columns']))
{
// Overload column names
$this->_columns = $config['columns'];
}
parent::__construct($config, $id);
if (mt_rand(0, $this->_gc) === $this->_gc)
{
// Run garbage collection
// This will average out to run once every X requests
$this->_gc();
}
}
public id( ) (defined in Kohana_Session_Database)
Get the current session id, if the session supports it.
$id = $session->id();
Not all session types have ids.
Tags
Return Values
string
Source Code
public function id()
{
return $this->_session_id;
}
public __toString( ) (defined in Kohana_Session)
Session object is rendered to a serialized string. If encryption is enabled, the session will be encrypted. If not, the output string will be encoded using base64_encode.
echo $session;
Tags
Return Values
string
Source Code
public function __toString()
{
// Serialize the data array
$data = serialize($this->_data);
if ($this->_encrypted)
{
// Encrypt the data using the default key
$data = Encrypt::instance($this->_encrypted)->encode($data);
}
else
{
// Obfuscate the data with base64 encoding
$data = base64_encode($data);
}
return $data;
}
public as_array( ) (defined in Kohana_Session)
Returns the current session array. The returned array can also be assigned by reference.
// Get a copy of the current session data
$data = $session->as_array();
// Assign by reference for modification
$data =& $session->as_array();
Return Values
array
Source Code
public function & as_array()
{
return $this->_data;
}
public bind( string $key , mixed & $value ) (defined in Kohana_Session)
Set a variable by reference.
$session->bind('foo', $foo);
Parameters
-
string$key required - Variable name -
byref mixed$value required - Referenced value
Return Values
$this
Source Code
public function bind($key, & $value)
{
$this->_data[$key] =& $value;
return $this;
}
public delete( string $key ) (defined in Kohana_Session)
Removes a variable in the session array.
$session->delete('foo');
Parameters
-
string$key required - Variable name
Return Values
$this
Source Code
public function delete($key)
{
$args = func_get_args();
foreach ($args as $key)
{
unset($this->_data[$key]);
}
return $this;
}
public destroy( ) (defined in Kohana_Session)
Completely destroy the current session.
$success = $session->destroy();
Return Values
boolean
Source Code
public function destroy()
{
if ($this->_destroyed === FALSE)
{
if ($this->_destroyed = $this->_destroy())
{
// The session has been destroyed, clear all data
$this->_data = array();
}
}
return $this->_destroyed;
}
public get( string $key [, mixed $default = NULL ] ) (defined in Kohana_Session)
Get a variable from the session array.
$foo = $session->get('foo');
Parameters
-
string$key required - Variable name -
mixed$default = NULL - Default value to return
Return Values
mixed
Source Code
public function get($key, $default = NULL)
{
return array_key_exists($key, $this->_data) ? $this->_data[$key] : $default;
}
public get_once( string $key [, mixed $default = NULL ] ) (defined in Kohana_Session)
Get and delete a variable from the session array.
$bar = $session->get_once('bar');
Parameters
-
string$key required - Variable name -
mixed$default = NULL - Default value to return
Return Values
mixed
Source Code
public function get_once($key, $default = NULL)
{
$value = $this->get($key, $default);
unset($this->_data[$key]);
return $value;
}
public static instance( [ string $type = NULL , string $id = NULL ] ) (defined in Kohana_Session)
Creates a singleton session of the given type. Some session types (native, database) also support restarting a session by passing a session id as the second parameter.
$session = Session::instance();
Session::write will automatically be called when the request ends.
Parameters
-
string$type = NULL - Type of session (native, cookie, etc) -
string$id = NULL - Session identifier
Tags
Return Values
Session
Source Code
public static function instance($type = NULL, $id = NULL)
{
if ($type === NULL)
{
// Use the default type
$type = Session::$default;
}
if ( ! isset(Session::$instances[$type]))
{
// Load the configuration for this type
$config = Kohana::config('session')->get($type);
// Set the session class name
$class = 'Session_'.ucfirst($type);
// Create a new session instance
Session::$instances[$type] = $session = new $class($config, $id);
// Write the session at shutdown
register_shutdown_function(array($session, 'write'));
}
return Session::$instances[$type];
}
public name( ) (defined in Kohana_Session)
Get the current session cookie name.
$name = $session->name();
Tags
Return Values
string
Source Code
public function name()
{
return $this->_name;
}
public read( [ string $id = NULL ] ) (defined in Kohana_Session)
Loads existing session data.
$session->read();
Parameters
-
string$id = NULL - Session id
Return Values
void
Source Code
public function read($id = NULL)
{
if (is_string($data = $this->_read($id)))
{
try
{
if ($this->_encrypted)
{
// Decrypt the data using the default key
$data = Encrypt::instance($this->_encrypted)->decode($data);
}
else
{
// Decode the base64 encoded data
$data = base64_decode($data);
}
// Unserialize the data
$data = unserialize($data);
}
catch (Exception $e)
{
// Ignore all reading errors
}
}
if (is_array($data))
{
// Load the data locally
$this->_data = $data;
}
}
public regenerate( ) (defined in Kohana_Session)
Generates a new session id and returns it.
$id = $session->regenerate();
Return Values
string
Source Code
public function regenerate()
{
return $this->_regenerate();
}
public set( string $key , mixed $value ) (defined in Kohana_Session)
Set a variable in the session array.
$session->set('foo', 'bar');
Parameters
-
string$key required - Variable name -
mixed$value required - Value
Return Values
$this
Source Code
public function set($key, $value)
{
$this->_data[$key] = $value;
return $this;
}
public write( ) (defined in Kohana_Session)
Sets the last_active timestamp and saves the session.
$session->write();
Any errors that occur during session writing will be logged, but not displayed, because sessions are written after output has been sent.
Tags
Return Values
boolean
Source Code
public function write()
{
if (headers_sent() OR $this->_destroyed)
{
// Session cannot be written when the headers are sent or when
// the session has been destroyed
return FALSE;
}
// Set the last active timestamp
$this->_data['last_active'] = time();
try
{
return $this->_write();
}
catch (Exception $e)
{
// Log & ignore all errors when a write fails
Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e))->write();
return FALSE;
}
}
protected _destroy( ) (defined in Kohana_Session_Database)
Destroys the current session.
Return Values
boolean
Source Code
protected function _destroy()
{
if ($this->_update_id === NULL)
{
// Session has not been created yet
return TRUE;
}
// Delete the current session
$query = DB::delete($this->_table)
->where($this->_columns['session_id'], '=', ':id')
->param(':id', $this->_update_id);
try
{
// Execute the query
$query->execute($this->_db);
// Delete the cookie
Cookie::delete($this->_name);
}
catch (Exception $e)
{
// An error occurred, the session has not been deleted
return FALSE;
}
return TRUE;
}
protected _gc( ) (defined in Kohana_Session_Database)
Source Code
protected function _gc()
{
if ($this->_lifetime)
{
// Expire sessions when their lifetime is up
$expires = $this->_lifetime;
}
else
{
// Expire sessions after one month
$expires = Date::MONTH;
}
// Delete all sessions that have expired
DB::delete($this->_table)
->where($this->_columns['last_active'], '<', ':time')
->param(':time', time() - $expires)
->execute($this->_db);
}
protected _read( [ string $id = NULL ] ) (defined in Kohana_Session_Database)
Loads the raw session data string and returns it.
Parameters
-
string$id = NULL - Session id
Return Values
string
Source Code
protected function _read($id = NULL)
{
if ($id OR $id = Cookie::get($this->_name))
{
$result = DB::select(array($this->_columns['contents'], 'contents'))
->from($this->_table)
->where($this->_columns['session_id'], '=', ':id')
->limit(1)
->param(':id', $id)
->execute($this->_db);
if ($result->count())
{
// Set the current session id
$this->_session_id = $this->_update_id = $id;
// Return the contents
return $result->get('contents');
}
}
// Create a new session id
$this->_regenerate();
return NULL;
}
protected _regenerate( ) (defined in Kohana_Session_Database)
Generate a new session id and return it.
Return Values
string
Source Code
protected function _regenerate()
{
// Create the query to find an ID
$query = DB::select($this->_columns['session_id'])
->from($this->_table)
->where($this->_columns['session_id'], '=', ':id')
->limit(1)
->bind(':id', $id);
do
{
// Create a new session id
$id = str_replace('.', '-', uniqid(NULL, TRUE));
// Get the the id from the database
$result = $query->execute($this->_db);
}
while ($result->count());
return $this->_session_id = $id;
}
protected _write( ) (defined in Kohana_Session_Database)
Writes the current session.
Return Values
boolean
Source Code
protected function _write()
{
if ($this->_update_id === NULL)
{
// Insert a new row
$query = DB::insert($this->_table, $this->_columns)
->values(array(':new_id', ':active', ':contents'));
}
else
{
// Update the row
$query = DB::update($this->_table)
->value($this->_columns['last_active'], ':active')
->value($this->_columns['contents'], ':contents')
->where($this->_columns['session_id'], '=', ':old_id');
if ($this->_update_id !== $this->_session_id)
{
// Also update the session id
$query->value($this->_columns['session_id'], ':new_id');
}
}
$query
->param(':new_id', $this->_session_id)
->param(':old_id', $this->_update_id)
->param(':active', $this->_data['last_active'])
->param(':contents', $this->__toString());
// Execute the query
$query->execute($this->_db);
// The update and the session id are now the same
$this->_update_id = $this->_session_id;
// Update the cookie with the new session id
Cookie::set($this->_name, $this->_session_id, $this->_lifetime);
return TRUE;
}