2010-11-01 6 views
0

J'ai un problème vraiment bizarre avec les variables de session PHP. Basé sur l'ID de session, il semble qu'il y aurait des variables doubles à l'intérieur de la même session, ce qui naturellement ne peut pas être possible.PHP: tableaux de variables de session outsync ou concurrentes dans la session

Le problème est que la variable de session 'quote' devrait rester la même lorsque le formulaire dans la page est soumis, ce qui recharge la page elle-même. La variable $ _SESSION ['quote'] n'est définie que si elle n'est pas définie, ce qui se passe dans les deux premiers rechargements comme cela peut être vu dans les logs ci-dessous.

Code de débogage:

echo "\n Current session id: ".session_id(); 
    echo "\n _SESSION['quote']: ".$_SESSION['quote']; 
    $_SESSION['counter'] = isset($_SESSION['counter'])? $_SESSION['counter'] +1 : 0; 
    echo "\n _SESSION['counter']: ".$_SESSION['counter']; 

Output when page is reloaded(form submitted): 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: ; 
$_SESSION['counter']: 0; 
set _SESSION['quote']: 984; 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: ; 
$_SESSION['counter']: 0; 
set _SESSION['quote']: 985; 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: 985; 
$_SESSION['counter']: 1; 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: 985; 
$_SESSION['counter']: 2; 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: 984; 
$_SESSION['counter']: 1; 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: 985; 
$_SESSION['counter']: 3; 

Current session id: r5i15u4s9e20ud4j6jke8ln376; 
$_SESSION['quote']: 984; 
$_SESSION['counter']: 2; 

Ce problème se produit avec Firefox et IE. Un conseil ou un conseil serait très apprécié. Merci d'avance.

--- EDIT --- Ajouté écho sérialisation ($ _ SESSION); comme proposé.

<?php session_start(); 
echo "\nSerialized data at begin of page: "; 
echo serialize($_SESSION); 

echo "\n Current session id: ".session_id(); 
echo "\n _SESSION['quote']: ".$_SESSION['quote']; 
$_SESSION['counter'] = isset($_SESSION['counter'])? $_SESSION['counter'] +1 : 0; 
echo "\n _SESSION['counter']: ".$_SESSION['counter']; 

SORTIE:

Initial loading of page: 
    Serialized data at begin of page: a:0:{} 
    Current session id: vbbpohof2jo757eaj5jrp4dv02 
    $_SESSION['quote']: 
    $_SESSION['counter']: 0 
    ... 
    Serialized data at end of page: a:1:{s:7:"counter";i:0;} 


Page 1. reload by form submit: 
    Serialized data at begin of page: a:0:{} 
    Current session id: vbbpohof2jo757eaj5jrp4dv02 
    $_SESSION['quote']: 
    $_SESSION['counter']: 0 
    ... 
    Serialized data at end of page: a:3:{s:7:"counter";i:0;s:8:"quote";i:1023;s:9:"quotedate";s:10:"2010-11-18";} 


Page 2. reload by form submit: 
    Serialized data at begin of page: a:1:{s:7:"counter";i:0;} 
    Current session id: vbbpohof2jo757eaj5jrp4dv02 
    $_SESSION['quote']: 
    $_SESSION['counter']: 1 
    ... 
    Serialized data at end of page: a:3:{s:7:"counter";i:1;s:8:"quote";i:1024;s:9:"quotedate";s:10:"2010-11-18";} 


Page 3. reload by form submit: 
    Serialized data at begin of page: a:3:{s:7:"counter";i:0;s:8:"quote";i:1023;s:9:"quotedate";s:10:"2010-11-18";} 
    Current session id: vbbpohof2jo757eaj5jrp4dv02 
    $_SESSION['quote']: 1023 
    $_SESSION['counter']: 1 
    ... 
    Serialized data at end of page: a:3:{s:7:"counter";i:1;s:8:"quote";i:1023;s:9:"quotedate";s:10:"2010-11-18";} 

Page 4. reload by form submit: 
    Serialized data at begin of page: a:3:{s:7:"counter";i:1;s:8:"quote";i:1024;s:9:"quotedate";s:10:"2010-11-18";} 
    Current session id: vbbpohof2jo757eaj5jrp4dv02 
    $_SESSION['quote']: 1024 
    $_SESSION['counter']: 2 
    ... 
    Serialized data at end of page: a:3:{s:7:"counter";i:2;s:8:"quote";i:1024;s:9:"quotedate";s:10:"2010-11-18";} 

