Gérer les problèmes d'accès concurents sur certaines pages ou zones d'un site.

Soyez le premier à donner votre avis sur cette source.

Vue 4 759 fois - Téléchargée 368 fois

Description

Cette librairie vous permettra, à l'aide d'une seule fonction dont l'utilisation est très simple, de bloquer l'accès à certaines pages ou zones de votre site si un utilisateur s'y trouve déjà.

Cela peut être utile par exemple sur les forums : si un modérateur est en train de modifier un message, il serait pas mal que personne ne puisse le déplacer ou le supprimer entretemps... Ceci est un exemple basique mais on peut en trouver un tas d'autres plus critiques que celui ci.

Je vous laisse jeter un coup d'oeil au fichier "README" à l'intérieur de l'archive pour en apprendre plus sur cette librairie et son utilisation. (README uniquement en anglais pour l'instant, je ferai la version française plus tard.)

Une page d'exemple d'utilisation se trouve dans l'archive, si vous voulez tester ! ;)

Source / Exemple :


<?

    ///////////////////////////
    // EXEMPLE D'UTILISATION //
    ///////////////////////////

    //Very important, without that the library does not work
    session_start();

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <head>
        <title>Php_locker_lib test page</title>
    </head>
    <body>

    <?php

        //Call of the library
        require "lib/php_locker_lib.php";

        //Create the locker for this page
        $locker = new php_locker("tester", true);

        //If the page is accessible, display content
        if ($locker->is_accessible())
            echo "Hello world ! <br /><br /> (Vous avez accès à la page.)"; //Il faut mettre votre contenu ici !

        //If the session has reached the timeout
        elseif ($locker->is_timeout())
            echo "Votre session a expirée.";

        //If javascript is disabled
        elseif ($locker->js_disabled())
            echo "Vous devez activer JavaScript pour avoir accès à cette page.";

        //If the page is locked
        else
            echo "Vous entrez dans une zone critique, un seul utilisateur n'y est autorisé à la fois.<br />Vous devez attendre que l'autre utilisateur ait fini ses opérations avant de pouvoir y accéder.";

    ?>

    </body>
</html>

Conclusion :


Il y avait surement 1000 façons de faire cette librairie, je ne sais pas du tout si j'ai utilisé la meilleure, mais tout ce que je sais c'est que ça fonctionne parfaitement dans mon projet au boulot.

Sachez que je suis ouvert à toutes suggestions, critiques, conseils, ou idées d'amélioration !

J'espère que ça vous sera utile !

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
7
"Il ne me reste plus qu'à [...] trouver une solution au problème des onglets des navigateurs qui ont la même session et qui peuvent donc ouvrir deux même pages simultanément..."

C'est pas vraiment nécessaire d'aller jusque là. De toute façon, c'est le même utilisateur qui ouvre la même page. Le but généralement est de simplement bloquer la page pour 1 utilisateur ce qui est déjà fait.

"J'ai intégré la vérification pour l'activation du JavaScript, ça marche sous Firefox, mais je n'ai pas encore testé pour les autres."

J'ai regardé rapidement la méthode et ça semble être assez classique comme approche, tu ne devrais pas avoir de problème avec les autres navigateurs.

Sinon pour les modifications, c'est beaucoup plus intéressant à utiliser maintenant. C'est sûr que ce n'est jamais parfait, mais au moins ça c'est beaucoup amélioré.

Bonne continuation.
Messages postés
2
Date d'inscription
lundi 4 juillet 2005
Statut
Membre
Dernière intervention
25 mai 2009

Voilà, je viens de mettre en ligne la nouvelle version de la librairie. Je l'ai modifiée en suivant tes conseils et remarques, dont je te remercie encore une fois de m'avoir fait part.

La librairie se présente maintenant sous forme de classe, c'est en effet plus pratique à utiliser pour personnaliser les messages d'erreur ou les actions à réaliser en cas de page verrouillée. J'ai mis un exemple de code plus haut, si tu veux voir ce que ça donne. ;)

J'ai intégré la vérification pour l'activation du JavaScript, ça marche sous Firefox, mais je n'ai pas encore testé pour les autres.

Finalement j'ai mixé les vérifications côté serveur et côté client.

Il ne me reste plus qu'à virer jQuery, et à trouver une solution au problème des onglets des navigateurs qui ont la même session et qui peuvent donc ouvrir deux même pages simultanément...

Merci de m'avoir permis d'améliorer cette librairie, c'est un plaisir de recevoir des conseils de personnes plus expérimentées. :)
Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
7
Pour le blocage côté serveur tu peux quand même gérer toutes les fonctionnalités côté serveur.

