Le samedi 7 mai 2005 à 16:27:: Laurent - CyberSDF:: Dev Web
Si vous avez touché un peu à PHP, vous vous êtes peut être penché sur les sessions. La documentation vous propose une gestion des sessions en interne (dites à la PHP4) ce qui, pour moi, n'est pas vraiment très souple ni très fiable au niveau maintenance du code et auxquelles je ne donne (peut être à tord) qu'une confiance toute relative.
C'est la la grosse différence entre les deux méthode. Avec les sessions a la PHP4 tout est fichiers (identifiant de session dans un répertoire spécifique) alors que dans les sessions a la PHP3 on stocke dans une base de données.
Pour fonctionner, la table qui doit contenir vos sessions doivent avoir au minimum deux colonnes :
On peu bien sur ajouter autant de colonnes que l'on veut, tout dépend de l'application que l'on développe.
Certains développeurs font le choix d'ajouter une colonne contenant la date de début de la session et mettent à jour, à chaque demande de page, la première colonne date. Ainsi il n'ont plus qu'à retrancher les deux date pour obtenir une durée de session.
Comment le choisir ? C'est un des débat très récurent entre développeur PHP car chacun à sa méthode préférée mais le principe général est toujours le même. Le tout est d'éviter les collisions de sessions (tomber deux fois sur le même identifiant pour deux utilisateurs connectés en même temps) il faut donc que votre identifiant soit suffisamment long (pour éviter d'épuiser le stock des possibilités si vous prévoyez beaucoup de connectés) et suffisamment aléatoire (pour éviter de se retrouver avec deux fois le même identifiant).
Des méthodes il y en a donc plein, presque une par développeur (voir par application), cela va d'un piochage aléatoire de caractères autorisés à des concaténations de l'heure système et du PID du serveur HTTP etc.
Perso j'aime asse ce genre de truc bateau qui fonctionne pour un peu tout :
<?php function gen_aleat() { $lettre = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z", "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z", "0","1","2","3","4","5","6","7","8","9"); for ($i=0; $i<30; $i++) $allerAtoire .= $lettre[mt_rand(0,count($lettre))]; return $allerAtoire; } ?>
La encore c'est au choix de chacun
. En effet tout dépend du développeur, vous pouvez choisir un type de colonne contenant une vraie date lisible ou un timestamp[1].
Encore une fois, vous avez plusieurs plusieurs possibilités de fonctionnement. C'est aussi pour ça que j'aime ce genre de session 
Je vais vous détailler une que j'utilise et qui fonctionne pas trop mal. Ce n'est certainement pas la meilleure, il y a beaucoup mieux à faire, mais elle à l'avantage d'être simple et facilement compréhensible par un néophyte
J'ai donc besoin d'un identifiant de session que j'obtiens avec ma fonction gen_aleat() présentée plus haut et j'ai aussi besoin d'une date à mettre dans ma table.
Je choisis ici une date lisible (générée par le SGBD) à laquelle j'ajoute le temps que doit durer la session (on va dire 45 minutes). Cette colonne sera donc la date limite de validité de ma session.
En MySQL, avec une colonne de type DATETIME pour la date, ça nous donne une requête SQL du style :
$session = gen_aleat();
INSERT INTO session (id_session, timeout) VALUES('$session', DATE_ADD(NOW(),INTERVAL +45 MINUTE)
Une fois votre session crée, il faut bien sur penser à la transmettre de page en page en fonction de la navigation de votre utilisateur (c'est le but des sessions
). Pour ça il y a, encore une fois, plusieurs écoles. La plus courante est de transmettre l'identifiant de session dans les liens et les formulaires du genre :
<?php echo '<a href="ma_page.php?idsess='.$session.'">'; echo '<input type="hidden" name="idsess" value="'.$session.'" />'; ?>
Ok, c'est pas très beau car on se retrouve avec l'identifiant de session dans l'URL[2] ce qui fout en l'air votre superbe gestion d'URI significative.
Pour éviter de transmettre à chaque fois l'identifiant de session vous pouvez le mettre dans un cookie qui sera stocké chez l'utilisateur en faisant quelque chose du style :
<?php setcookie("SessionID", $session, time()+2700,"/monrep/",".monsite.com",1); ?>
Il existe bien sur d'autres méthodes, mais elles sont généralement spécifique à l'application développée ou dépendent de certains paramètres. Je ne les détaillerais donc pas ici.
Avec ma méthode, la vérification de la session est extrêmement simple.
Avant tout, il faut penser à purger les sessions inactives :
DELETE FROM session WHERE timeout < NOW()
Puis de vérifier si notre session existe encore :
SELECT id_session FROM session WHERE session.id_session='$session'
On compte le nombre de ligne renvoyé, si c'est 1 c'est que notre session est toujours active (si vous avez plus de 1, vous avez un gros problème
), donc c'est bon, on continue. Si ça renvoie 0 il vous suffit de lui recréer une nouvelle session.
A cette étape, il faut également prévoir (en fonction de votre application) que votre utilisateur a peut être besoin d'un peu plus de temps que celui que vous lui avez donné initialement (45 minutes dans mon exemple). Il faut donc penser à faire glisser la session. La encore deux écoles :
La, encore une fois, tout dépend de vos besoins...
Cette méthode vous permet de pouvoir créer un historique de l'utilisation des sessions. Associées à un couple login / password par exemple, cela rend complètement inutile l'utilisation de cookies (que l'utilisateur peu refuser).
Vous gérez complètement la durée de la session, c'est a dire que vous pouvez la faire vivre autant de temps que nécessaire (quelques minutes à plusieurs jours).
[1] Heure courante, mesurée en secondes depuis le début de l'époque UNIX, (1er janvier 1970 00:00:00 GMT).
[2] D'autres petits malins, se sont dit pourquoi ne pas utiliser les sessions a la php4 pour transmettre mon identifiant de session ?
oui, pourquoi pas, mais c'est pas un peu lourdingue ? Hein dites les gars ?
Blogmark it ! :: trackback fermés :: fil rss des commentaires
1.
Le samedi 7 mai 2005 à 17:41 ::
NiKo
Le fait de passer par une bdd pour stocker les informations de sessions est bien plus lourde qu'avec la méthode par fichiers; il faut le savoir. Pour ceux qui refusent les cookies, on peut toujours passer l'identifiant en GET dans les urls, même si pour le coup c'est pas secure.
Ensuite, un truc pratique pour générer des phrases uniques par client est d'utiliser une chaine de caractère descriptive et de la passer en md5. Par exemple, l'IP, le proxy, l'OS, le Browser, sa version, etc. le tout encodé en md5
2.
Le samedi 7 mai 2005 à 20:43 ::
Laurent - CyberSDF
NiKo> Oui gérer les session via une BdD semble plus lours en terme de gestion, mais ce n'est pas vraiment le cas une fois que ton code à été écrit (et si tu as la flemme, prend le fichier session.php de Dotclear qui est, comme d'habitude, un bon exemple) de plus quel avantage au niveau souplesse et possibilités...
Toutes les fautes d'orthographes présentes sur ce site sont protégées par la licence
Creative common
|
|
|
|
Design décliné de [ON]Simple par [ NikO ]
Hébergé par Typhon.Network