2013-01-03 8 views
5

Gli utenti nel mio webgame stanno avendo alcune informazioni sui giocatori nella cache $ _SESSION di PHP. Ogni volta che caricano il gioco controlla se la sessione esiste, altrimenti ottengono le informazioni sul giocatore da un database MySQL e quindi vengono memorizzate nella $ _SESSION.Cos'è più veloce? File_exist o query MySQL?

Ora il mio problema è, che succede se le informazioni sul giocatore vengono aggiornate da un altro processo o giocatore? Non possono aggiornare la cache $ _SESSION dell'altro giocatore.

So che memcached è probabilmente la soluzione per questo, ma non sono sicuro se dovrei prendere il tempo per qualcosa di simile. $ _SESSION cache sta andando bene per me, tranne che per questo.

  • stavo pensando di creare una tabella MySQL per esso che viene letto ad ogni richiesta e se c'è un record per il giocatore che ricrea la cache.
  • Un'altra soluzione potrebbe essere quella di creare un file in una directory con l'ID del lettore nel nome del file. Ogni richiesta PHP verificherà con file_exist se dovrebbe cancellare la cache o meno.

Cosa vorresti fare? Viene eseguita ogni richiesta, quindi è molto importante ottenere questo ottimizzato.

+1

Andrà per l'opzione database, La velocità non ci sarà molta differenza con un buon schema di database. Ma non si tratta solo di velocità, ma anche di una migliore gestione –

+0

Se non si tratta di un caso estremamente eccezionale, si va sempre per un database. Nel mondo reale RMDB può essere più veloce del file flat (se i dati sono già stati caricati nella memoria o nella tabella completa adatta alla memoria disponibile.) – Dasun

risposta

3

Da un punto di vista del design, eviterei l'approccio file_exists e directory. Certo che 'file_exists' è veloce, ma non si ridimensionerà bene ... Cosa succede se un uso cambia nome?

Se si utilizza APC (e si dovrebbe) è possibile utilizzare la cache di memoria utente di APC. Finché ci si trova su un singolo server, questo dovrebbe offrire prestazioni simili come memcached senza la necessità di un processo separato per il server di memorizzazione nella cache della memoria. Se una voce utente cambia di frequente, potresti comunque incorrere in problemi di fragmemntation con APC. In tal caso, è il momento di mordere il proiettile e andare con memcached - è anche possibile memorizzare i dati della sessione in memcached per un incremento delle prestazioni.

Inoltre, né la soluzione APC o la vostra soluzione file_exist verrà scalata su più server con bilanciamento del carico - per questo è necessaria una soluzione DB o memcached.

+0

Dalla loro homepage: "Usa APC per le cache che non cambiano spesso", le informazioni sul giocatore in realtà cambia parecchio poiché contiene anche statistiche di gioco del giocatore. Sarebbe ancora utile? – Martin

+1

@Martin potresti incorrere in problemi di frammentazione con pesanti modifiche alla memorizzazione nella cache utente in APC.In tal caso, la soluzione migliore è Memcached. – Ray

+0

Grazie per il tuo commento. Potrei guardare in Memcached un po 'meglio. – Martin

1

Il modo in cui l'hai esposto, non riguarda la velocità con l'una rispetto all'altra, l'approccio SESSION non è valido a causa del tuo problema di concorrenza.

Se i dati possono essere modificati contemporaneamente, l'archiviazione dei dati deve essere in grado di gestire tale concorrenza e qualsiasi livello di memorizzazione nella cache che si desidera utilizzare deve comportarsi in base alla natura del problema.

1

Se si tratta solo di cache e non si desidera installare memcache (d), è possibile utilizzare una tabella mysql in memoria. Non è veloce come memcached, ma è comunque una soluzione eccellente. E assicurati di creare indici appropriati su tutte le tue tabelle (forse questa è la soluzione migliore, senza cache, basta selezionarla dalla tua tabella).

CREATE TABLE t (i INT) ENGINE = MEMORY;