Requêtes simultanées

Eléphant du PHP | 99 Messages

04 juil. 2008, 19:20

Bonjour,
Ce n'est pas une question de technique mais plutôt une question à propos du fonctionnement de php.
Je développe un jeu en ligne en php, et j'aurais voulu savoir ce qui allait se passer si un même utilisateur chargait deux fois la page en appuyant très vite sur F5.

En fait, j'ai une page qui gère les combats avec cette règle: un seul joueur peut agir à la fois.

Dans l'ordre, le moteur de combat agit ainsi:
- Il vérifie que le joueur est actif (dans une base MySQL répertoriant les combats)
- Il déserialize un fichier contenant l'objet Combat
- Il effectue l'action
- Il reserialize l'objet
- Il effectue une requête MySQL pour changer le joueur actif

En supposant qu'on ait une requête A et une requête B, j'ai peur que PHP ne traite la B avant que A n'ait eu le temps de changer le joueur actif...est-ce qu'il existe des risques de ce genre?
Désolé si je ne suis pas très explicite... :?

Marchi d'avance!

Mammouth du PHP | 1668 Messages

04 juil. 2008, 21:04

Moi je vois une solution, lorsqu'un visiteur charge ta page, tu vérifie si le joueur A à joué, si non tu n'accepte pas la requête, je ferait également patienté de script durant 1s pour éviter les coups douteux...
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

ViPHP
ViPHP | 4674 Messages

04 juil. 2008, 23:14

Hey :),

En fait, PHP va envoyer les données aux navigateurs une fois la page chargée et exécutée totalement. Il ne va pas envoyer une partie, continuer les calculs, et envoyer une nouvelle partie, etc. Ce qui est long dans le chargement d'une page, c'est l'envoie des données et le nombre de connexion. Si on a plusieurs fichiers CSS ou Javascript par exemple, on aura une connexion par fichier (s'il est externe à la page). C'est pour ça que l'on préfère utiliser des concaténations. Une fois en cache, on gagne beaucoup de temps. Pareil pour les images : chaque image est une nouvelle connexion, donc ça prend du temps. Mais PHP traite toute la page, envoie le résultat final, et après, c'est le navigateur qui se débrouille.
Si on veut envoyer seulement une partie d'une page au navigateur, puis que PHP continue les traitements, renvoie une nouvelle partie, etc., on peut utiliser les tampons de sortie. Mais par défaut, il envoie tout une fois que c'est terminé.

Donc si tu fais une vérification du genre : est-ce que c'est bien à ce joueur de jouer (ton premier tiret dans la liste des actions que tu as donné), alors il n'y a pas de problème.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 5924 Messages

05 juil. 2008, 01:42

Tu n'as pas bien compris le problème HyWaN, ce n'est pas de l'affichage le problème, c'est du traitement.

Pour faire ce que tu veux, tu peux essayer de te tourner vers LOCK TABLE pour verrouiller les tables utilisées avant la requète et UNLOCK TABLE à la fin pour libérer les tables, ainsi tu es sûr qu'une exécution parallèle ne pourra pas corrompre ton système, le script bloquera à l'exécution de la requète...