<?php
/*
PHP SESSION HANDLING replacement

Lorenzo Marcon - 12 Aug 2006 - v1.1
*/

/*
quick usage:

require_once( 'ldpsession.inc.php' );
$s = new ldp_session();
$s->ldp_session_start();

// setting a variable
$value = 'whatever you want, even an object';
$s->set( 'varname', $value );

// retrieving variable name
$var = $s->get( 'varname' );


// N.B.: especially if working with object, remember to save your session at
// the end of the script
$s->save_session();

TODO:
- periodically remove expired session files

*/

function ldp_file_put_contents$n$d )
{
    
$f = @fopen$n"w" );
    if( !
$f )
        return 
false;
    else
    {
        
fwrite$f$d );
        
fclose$f );
        return 
true;
    }
}

class 
ldp_session
{
    var 
$VARS;
    var 
$session_id;
    var 
$tmp_path;

    function 
ldp_session()
    {
        
$this->VARS = array();
        
$this->tmp_path '/tmp';
    }

    
/** 
    * @brief genera l'id di sessione. 32 caratteri alfanumerici
    * 
    * @return 
    */
    
function generate_id()
    {
        
$alphanumeric = array( 'a''b''c''d''e''f''0''1''2''3''4''5''6''7''8''9' );
        for( 
$i 0$i 32$i++ )
            
$id .= $alphanumeric[rand016 )];

        
$this->session_id $id;
    }

    
/** 
    * @brief inizia o ripristina una sessione
    * 
    * @return 
    */
    
function ldp_session_start()
    {
        
// verifichiamo se esiste un cookie contenente l'id della sessione senno' ne settiamo uno nuovo
        
if( !isset( $_COOKIE['LDPSESSID'] ) )
        {
            
$this->generate_id();
            
$this->save_session();
        }
        else
            
$this->session_id $_COOKIE['LDPSESSID'];
            
        
setcookie'LDPSESSID'$this->session_id,  time()+1800 ); // facciamola che dura mezz'ora

        // ripristiniamo le variabili della sessione
        
$this->resume_session();
    }

    
/** 
    * @brief salva la sessione su file
    * 
    * @return 
    */
    
function save_session()
    {
        
ldp_file_put_contents$this->tmp_path.'/sess_'.$this->session_idserialize$this->VARS ) );
    }

    
/** 
    * @brief ripristina la sessione
    * 
    * @return 
    */
    
function resume_session()
    {
        
$v file_get_contents$this->tmp_path.'/sess_'.$this->session_id );
        
$this->VARS unserialize$v );
    }
    
    
/** 
    * @brief imposta una variabile di sessione
    * 
    * @param $varname il nome della variabile da settare
    * @param $value il valore
    * 
    * @return 
    */
    
function set$varname$value )
    {
        
$this->VARS[$varname] = $value;
        
$this->save_session();
    }

    
/** 
    * @brief ritorna la copia di una variabile di sessione
    * 
    * @param $varname il nome della variabile da ritornare
    * 
    * @return 
    */
    
function &get$varname )
    {
        
$this->resume_session();
        return 
$this->VARS[$varname];
    }

}

?>