Question : Ennui avec des rapports choisis de grand volume

J'ai écrit un traiteur de session de PHP de coutume qui emploie l'identification de session de défaut mais des magasins l'information de session dans une base de données de MySQL. L'emplacement courant le directeur manipule rudement les visiteurs 30k par jour, qui produisent de la session approximativement 5 écrivent et les consultations dans la succession très rapide due à AJAX demande. La même issue a surgi using le serveur de la milliseconde SQL comme plate-forme de stockage. Le problème se pose sur la session écrit. La fonction d'inscription essaye d'abord de localiser une entrée existante dans la table de session avec l'identification de session (utilisée comme la clé primaire) et puis des insertions ou des mises à jour le disque en conséquence. De temps en temps (1%-5% de la session écrit) la consultation initiale revient vide quoique la session ne soit pas nouvelle, et il y a une rangée dans la base de données attachée à l'identification de session la logique puis essaye d'insérer un nouveau record, seulement pour courir afoul de la contrainte d'unicité de clé primaire. Ceci cause l'échec inacceptable. L'échec est manipulé relativement avec élégance, mais fournit une expérience sensiblement dégradée d'utilisateur. Après que beaucoup de tentatives de résoudre le problème, j'aient été non réussies. La table emploie InnoDB comme moteur et utf8_general_ci comme jeu de caractères. Le Web $$etAPP fonctionne sur le cadre de Zend et emploie la fonctionnalité du DB du cadre. Le problème se pose toujours quand des raccordements reglar de mysqli sont utilisés à la place. N'importe quelle perspicacité serait considérablement appréciée. Le code de Psuedo pour la session écrivent est fourni ci-dessous. class= " lineNumbers " >
1 de >
function de " prettyprint " de class= de l'id= " codeSnippet766935 " de >
query (SQL) ; // revient de temps en temps avec 
                           le résultat nul de // a placé quoique
                           le disque de session de // existe
    si (compte (rangées) > 0)
        updateRecord (identification, sessionData) ;
    autrement
        // essaye alors d'insérer la rangée double
        insertNewRecord (identification, sessionData) ;
    retour ;
class= > " clair " de 
class= de

Réponse : Ennui avec des rapports choisis de grand volume

1 - En se manipulant la mise à jour avec des questions de SQL, examinent l'impact de
INSÉRER LE *** SUR LE *** DE MISE À JOUR DE VALEUR DE CLÉ IDENTIQUE

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

2 - Puisque vous manipulez dans les copies parallèles de $_SESSION et de SQL des données de session, vous pourriez envisager de stocker l'identification de SQL dans les données de $_SESSION
Quand faites-vous le premier écrivez-vous l'insertion ?
Dans certains cas $_SESSION est mis à jour seulement après que la page est laissée…

3 - Il semble que vous jouez vraiment dans un secteur dangereux où la synchronisation précise n'est pas vraiment garantie et où vous devriez donc s'attendre à des un bon nombre d'ennuis.
J'essayerais de reconsidérer et mettre à jour des données de session seulement sur quelques événements significatifs, de sorte que n'importe quelle question cachée de SQL ait eu un certain temps pour s'exécuter. Votre système serait alors plus robuste, et la charge sur le serveur chuterait également de manière significative.
Ou avoir un certain $_SESSION tenir l'horodateur de la dernière mise à jour et le mettre à jour seulement après 2 secondes
Sure, pas très Ajax-comme mais hé, ceci dépend de votre serveur de SQL et de l'effort que vous le mettez dessus. Les micro-secondes ou même les mises à jour de milli- ou de centi-secondes sont très bien pour Ajax, mais pas pour le serveur de SQL
Autres solutions  
  •  MS Excel 2007 et pdf - l'exportation vers le pdf prend de longues heures !
  •  Dans le Perl, comment j'ajoute une valeur à la liste, puis le contrôle pour voir si la valeur existent avant d'ajouter une nouvelle valeur
  •  Comment fais j'initialiser de la HP BL460c G6 de san et de la HP XP 240000
  •  Comment fais j'employer une clef de permis de volume sur un ordinateur de HP avec du CD de restauration
  •  Emplacement primaire de deux SCCM dans l'annuaire actif
  •  L'initiateur et la HP D2D de l'iSCSI R2 du serveur 2008 de Windows GERCENT l'issue
  •  Stocker le dossier dans le mysql using connector.net et le champ de goutte
  •  Carte vidéo d'USB - bit 32 sur le matériel travaillant au niveau du bit 64 ?
  •  asp.net que j'essaye de convertir une forme de HTML en forme d'aspx ou ? ce qui jamais. Aide du besoin sur la façon dont à à elle.
  •  Winzip 12 issues de secours du travail ?
  •  
    programming4us programming4us