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

Apache Discussion :

"autocommit" pour la mise à jour de la session


Sujet :

Apache

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut "autocommit" pour la mise à jour de la session
    Bonjour,

    J'ai actuellement un projet PHP pour lequel il me semble avoir un problème de configuration d'Apache.

    En local, j'ai développé une fonctionnalité de panier en session de la façon suivante :
    • J'ajoute des items de commande
    • Lorsque l'utilisateur clique sur "Commander", je sauvegarde la commande et enlève le panier de la session directement après


    En local, lorsque je clique plein de fois d'affilée sur le bouton "Commander", je n'ai bien qu'une seule commande qui s'enregistre en BDD.

    Lorsque je porte le projet sur le serveur de production, j'ai de multiples commandes en BDD.

    Mon hypothèse : en local, lorsque j'enlève le panier de la session, Apache "autocommite" le changement de session dans le fichier de session. Sur la prod, Apache met un certain temps pour "commiter" les changements dans le fichier de session, ce qui fait que lors du second clic, le fichier de session contient toujours le panier (et celui-ci sera donc à nouveau enregistré).

    Cependant, je n'arrive pas à trouver quel paramètre Apache gérerait éventuellement cette situation.

    Merci de votre aide !!

  2. #2
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    J'ai des doutes sur le notion de commit de la session côté apache (d'ailleurs c'est PHP qui gère les variables de session et pas Apache).
    Je pense plutôt que ton serveur local était toujours assez rapide pour que malgré le bourrinage du bouton tu ne te trouves jamais dans le cas où 2 validations de commandes soient passées tellement proches l'une de l'autre que 2 commandes validées passent avant le vidage de session...

    Pourquoi ne pas plutôt blinder le code en ajoutant par exemple un ID (unique et généré aléatoirement) à ton panier que tu ajoutes dans les propriétés de ta commande ou dans une table qui contiendrait la liste des paniers validés....

    Comme ça au moment de la validation d'un panier, tu vérifies que celui-ci n'a pas déjà été transformé en commande avant de continuer....
    Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

    Linus Torvalds

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    Bonjour,

    Merci pour ta réponse. A vrai dire, mon serveur local est généralement bien plus long à traiter les requêtes que le serveur de prod ; de plus, même lorsque je bourrine en local je n'arrive pas à obtenir ce problème, alors que sur le serveur de prod, je le reproduis systématiquement même sans bourriner.

    La solution que tu proposes est l'une des évolutions envisageables (avec celle de gérer un panier en BDD, avec une gestion de statut de commande). J'aurais souhaité me passer de ces évols et comprendre réellement le problème que j'avais.

  4. #4
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    Sur la prod, quand tu dis même sans bourriner, c'est à dire ? Genre 2 clics en 1 seconde ?

    Comment sont configurés php ainsi que le mpm apache sur tes 2 serveurs ?
    Si ça se trouve, ton serveur local de dev ne traite qu'une requête à la fois alors que la prod parrallélise.
    Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

    Linus Torvalds

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    Bonjour,

    Merci pour ta réponse.
    "Sans bourriner" : oui, par exemple 2 clics en une seconde.

    Je te poste les configs mpm trouvées dans les /etc/apache2/apache2.conf :

    En local :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    <IfModule mpm_prefork_module>
        StartServers          5
        MinSpareServers       5
        MaxSpareServers      10
        MaxClients          150
        MaxRequestsPerChild   0
    </IfModule>
     
    <IfModule mpm_worker_module>
        StartServers          2
        MinSpareThreads      25
        MaxSpareThreads      75
        ThreadLimit          64
        ThreadsPerChild      25
        MaxClients          150
        MaxRequestsPerChild   0
    </IfModule>
     
    <IfModule mpm_event_module>
        StartServers          2
        MinSpareThreads      25
        MaxSpareThreads      75
        ThreadLimit          64
        ThreadsPerChild      25
        MaxClients          150
        MaxRequestsPerChild   0
    </IfModule>
    Sur le serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <IfModule mpm_prefork_module>
        StartServers          5
        MinSpareServers       5
        MaxSpareServers      10
        MaxClients           50
        MaxRequestsPerChild   1000
    </IfModule>
     
    <IfModule mpm_worker_module>
        StartServers          2
        MaxClients           50
        MinSpareThreads      25
        MaxSpareThreads      75
        ThreadsPerChild      25
        MaxRequestsPerChild   1000
    </IfModule>
    Est-ce le paramètre MaxRequestsPerChild qui pose problème sur le serveur ?
    Ou bien peut-être l'absence du module mpm_event_module coté serveur ?

  6. #6
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    Dans tous les cas, je pense que le "problème" c'est plutôt sur ton PC de dev qui ne traîterait pas les requêtes en parrallèle (à valider ^^)...

    C'est un PC windows ? Si oui, c'est le mpm_winnt qui est utilisé....
    Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

    Linus Torvalds

  7. #7
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    Pour connaître quel mpm est chargé sur un serveur Unix, utilise la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    apachectl -t -D DUMP_MODULES
    Après on comparera les confs des mpm sur les 2 machines...
    Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

    Linus Torvalds

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    Les deux configs tournent sur du Unix.

    En local

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    Loaded Modules:
     core_module (static)
     log_config_module (static)
     logio_module (static)
     mpm_prefork_module (static)
     http_module (static)
     so_module (static)
     alias_module (shared)
     auth_basic_module (shared)
     authn_file_module (shared)
     authz_default_module (shared)
     authz_groupfile_module (shared)
     authz_host_module (shared)
     authz_user_module (shared)
     autoindex_module (shared)
     cgi_module (shared)
     deflate_module (shared)
     dir_module (shared)
     env_module (shared)
     mime_module (shared)
     negotiation_module (shared)
     php5_module (shared)
     reqtimeout_module (shared)
     rewrite_module (shared)
     setenvif_module (shared)
     status_module (shared)
    Syntax OK
    Sur le serveur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    Loaded Modules:
     core_module (static)
     log_config_module (static)
     logio_module (static)
     mpm_prefork_module (static)
     http_module (static)
     so_module (static)
     alias_module (shared)
     auth_basic_module (shared)
     authn_file_module (shared)
     authz_default_module (shared)
     authz_groupfile_module (shared)
     authz_host_module (shared)
     authz_user_module (shared)
     autoindex_module (shared)
     cgi_module (shared)
     deflate_module (shared)
     dir_module (shared)
     env_module (shared)
     expires_module (shared)
     fcgid_module (shared)
     headers_module (shared)
     mime_module (shared)
     negotiation_module (shared)
     php5_module (shared)
     reqtimeout_module (shared)
     rewrite_module (shared)
     rpaf_module (shared)
     setenvif_module (shared)
     status_module (shared)
    Syntax OK
    Pour simplifier, les modules que j'ai en local et qui ne sont pas présents sur le serveur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     expires_module (shared)
     fcgid_module (shared)
     headers_module (shared)
     rpaf_module (shared)

  9. #9
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    C'était surtout pour voir quel mpm était utilisé sur les 2 machines.
    C'est le mpm_prefork sur les 2.

    Du coup colle la conf module mpm_prefork du serveur sur ton poste local et vois si tu observes le même comportement.
    Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

    Linus Torvalds

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    Toujours même comportement.

    Tant pis, j'ai depuis ajouté une clé unique enregistrée en BDD. Chaque nouvelle commande qui tente d'être sauvée checke avant qu'aucune commande avec cette clé n'existe déjà.

    Cela contourne le problème, même si j'aurais souhaité connaitre la raison (pour de futurs dévs).

    Merci encore pour ton coup de main !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/12/2008, 11h36
  2. Réponses: 4
    Dernier message: 07/09/2006, 11h21
  3. Réponses: 4
    Dernier message: 02/05/2006, 12h08

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