PHP Parallel Requests and Session Stability

4

Ho riscontrato molti problemi che erano il risultato della natura di PHP che viveva entro i limiti di una richiesta HTTP senza stato, specialmente considerando l'ambiente asincrono previsto dalle moderne applicazioni Web.

Vale a dire, la rigenerazione degli handle di sessione può causare l'autodistruzione della sessione in caso di richieste parallele. Inoltre, a meno che una richiesta blocchi la sessione per la sua durata, gli aggiornamenti di sessione su richieste parallele sono a rischio di conflitto e vengono sovrascritti dall'altro. Se bloccano la sessione, impone la serializzazione delle richieste.

Che cosa hai trovato per essere la risposta più efficace a questo problema?

Ci vivi e implementa soluzioni alternative? Alla fine sei migrato su una piattaforma diversa che non aveva questo difetto? O c'è una soluzione PHP a questo problema di cui non sono a conoscenza?

    
posta Brad Koch 13.06.2012 - 23:28
fonte

1 risposta

8

La soluzione semplice sarebbe chiamare session_start() appena prima di aver effettivamente bisogno di $_SESSION (e non all'inizio dello script) e session_write_close() subito dopo aver finito con esso. È un po 'imbarazzante, ma funziona abbastanza bene.

La soluzione non così semplice sarebbe scrivere un gestore di sessioni di backup del database personalizzato (si veda: SessionHandler per PHP 5.4), il blocco sintonizzato con precisione è un po 'più semplice con un database. Ad esempio per MySQL / InnoDB si potrebbe avere il blocco delle letture con " SELEZIONA ... PER UPDATE ". Se InnoDB suona troppo affamato di risorse per te, puoi cercare una memoria tabella, ma il blocco sarà un po 'più complicato.

Detto questo, quello che devi davvero chiedertelo è se stai facendo affidamento su $_SESSION un po 'troppo, specialmente sul sapore basato su file predefinito. Hai preso in considerazione Memcached ? Come backend di sessione e come meccanismo di persistenza alternativo.

Ci sono molte altre opzioni, forse più esotiche, attualmente sto esplorando il DynamoDB di Amazon come back-end di sessione. Ecco una breve descrizione delle sessioni sostenute da Dynamo , scritto dal nostro CTO, che non ha potuto resistere a chiamarmi:

Do not use session variables as a replacement for caching. For example, we have seen developers saving whole HTML blocks in the session array.

    
risposta data 14.06.2012 - 00:04
fonte

Leggi altre domande sui tag