Pour la classe, idéalement une syntaxe comme ceci serait plus portable et plus intéressant pour ceux qui voudrait utiliser un système comme ce que tu proposes :

<?php
include("taLibrairie.class.php");

$blocage = new RestrictionPage("lock1");

if (!$blocage->isLock()) {
// Affichage ici //
$blocage->lock(30000); // ou encore quelque chose comme
$blocage->lockTill(strtotime("+1 day"));
} else {
// Page avec erreur ou redirection //
}
?>

Ainsi, le développeur gère comme il le veut l'affichage et les messages d'erreur. C'est aussi lui qui a la liberté de faire le rafraichissement comme il le veut. À remarquer qu'une simple requête AJAX vers la même page à toutes les 25 secondes suffit pour garder la page barré et si l'utilisateur pert la connexion ou quitte la page, la page sera débloqué après 30 secondes. Tu retrouves ainsi toutes les fonctionnalités que tu avais côté client.

Ce que tu proposes à l'avantage d'être simple à mettre en place, mais on peut difficilement coder autour de cela ou l'intégrer à un script existant.
Messages postés
2
Date d'inscription
lundi 4 juillet 2005
Statut
Membre
Dernière intervention
25 mai 2009

Merci de tes commentaires, je prendrai ça en compte pour m'améliorer ! :)

Juste quelques remarques/précisions :

"- Ce qui aurait été plus facile à utiliser, c'est d'avoir une classe au lieu d'une fonction."

Dans la mesure où il y a qu'une fonction, je pense que cela reviendrait au même, non ?

"- À part ça le principe n'est pas vraiment super. Tu aurais été mieux de faire quelque chose qui fait carrément une redirection côté serveur si la page est bloqué. Au lieu de ça, tu charges la page quand même et tu fais une requête vers le serveur. Tout aurait pu rester côté serveur."

En fait, ce n'est pas vraiment le but de la librairie, ce que tu dis peut être fait assez rapidement et simplement en Php.

Ce que je voulais surtout (besoins de l'application au boulot) c'est que la page se débloque quand un utilisateur reste inactif au delà des temps indiqués ou dès qu'il se déconnecte. Je voulais aussi éviter le cas où le réseau serait perdu (pour X raison), que le gars reste sur la page, et puisse envoyer le formulaire une fois reconnecté. Il y a donc forcément quelque chose à gérer côté utilisateur, enfin du moins je ne vois pas d'autres moyens de gérer ça côté serveur...

Cela évite aussi qu'une page reste bloquée trop longtemps alors qu'un utilisateur est parti.

"- En bonus, si je désactive javascript (ce qui est ma configuration par défaut), ça ne fait absolument rien comme blocage."

Ah effectivement je n'y avait pas pensé, l'application au boulot fait ce test en amont, car javascript est nécessaire pour l'utiliser, on ne peux pas y entrer si javascript est désactivé. Il faudra que j'ajoute ce test à ma librairie, merci. ;)

"- Pour le reste, ça manque de portabilité. Tu forces l'utilisation de jquery. Sur une page visiter, 55ko ça peut générer beaucoup de trafic. C'est lourd de forcer l'utilisation d'une librairie javascript. En plus, certaines librairies peuvent avoir des collisions dans les noms qu'ils utilisent."

Je n'ai pas l'habitude de travailler en ajax, j'ai donc provisoirement utilisé jQuery pour faire rapidement et simplement des requêtes m'assurant la compatibilité entre navigateurs. Il faudra que je change ça pour rendre la librairie plus légère effectivement.

Encore une fois merci de tes remarques ! :)
Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
7
Voici mes impressions en vrac :

- Ce qui aurait été plus facile à utiliser, c'est d'avoir une classe au lieu d'une fonction.
- Tu mélanges le côte "contrôleur" de ton code avec l'affichage et ça c'est mauvais pour la portabilité.
- Il te manque un global pour ta variable jquery_use ligne 59 de php_locker_lib.php.
- Ton path vers ton fichier jquery est incorrect dans le fichier "page_to_lock.php".
- À part ça le principe n'est pas vraiment super. Tu aurais été mieux de faire quelque chose qui fait carrément une redirection côté serveur si la page est bloqué. Au lieu de ça, tu charges la page quand même et tu fais une requête vers le serveur. Tout aurait pu rester côté serveur.
- En bonus, si je désactive javascript (ce qui est ma configuration par défaut), ça ne fait absolument rien comme blocage.
- Pour le reste, ça manque de portabilité. Tu forces l'utilisation de jquery. Sur une page visiter, 55ko ça peut générer beaucoup de traffic. C'est lourd de forcer l'utilisation d'une librairie javascript. En plus, certaines librairies peuvent avoir des collisions dans les noms qu'ils utilisent.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.