IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Probleme d'exécution que je ne comprends pas.


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 198
    Par défaut Probleme d'exécution que je ne comprends pas.
    Bonjour à tous,

    Je suis confronté à un problème d'exécution que je ne comprends pas.

    L'explication n'est pas très simple, je vais essayer d'être le plus clair possible.

    Je programme un jeu en php, dans ce jeu, tous les évènements (construction, attaque, commerce, etc etc ...) sont traités par le même script, que j'appelle evenement.php.

    Dans ce script evenement.php, je traite les evenements de cette facon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(event=="construction")
    { .. gestion de la construction 
       delete evenement }
    if(event=="bataille")
    { .. gestion de la bataille 
       delete evenement }
    Chaque évènement à un Id, jusque là, tout va bien.

    Mon probleme, c'est qu'environ 1 fois par mois (très aléatoire...), il commence à me traiter un if(event=="bataille") {.. blabla... delete}, et avant qu'il soit fini, donc avant le delete il recommence à me traiter le même evenement.

    Une explication plus précise

    if(event=="bataille) (je l'appelle thread 1)
    { ... il commence les calculs (thread 1)
    ... il continu (thread1)
    // tout d'un coup, il met en pause le thread 1
    if(event==bataille) (il retraite le meme evenement sur un thread 2)
    {... il recommence les calculs (thread 2)
    ... blablabla tout va bien (thread 2)
    ... delete evenements (thread 2)}
    ... blabla tout va bien (thread 1)
    ... je fini tranquille le thread 1)
    ... delete evenement (thread 2) }

    En résumé, il commence à traité un evenement (thread1), et avant que cette evenement ne soit détruit par la fin du script, il met en "pause" le thread 1, lance un thread 2 qui trouve la même tache à faire, l'execute, delete l'evenement, REPREND le thread 1 qui était en pause, et le fini normalement.

    Je suis complètement largué ...

    Pour ceux qui se demandent comment j'ai trouvé ca, j'ai écrit une fonction de journalisation dans un fichier ascii, qui retrace à l'aide d'une valeur aleatoire alphanumerique quel "thread" effectue les operations.

    Une petite copie de ce que j'ai enregistré :

    #################### (TF1454)
    Debut Bataille Id:5533942 (TF1454)
    Attaquant Gagne!!(TF1454)
    ####################(KM5048)
    Debut Bataille Id:5533942 (KM5048)
    Erreur de traitement operation 5533942, operation déjà traitée (KM5048);
    ********************(KM5048);
    Les troupes ne sont pas encore rentrees(TF1454)
    Fin des troupes qui ne sont pas encore rentrees(TF1454)
    Fin Victoire attaquant!!(TF1454)
    ********************(TF1454)

    Quelques commentaires pour que vous compreniez
    La valeur entre parenthèse (TF1454) représente le "thread 1" (désolé, je ne sais pas comment l'appeler), et le (KM5048) le "thread 2".

    Sachant que le php est monothread, comment est-ce que ca peut arriver ?

    Est-il possible que 2 joueurs lancent le même script en même temps, et que du coup l'évenement soit traité 2 fois ? (je croyais avoir compris que non ?)

    Sur le coup, avant de journaliser les opérations, je croyais qu'il s'agissait d'un timeout ou autre à un moment dans le script, qu'il ne finissait pas, et que du coup, il relancait le traitement de l'evenement, mais non, le journal ascii indique clairement le numéro du thread (ou numéro d'exécution comme vous voulez), et on voit bien en fait que les 2 operations sont commencées en même temps.

    chaque ###### marque le DEBUT du if(even)
    chaque ****** marque la FIN du if(event)

    Vu que là je ne comprends pas comment ca peut arriver, quelqu'un pourrait m'éclairer svp ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 198
    Par défaut
    Quelqu'un sait comment fonctionnement précisément le mode d'exécution de php ?

    Si un utilisateur que j'appelle inter1 est en train de consulter une page, donc un script, un autre utilisateur (inter2) peut-il exécuter le même script même si inter1 n'a pas encore fini le script ??? (ce qui expliquerait mon problème?)

    Dans ce cas, peut-on générer une file d'attente, de telle manière à ce que le script ne soit pas exécuté 2 fois en même temps ?

    Quelqu'un sait comment ca fonctionne exactement ?

Discussions similaires

  1. Probleme que je ne comprend pas
    Par NLS le pingouin dans le forum Composants
    Réponses: 3
    Dernier message: 23/12/2009, 10h04
  2. [Débutant] Message d'erreur que je ne comprends pas
    Par Le Furet dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2006, 17h37
  3. [PostGreSQL] une erreur que je ne comprends pas
    Par flo78 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/02/2006, 10h18
  4. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  5. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo