Visto il gran numero di post che riguardano le sessioni e la gestione delle sessioni, vi propongo una soluzione abbastanza universale per i sistemi attuali.

Le classi sono funzionanti e gestiscono lo stretto necessario cosi sono facili da integrare o riutilizzare se a qualcuno servono. Le sessioni verranno salvate su un database mysql utilizzando PDO

Per saperne di più:
http://www.php.net/manual/en/book.session.php
http://www.w3schools.com/Php/php_sessions.asp
http://www.sitepoint.com/php-sessions/
http://www.html.it/articoli/sessioni...me-si-usano-1/

La tabella necessaria per sfruttare questo sistema è:
Codice PHP:
CREATE TABLE IF NOT EXISTS `sessions` (
  `
idvarchar(128collate utf8_unicode_ci NOT NULL,
  `
valuelongblob,
  `
expirytimestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  
PRIMARY KEY  (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Per l'inserimento a database (come spesso succede) mi avvalgo di un adapter per la classe PDO, il mio si chiama myPDO, sfrutta PDO per aggregazione ed è molto semplice ma funzionale:

myPDO.php
Codice PHP:
final class myPDO {

    private 
$pdo;
    private 
$stmt;

    public function 
__constructPDO $pdo ) {
        
$this->pdo $pdo;
    }

    
/**/
    
public function executeQuery$sql, array $params = array() ) {
        if ( !empty( 
$params ) ) {
            foreach ( 
$params AS $col=>$value ) {
                unset( 
$params[$col] );
                
$params[':'.$col] = $value;
            }
        }
        try {
            
$this->stmt $this->pdo->prepare$sql );
            
$this->stmt->execute$params );
            
$this->stmt->setFetchModePDO::FETCH_ASSOC );
            return 
$this->stmt;
        } catch( 
PDOException $e ) {
            throw new 
Exception$e->getMessage() );
        }
    }

    public function 
getError() {
        return 
$this->stmt->errorInfo();
    }

l'unico metodo è un "executeQuery" che mi risparmia i ":" sui parametri e la preparazione delle query

so che molti usano il proprio adapter, quindi fate attenzione nella classe successiva cosi potete sostituire i miei metodi con i vostri, se necessario

adapter per saperne di più:
http://www.sitepoint.com/integrating-the-data-mappers/

Passiamo ora alla gestione delle sessioni, vi invito a leggere la documentazione proposta sopra per approfondire la questione.

A noi basta sapere che PHP mette a disposizione una funzione carina che ci permette di registrare una classe, o funzione "diversa" da quella nativa per la gestione delle sessioni.

La funzione è session_set_save_handler()
approfondisci: http://www.php.net/manual/en/functio...ve-handler.php

useremo questa funzione per registrare la nostra classe al posto di quella nativa.

session.php
Codice PHP:
final class session {

    private 
$pdo;
    private 
$table 'sessions';

    public function 
__constructmyPDO $pdo ) {
        
$this->pdo $pdo;
        
session_set_save_handler(
            array(
$this'open'),
            array(
$this'close'),
            array(
$this'read'),
            array(
$this'write'),
            array(
$this'destroy'),
            array(
$this'gc')
        );
        
session_start();
    }

    public function 
open($path$name) {
        
$sid session_id();
        
$insertQuery = <<<QUERY
INSERT INTO
 
$this->table
(id, value, expiry)
VALUES
(:id, '', '')
ON DUPLICATE KEY
 UPDATE 
 expiry = NOW()
QUERY;
        
        
$this->pdo->executeQuery$insertQuery, array( 'id'=>$sid ) );
        return 
TRUE;
    }

    public function 
close() {
    }

    public function 
read$id ) {
        
$query "SELECT value FROM $this->table WHERE id = :id";
        return 
$this->pdo->executeQuery$query, array( 'id'=>$id ) )->fetchColumn();
    }

    public function 
write$id$data ) {
        
$insertQuery = <<<QUERY
INSERT INTO
 
$this->table
SET
 id = :id,
 value = :value
ON DUPLICATE KEY
 UPDATE 
 value = :value
QUERY;
        
$this->pdo->executeQuery$insertQuery, array( 'id'=>$id'value'=>$data ) );
    }

    public function 
destroy$id ) {
        
$query "DELETE FROM $this->table WHERE id = :id";
        
$this->pdo->executeQuery$query, array( 'id'=>$id ) );
        return 
TRUE;
    }

    public function 
gc$maxlifetime ) {
        
$query "DELETE FROM $this->table WHERE expiry < DATE_SUB(NOW(), INTERVAL $maxlifetime SECOND)";
        
$this->pdo->executeQuery$query );
        return 
TRUE;
    }

nel prossimo post vi spiego i vari metodi e poi un esempio di come usare le classi assieme..

intanto buona lettura