2010-03-01 5 views
3

Alors, voici ma configuration de test:la gestion des sessions PHP lorsque le même client demande le même script plusieurs fois à la fois

session_start(); 
if(!isset($_SESSION['bahhhh'])) 
    $_SESSION['bahhhh'] = 0; 
$_SESSION['bahhhh']++; 
sleep(5); 
die('a'.$_SESSION['bahhhh']);

Ce que je pense arriver est que chaque fois que je frappe la page, il renvoie un nombre différent . Mais si j'utilise plusieurs onglets et que je les actualise chacun dans les 5 secondes qui suivent le premier, ils renvoient tous le même nombre. (Ce n'est pas la mise en cache côté client, car le délai de 5 secondes est toujours évident.)

Pourquoi le fait-il et comment résoudre ce problème? Il semble avoir le même problème étrange de mise en cache avec les données de fichier et de base de données, et m'empêche de construire un mutex qui fonctionne pour éviter d'exécuter le même code plus d'une fois à la fois.

Voici une autre, par exemple plus simple:

echo microtime(); 
sleep(10);

Exécuter ce 3 fois, chaque 2 secondes d'intervalle, et tous les trois le même rendement microseconde. WTF?

Répondre

6

Les données de session, par défaut, ne sont pas enregistrées tant que la requête n'est pas terminée. Donc, votre augmentation n'est pas enregistrée en dormant. Si vous voulez enregistrer prématurément la session session_write_close()

+0

Comme je l'ai dit, j'ai également utilisé des fichiers et des bases de données pour cette approche. Voici un autre script de test qui ne se comporte pas comme prévu: echo microtime(); sommeil (10); Si vous l'ouvrez dans plusieurs onglets, puis actualisez chacun dans les 10 secondes les uns des autres, jamais l'onglet prétendra qu'il a été appelé exactement la même microseconde (une impossibilité évidente). – VexedPanda

+0

Je ne comprends pas quel support de stockage pour faire avec votre problème. J'ai testé votre script dans 5 onglets, rafraîchissant chacun dans les 10 secondes les uns des autres et obtenu des résultats différents à chaque fois. Testé avec le dernier 5.2.x sur Ubuntu 9.10. –

0

Je voudrais que le script lui-même ajoute quelque chose à un fichier journal pour vérifier que le script est effectivement exécuté autant de fois que vous le pensez. Peut-être avez-vous quelque part un logiciel qui intercepte la requête et renvoie une réponse mise en cache.

Si ce n'était pas pour votre commentaire que cela arrive aussi avec microtime(), j'aurais donné une explication de la façon dont php gère la concurence avec les sessions, et quand ce n'est pas le cas.

+0

La difficulté d'écrire dans un fichier est que, comme des choses comme microtime() retournent le même résultat pour toutes les instances, je ne serais pas capable de différencier les trois écritures dans le fichier (puisqu'il finirait par être le même), ou un seul. Cela dit, l'erreur que nous rencontrons en production est qu'un script de maintenance s'exécute plus d'une fois et rencontre des conditions de concurrence avec lui-même, donc je suis sûr que les trois copies sont réellement exécutées. C'est pourquoi nous essayons de construire un mutex. – VexedPanda

0

Apparemment, c'est un bug dans mon navigateur lui-même. Opera se comporte de cette façon alors qu'Internet Explorer ne le fait pas. J'ai fait des tests initiaux dans IE avec les mêmes résultats mais avec un code plus complexe. Apparemment, ce code complexe avait une erreur qui a déclenché la mauvaise conduite dans IE, et ce code simplifié ne l'a pas. Désolé de déranger tout le monde.

Questions connexes