Greg Donald wrote:
On Wed, 16 Feb 2005 09:36:26 -0800 (PST), Richard Lynch <[EMAIL PROTECTED]> 
wrote:

It's literally an hour's work to alter the code to use MySQL to store the
sessions instead of the hard drive.


Not really, maybe 5 minutes.. here's the code:

The code misses one important thing - row locking. For concurent requests, sess_open must block until the first request does sess_close(). So you need to use InnoDB's row locking or application-level GET_LOCK() and RELEASE_LOCK().



Make the table in your database:

CREATE TABLE `sessions` (
    `id` varchar(32) NOT NULL default '',
    `data` text NOT NULL,
    `expire` int(11) unsigned NOT NULL default '0',
    PRIMARY KEY (`id`)
);

Make a sessions.php file:

<?php

// MySQL database connection parameters:
$dbhost     = 'localhost';
$dbuser     = 'dbuser';
$dbpasswd   = 'dbpassword';
$dbname     = 'dbname';

// Sessions table name:
$tb_sessions = 'sessions';

// Session lifetime in seconds:
$online_expire = 900;

// Use transparent sessions:
ini_set( 'session.use_trans_sid', 1);


// Below here should not require any changes

$sdbh = '';

function sess_open( $save_path, $session_name )
{
    global $sdbh;
        
    if( ! $sdbh = mysql_pconnect( $dbhost, $dbuser, $dbpasswd ) )
    {
                echo mysql_error();
                
        exit();
        }
        
    return true;
}

function sess_close()
{
        return true;
}

function sess_read( $key )
{
    global $sdbh, $dbname, $tb_sessions;
        
    $sql = "
                SELECT data
                FROM $tb_sessions
                WHERE id = '$key'
                AND expire > UNIX_TIMESTAMP()
        ";
        
    $query = mysql_query( $sql ) or die( mysql_error() );
        
    if( mysql_num_rows( $query ) )
    {
                return mysql_result( $query, 0, 'data' );
        }

        return false;
}

function sess_write( $key, $val )
{
    global $tb_sessions, $online_expire;
        
    $value = addslashes( $val );
        
    $sql = "
                REPLACE INTO $tb_sessions (
                    id,
                        data,
                        expire
                ) VALUES (
                        '$key',
                        '$value',
                        UNIX_TIMESTAMP() + $online_expire
                )
        ";
        
    return mysql_query( $sql ) or die( mysql_error() );
}

function sess_destroy( $key )
{
    global $tb_sessions;
        
    $sql = "
                DELETE FROM $tb_sessions
                WHERE id = '$key'
        ";
        
    return mysql_query( $sql ) or die( mysql_error() );
}

function sess_gc()
{
    global $tb_sessions;
        
    $sql = "
                DELETE FROM $tb_sessions
                WHERE expire < UNIX_TIMESTAMP()
        ";
        
    $query = mysql_query( $sql ) or die( mysql_error() );
        
    return mysql_affected_rows();
}

session_set_save_handler(
    'sess_open',
    'sess_close',
    'sess_read',
    'sess_write',
    'sess_destroy',
    'sess_gc'
);

session_start();

$sn     = session_name();
$sid    = session_id();

?>

Then you just do include( 'sessions.php' );

http://wiki.destiney.com/DBSessions/Install



-- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php



Reply via email to