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 :

Accès concurrent à une page php


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
    Octobre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 96
    Par défaut Accès concurrent à une page php
    Bonjour,

    Je suis en train réaliser une application web en php dans laquelle la saisie de texte (stocké en BDD) peut se faire de manière collaborative.

    Par contre il ne doit pas être possible de travailler sur le même texte (plus généralement la même ressource) en même temps. En clair lorsqu'un utilisateur veut accéder à une ressource en cours d'utilisation (et donc verrouillée) le système doit lui renvoyer un message d'erreur.

    Dans l'idéal le système doit être en mesure d'indiquer à l'utilisateur lorsque la ressource est libre.

    J'utilise le framework php Zend qui possède peut-être des classes en relation.

    Je n'ai rien trouvé de pertinent sur Internet.

  2. #2
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonsoir,

    Dans votre structure de base de données vous pouvez valoriser un champ "is_available" qui définit si le champ peut-être édité ou non.

    Par exemple avec la structure suivante cela donnerait :

    DocumentTypes(id,nom,date_ajout)
    Fields(id,nom,datatype,is_available,value,document_type_id)

    Ensuite pour savoir si un champ peut-être édité :
    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
     
    class Field {
        private $_isAvailable, $_documenType, $_id, $_value;
     
        public function id(){
            return $this->_id;
        }
     
        public function value(){
            return $this->value;
        }
     
        public function documentType(){
            return $this->_document_type;
        }
     
        public function isAvailable(){
            return $_available;
        }
     
        static function loadFromDb($field_id){
            $field_row= mysql_fetch_array(mysql_query('SELECT * FROM Fields WHERE id='.$field_id));
            $field = new Field();
            $field->setDocumentType(DocumentType.loadFromDb($field_row['document_type_id']));
            $field->setAvailablity($field_row['is_available']);
            // etc..
            return $field;
        }
    }
    Ensuite lorsque vous listez les champs d'une table (un type de document) vous pouvez faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // $_GET['document_type_id'] = 20;
    $documentType = DocumentType.loadFromDb($_GET['document_type_id']);
    foreach($documentType->fields as $field){
        $is_available_attr = ($field->isAvailable()) ? '' : 'readonly="readonly"' ;
        echo '<input type="textbox" name="'.$field->id.'" value="'.$field->value.'" '.$is_available_attr.'/>';
    }
    Tu peux mettre à jour le champ is_available sur le onblur (perte de focus) d'un champ par exemple et mettre à jour la valeur du champ, afin de permettre à d'autres éditeurs de changer sa valeur. Pour l'effet inverse, c'est à dire reprendre la main sur un champ lorsque celui-ci se libère, tu peux faire une fonction de callBack avec AJAX qui aura pour but de vérifier le champ is_available du field en question et de rendre ce champ enabled si besoin.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 96
    Par défaut
    Merci pour vos réponses.

    J'ai pensé aussi utiliser un champ de la base de données pour indiquer si la ressource est disponible ou non. Je vais étudier vos solution.

    Le risque majeur est que l'utilisateur prenne une ressource et change son état à non disponible temporairement. Puis ne se déconnecte pas correctement (avec le bouton fermer du navigateur par exemple) et bloque la ressource à non disponible.

  4. #4
    Membre chevronné Avatar de deY!
    Inscrit en
    Avril 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2006
    Messages : 403
    Par défaut
    A partir du moment où il valide la ressource, le marqueur change.
    Cependant le risque de crash du navigateur est là, tu peux très bien faire une double vérification. Le première sur le marqueur et la seconde sur l'utilisateur en vérifiant s'il est toujours en ligne ou non...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 96
    Par défaut
    Si mes souvenirs sont bons, il n'est pas possible de savoir exactement si l'utilisateur est toujours en ligne (problématique du compteur de visiteurs en ligne) mais il est possible de définir un timeout pour décrémenter le compteur (via son IP en BDD par exemple) au bout d'un certain laps de temps d'inactivité.

    J'ai bon ?

    Avec cette solution, une ressource pourrait quand même être bloqué alors qu'aucun utilisateur ne travaille dessus pendant une certaine période.

  6. #6
    Membre chevronné Avatar de deY!
    Inscrit en
    Avril 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2006
    Messages : 403
    Par défaut
    Tu peux très faire une requête asynchrone pendant que l'utilisateur visualise la page, qui toutes les 5 secondes valide sa présence.
    Si un nouvel utilisateur vient à vérifier la présence de la première, il regarde dans la base sa dernière validation, si elle date de plus de 5 secondes, dans ce cas il n'est plus considérer comme en ligne.
    Ou alors tu peux aussi le faire en fonction de son inactivité, c'est à dire que s'il ne fait rien pendant plus 5 minutes, il est "viré". Pour cela tu compte en javascript son temps d'inactivité, qui est mit à zéro dès qu'il bouge sa souris ou s'il appuie sur le clavier, au bout des 5 minutes, une requête est envoyé libérant la ressource, et par la même empêchant l'homme qui dort de continuer sa modification.

  7. #7
    Membre chevronné Avatar de deY!
    Inscrit en
    Avril 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2006
    Messages : 403
    Par défaut
    Tu mets un marqueur dans ta base, pour indiquer sur la ressource est en modification. Par exemple tu as une table "BLABLA" avec une colonne "ISLOCKED" tu type entier ou booléen, lorsqu'un utilisateur ouvre en modification un des enregistrement tu modifie automatiquement ce même enregistrement en mettant la colonne à 1 ou true... Ainsi si une tierce personne venait à tenter de supprimer ou modifier la ressource, il n'en aurait pas le droit, sauf cas particulier.


    EDIT : grillé...

Discussions similaires

  1. Accès d'une page php avec une iframe
    Par gianni7033 dans le forum Langage
    Réponses: 4
    Dernier message: 24/07/2009, 17h00
  2. [Sécurité] Protéger l'accès à une page php
    Par nitteN dans le forum Langage
    Réponses: 5
    Dernier message: 02/04/2008, 13h05
  3. [PHP-JS] interdire l'accès direct à une page php
    Par clem037 dans le forum Langage
    Réponses: 10
    Dernier message: 17/03/2008, 22h04
  4. Réponses: 1
    Dernier message: 20/09/2006, 00h29
  5. Réponses: 5
    Dernier message: 09/01/2006, 11h46

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