Questione : Difficoltà con le dichiarazioni prescelte del gran volume

Ho scritto un alimentatore di sessione del PHP di abitudine che utilizza l'identificazione di sessione di difetto ma i depositi le informazioni di sessione in una base di dati di MySQL. Il luogo che fa funzionare il responsabile tratta approssimativamente gli ospiti 30k un il giorno, di cui ciascuno generano la sessione approssimativamente 5 scrivono e le occhiate nella successione molto veloce dovuto AJAX chiede. La stessa edizione ha presentato using l'assistente del ms SQL come piattaforma di immagazzinaggio. Il problema si presenta sulla sessione scrive. La funzione di scrittura in primo luogo prova ad individuare un'entrata attuale nella tabella di sessione con l'identificazione di sessione (usata come la chiave primaria) ed allora inserti o aggiornamenti l'annotazione di conseguenza. (1%-5% della sessione scrive) l'occhiata iniziale ritorna occasionalmente vuoto anche se la sessione non è nuova e ci è una fila nella base di dati allegata all'identificazione di sessione la logica quindi prova ad inserire un nuovo record, solo per funzionare afoul del vincolo di unicità di chiave primaria. Ciò causa il guasto inaccettabile. Il guasto è trattato relativamente con garbo, ma fornisce un'esperienza significativamente degradata dell'utente. Dopo che molti tentativi di risolvere il problema, io sono stati infruttuosi. La tabella sta usando InnoDB come motore e utf8_general_ci come serie di caratteri. Il fotoricettore app sta funzionando sulla struttura di Zend e sta usando la funzionalità di DB della struttura. Il problema ancora accade quando i collegamenti reglar di mysqli sono impiegati preferibilmente. Tutta la comprensione notevolmente sarebbe apprezzata. Il codice di Psuedo per la sessione scrive è fornito sotto. class= " lineNumbers " >
1 del >
function " del prettyprint " " del class= del id= " codeSnippet766935 del >
query (sql); // ritorna occasionalmente con 
                           il risultato nullo di // si è regolato anche se
                           l'annotazione di sessione di // esiste
    se (conteggio (file) > 0)
        updateRecord (identificazione, sessionData);
    altrimenti
        // allora prova ad inserire la fila duplicata
        insertNewRecord (identificazione, sessionData);
    ritorno;
class= > " libero " di 
class= del

Risposta : Difficoltà con le dichiarazioni prescelte del gran volume

1 - Nel trattarsi l'aggiornamento con le domande di SQL, verifica l'effetto di
INSERIRE IL *** SUL *** DELL'AGGIORNAMENTO DUPLICATA DI CHIAVE

Cf http://dev.mysql.com/doc/refman/5.0/fr/insert.html

2 - Poiché state trattando paralelamente $_SESSION e le copie di sql dei dati di sessione, potreste studiare la possibilità di immagazzinare l'identificazione di sql nei dati di $_SESSION
Quando state facendo il primo scrivete l'inserto?
$_SESSION è in alcuni casi aggiornato solo dopo che la pagina è lasciata…

3 - Sembra che realmente stiate giocando in una zona pericolosa dove la sincronizzazione precisa realmente non è garantita e dove dovreste quindi prevedere i lotti delle difficoltà.
Proverei a riconsiderare ed aggiornare i dati di sessione soltanto su alcuni eventi significativi, di modo che tutta la domanda nascosta di SQL ha avuta certo tempo di eseguire. Il vostro sistema allora sarebbe più robusto ed il carico sull'assistente inoltre cadrebbe significativamente.
O avere qualche $_SESSION tenere il timestamp di ultimo aggiornamento ed aggiornare solo dopo 2 secondi
Sure, non molto Ajax-come ma hey, questo dipende dal vostro assistente di SQL e dallo sforzo che lo mettete sopra. I microsecondi o persino gli aggiornamenti di centi-secondi o del milli- sono benissimo per Ajax, ma non per l'assistente di SQL
Altre soluzioni  
 
programming4us programming4us