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 :

Synchronisation en php


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 46
    Points : 44
    Points
    44
    Par défaut Synchronisation en php
    Bonjour,

    Je suis actuellement en train de développer un site internet. J'ai mon fichier html dans lequel je charge un fichier javascript.
    Lorsque je clique sur un bouton sur ma page, le javascript envoie les données d'un formulaire à un script php qui est chargé de faire plusieurs choses avec.
    J'aimerais que, si le script php n'est pas déjà exécuté par quelqu'un d'autre, celui-ci puisse se lancer immédiatement. Mais s'il est déjà exécuté par quelqu'un d'autre, j'aimerais que le script attende avant de s'exécuter.
    J'ai donc pensé le faire avec un sémaphore, mais ce n'est pas la bonne idée car il est utilisé dans un même processus PHP et rien n'empêche un autre processus de se lancer pour exécuter à nouveau le script.
    Auriez vous une idée pour résoudre mon problème ?

    Cordialement

  2. #2
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 793
    Points : 3 063
    Points
    3 063
    Par défaut
    Bonjour

    Je suis curieux : qu'est-ce qui fait que tu doives programmer cela ? Une page web est prévue pour être multi-utilisateurs et du côté serveur, logiquement, chaque exécution d'un script PHP devrait être isolé (le script exécuté par l'utilisateur A ne devrait pas impacter l'exécution du même script par l'utilisateur B). Je me demande donc pourquoi tu as ce besoin qui aura un impact immédiat sur la vitesse de ton application : tous les utilisateurs seront bloqués tant que le script de l'utilisateur A n'est pas terminé. Ensuite, comment vois-tu la chose ? Les autres utilisateurs vont devoir reposter le formulaire et le premier qui passe bloque les autres ???

    Si j'avais ton besoin, ce que je ferais, c'est de créer un fichier sur mon site, p.ex. "/tmp/is_running". A l'exécution de mon script je vérifierai la présence du fichier. S'il est là, je ferais un die('Sorry already busy'). A la fin de l'exécution du script, je ferais un unlink('/tmp/is_running'). Mais tu l'auras compris, à priori, je ne ferais pas du tout cela parce que l'impact sur mon application sera désastreux en terme de concurrence et de rapidité d'exécution.

    Bonne soirée.

  3. #3
    Membre régulier
    Homme Profil pro
    Expert Middleware
    Inscrit en
    Septembre 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Expert Middleware

    Informations forums :
    Inscription : Septembre 2006
    Messages : 75
    Points : 100
    Points
    100
    Par défaut
    Bonjour,

    effectivement avec un tel système j'espère qu'il n'y aura pas beaucoup d'utilisateur sinon ton système ne tiendra pas longtemps.

    Je serais également curieux de savoir quel est la raison qui te pousse a faire ça. Par contre, pour résoudre ton problème, tu peux soit passer par des fichiers que tu traites de manière asynchrone ou encore mieux par files de message comme activeMQ ou rabbitMQ.

    Syberi@

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 46
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    En fait j'ai une page web sur laquelle il y a une zone. Les utilisateurs peuvent déposer un carré dans cette zone. Une fois le carré placé à l'endroit désirer, l'utilisateur valide le formulaire. Une requête est envoyée en Ajax au serveur pour sauvegarder les coordonnées du carré dans la base de donnée.
    Cependant, les coordonnées du carré sont sauvegardées seulement s'il n'y a pas déjà un carré qui est placé au même endroit que le carré de l'utilisateur.
    (Il y a une vérification des coordonnées des carrés avant sauvegarde des coordonnées du nouveau carré)
    Mais cela pose un problème quand 2 formulaires sont envoyés en même temps => il y a empiétement entre les 2 carrés.
    C'est ce problème d’empiétement que j'aimerais supprimer.

    Je ne sais pas trop comment gérer ce problème. Auriez vous une idée ?

    Cordialement

  5. #5
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 793
    Points : 3 063
    Points
    3 063
    Par défaut
    Bonsoir

    La première chose qui me vient à l'esprit : avant de lancer la sauvegarde, tu fais d'abord une requête Ajax "Est-ce que quelqu'un a déjà sauvé le carré ?"

    Si la réponse est Non, la requête Ajax va retourner un "Super, vous pouvez sauvegarder"
    Si la réponse est Oui, la requête Ajax se termine avec un "Oups, désolé, quelqu'un vous a devancé".

    A dire vrai, si le contrôle retourne Non (personne n'a encore sauvé); du coup, tu peux même sauver dans le même temps.

    Tu as donc

    1. une requête Ajax pour la sauvegarde
    2. un contrôle php; côté serveur donc, qui vérifie d'abord si la sauvegarde peut être faite
    3. la réponse de la requête ajax qui sera "Super" ou "Oups".

    Est-ce que cela te parle ? J'ai l'impression que cela répond à ton besoin; du moins de ce que j'en ai compris.

    Bonne soirée.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 46
    Points : 44
    Points
    44
    Par défaut
    Bonsoir,
    Oui cela me parle très bien car c'est exactement ce que j'ai fait. Cependant, si je lance mes 2 formulaires en même temps, les 2 carrés arrivent à être sauvegardés quand même.
    Auriez vous une autre idée ?

  7. #7
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 793
    Points : 3 063
    Points
    3 063
    Par défaut
    Bonjour

    Cela me paraît plutôt extraordinaire car les requêtes base de données sont supposées ultra-rapide. Il faudrait vraiment une chance inouïe pour que ton contrôle "est-ce que ..." du premier utilisateur se fasse quasi au même moment que cela du deuxième utilisateur.

    Maintenant, tu pourrais jeter un oeil du côté de la notion de LOCK de mysql (http://www.mysqltutorial.org/mysql-table-locking/) qui permettrait de bloquer la table le table d'une action.

    Donc, l'idée : si la table n'est pas lockée, tu es donc le premier. Tu bloques la table et tu vérifies s'il y a déjà un record. Si pas; tu l'insères et tu libères la table.

    Si dans le même temps un autre utilisateur vient; la table aura été bloquée et il ne sera pas possible de faire le contrôle / l'écriture.

    Comme je le mentionne dans ma première phrase; excepté si tu as des millions d'utilisateurs; le risque d'avoir deux personnes qui postent au même instant (milliseconde) est quand même réduit AMHA.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    bonjour,

    Pour être certain qu'aucun autre internaute n'insère les mêmes coordonnées à l'instant t, il est également possible de lancer une requête INSERT SELECT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    $sql="
    INSERT INTO carre ( x1, y1, x2, y2 )
    SELECT * FROM (SELECT 2, 3, 6, 1) AS  coords
    FROM `carre`
    WHERE NOT EXISTS (
        SELECT id FROM  carre
            WHERE x1 = 2 AND y1 = 3
            AND x2 = 6 AND y1 = 1
    );
    ";
    Les coordonnées (2,3) et (6,1) sont insérées que si elles n'existent pas dans la table carre.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 46
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Merci beaucoup pour vos réponses rapides.
    Je pense que je vais m'orienter du côté de LOCK de mysql car cela répond au mieux à ce que je recherche.
    Je me suis donc documenté dessus.
    Voici mon bout de code php qui me permet de vérifier et d'insérer le carré dans ma base de donnée, en enregistrant une transaction et en faisant un blocage de table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
    	$bdd->beginTransaction();   
    	$bdd->exec('LOCK TABLES carres WRITE');
            VerificationPlaceLibre();
            enregistrementCarre();
    	$bdd->exec("UNLOCK TABLES");
            $bdd->commit();
    ?>
    Voilà en gros le déroulement du programme.
    Cependant, en faisant des recherches sur LOCK et UNLOCK de mysql, je me pose certaines questions : (Mes tables sont en INNODB et j'utilise PDO)
    - Sur un site d'aide à la programmation bien connu, j'ai lu ceci : "Pour utiliser à la fois les transactions et les verrous de table, il faut renoncer à démarrer explicitement les transactions, et donc utiliser le mode non-autocommit. Lorsque l'on est dans ce mode, il est facile de contourner la validation implicite provoquée par LOCK TABLES et UNLOCK TABLES : il suffit d'appeler LOCK TABLES avant toute modification de données, et de commiter/annuler les modifications avant d'exécuter UNLOCK TABLES."
    Je me demande donc, est ce que c'est bien de faire beginTransaction pour supprimer l'auto-commit et pouvoir utiliser la transaction et en même temps le LOCK ? Ou faut-il que je fasse : $bdd->setAttribute(PDO::ATTR_AUTOCOMMIT,0) à la place de (beginTransaction) ?

    De plus, je ne comprend pas très bien dans quel ordre il faudrait que j'écrive les lignes afin de satisfaire mes besoins (transactions et LOCK) ?
    Comment vérifier que $bdd->exec('LOCK TABLES carres WRITE') s'est bien passée ?
    Si une erreur survient en cours de programme, est ce que la table est bloquée à jamais ou est ce qu'elle se débloque à la fin du script ?

    Cordialement

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    pour éviter tout risque de collision, le plus simple et le plus performant c'est de passer par une procédure stockée. Comme le principe ACID est respecté, tu seras absolument certain de n'avoir aucun empiétement de carrés au moment de l'enregistrement.

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 46
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Merci beaucoup pour votre réponse.
    je vais me pencher de ce côté là.
    Et sinon, juste pour ma culture, pourriez vous répondre à mes questions du post d'avant s'il vous plait ?

    Cordialement

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/06/2008, 22h02
  2. [MySQL] Synchronisation entre Outlook et agenda PHP / MySQL
    Par joss91 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/06/2008, 14h31
  3. [MySQL] Synchroniser php et MySQL sans rafraichissement de la page
    Par Khleo dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 16/01/2008, 08h10
  4. [MySQL] Synchronisation de base de données MySQL en PHP
    Par takepaf dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/07/2007, 11h23
  5. Synchronisation en PHP
    Par LordBob dans le forum Langage
    Réponses: 6
    Dernier message: 14/12/2005, 11h59

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