Page 5. reload by form submit: 
    Serialized data at begin of page: a:3:{s:7:"counter";i:1;s:8:"quote";i:1023;s:9:"quotedate";s:10:"2010-11-18";} 
    Current session id: vbbpohof2jo757eaj5jrp4dv02 
    $_SESSION['quote']: 1023 
    $_SESSION['counter']: 2 
    ... 
    Serialized data at end of page: a:3:{s:7:"counter";i:2;s:8:"quote";i:1023;s:9:"quotedate";s:10:"2010-11-18";} 

J'espère que cela démontre mon problème mieux que pas claire description originale. Désolé. Cette fois, les tableaux de variables de session «deux simultanés», s'ils le peuvent, semblent être actifs les uns après les autres. Parfois, d'autres est quelques fois actifs et puis un autre ...

--- EDIT ---

+1

Ceci est concordant. Fournir plus de détails. La sortie ne semble pas être celle qui devrait être reçue à partir de votre code de débogage. Double vérifier. –

+0

Ouais, et d'où vient «quote»? Pourquoi est-il augmenté? –

+0

La sortie est exactement ce qui sort, seulement le ';' ajouté par moi comme sans que tout est allé à une ligne dans mon poste et la journalisation 'set _SESSION' n'a pas été inclus car c'est la dernière dans la page. Ce n'est pas relavant, le journal montre bien le problème. @Pekka: 'quote' est défini si $ _SESSION ['quote'] n'est pas défini et est supposé être incrémenté dans ce cas. Le problème est qu'il ne devrait pas être incrémenté car il est déjà défini sur cette session. – Laowai

Répondre

0

J'ai créé script simple pour simuler le problème où je largue les variables de session dans le début et la fin de la page. La page a un seul bouton qui va rafraîchir la page et au début de la page est le compteur qui est stocké dans les variables de session. En appuyant sur le bouton, tout fonctionne bien mais si vous attendez> 10s alors les variables de session sont vides (variable du compteur) et après cela, en appuyant sur le bouton, soit le compteur original, soit le compteur de variables de la session simultanée est incrémenté.

J'ai également isolé le problème dans le serveur où le site Web problématique original est hébergé. Le problème ne peut pas être reproduit dans localhost ni dans un autre serveur que j'ai testé. Donc la conclusion est qu'une configuration dans le serveur est fausse ou qu'il y a un bogue dans PHP 5.2.9 ou un autre composant.

Merci à tous pour vos commentaires.

0

Tous wierd, où est "mis _SESSION" vient? Est-ce que le script agit à la fois sur le post et sur le get?

assurez-vous qu'il atteint la fonction session_start() sur les deux méthodes.

+0

Le journal "set_SESSION" n'était pas inclus dans ma description et il est exécuté au cas où le $ _SESSION ['quote'] n'est pas défini, ce qui est le cas initial. Le truc bizarre est qu'il est exécuté deux fois et comme vous pouvez le voir depuis le 'compteur', tout semble être réglé deux fois mais avec des valeurs différentes. Oui, le script possède à la fois les fonctionnalités 'POST' et 'GET', bien qu'aucune ne soit liée à la variable de session 'quote'. 'session_start()' est la première ligne du fichier source. – Laowai

+0

S'il vous plaît ne pas trop se concentrer sur le journal est correspondant au code fourni ou ce qui est «devis» si vous sentez que ceux-ci sont confus ou quelque chose serait manquant. Au lieu de cela pouvez-vous expliquer comment la variable 'counter' peut avoir de telles valeurs dans la même session? Il n'est pas utilisé ou modifié ailleurs que dans le code fourni ... – Laowai

+0

Il est difficile de localiser le bogue (?), Et l'écart entre le journal et le code le rend encore plus difficile. Cependant, je vous suggère de mettre >> echo serialize ($ _ SESSION) en haut et à la fin de votre script pour mieux suivre l'exec. Caps erreur? Voir la source? (chrome recharge page ..) – Teson

0

Laowai, heureux de vous aider,

Tout d'abord, votre code contient des erreurs:

isset($_SESSION['counter']) ? $_SESSION['counter'] +1 : 0; 

devrait être

isset($_SESSION['counter']) ? $_SESSION['counter']++ : $_SESSION['counter'] = 0; 

En second lieu, si vous avez encore la production-server-erreurs, vérification access-log pour traquer toutes les demandes involontaires (de jQuery ou autre) en désordonnant votre contrôleur (?) - demandes. Troisièmement, je vous suggère de lire vos données $ _SESSION une fois en haut et de les copier en $ var, et à la fin du script, de réécrire $ _SESSION. $ _SESSION sont le plus souvent des fichiers, et des choses étranges peuvent arriver sur des serveurs à forte charge.

$sesscopy = $_SESSION; 
//do everything... 
//now done... 
$_SESSION = $sesscopy; 

concernant, /t eriksson