Conserver sa session_id() Nouvelle méthode !

Eléphant du PHP | 53 Messages

30 mars 2010, 12:17

Bon j'ai résolu l'autre topic parce qu'il devenait vraiment long et vraiment flou :)

Je rappel donc le problème, j'ai deux sites web et je souhaite faire passer mes variables de session d'un site A vers un site B !

Pour ce faire, après concertation avec moi même, j'ai décidé d'attribuer moi même un identifiant de session pour chaque utilisateur. J'envoie donc ensuite l'id ! Ainsi, chaque site possèdera un id identique pour chaque utilisateur :)

J'ai donc commencé mon travail en testant avec des identifiants qui sont fixe avant de penser à une fonction random qui génèrera un ID aléatoire. Et là, il se passe une chose très bizarre, que je ne comprends pas et j'aimerais qu'on m'explique si Dieu :priere: en est pour quelque chose !

Site A:
$id = session_id();
var_dump($_SESSION);
Résultat:
0615a01612310dcda56121ae8aa53023
{ ["SESSION"]=> &array(2) { ["caddie"]=> ...} <= Ma session !

Site B:
Je sélectionne maintenant mon ID du site A qui est 0615a01612310dcda56121ae8aa53023 et je remplace mon session_id de mon site B !
session_id("0615a01612310dcda56121ae8aa53023");
var_dump($_SESSION);
Voilà rien de bien sorcier ! Mais là, rien ne s'affiche :(

Résultat:
array(0) { }

Et ce qui est de plus curieux (j'ai fais cette découverte au hasard), c'est que pour que ça marche (accrochez vous bien !) Il faut que je remplace ma session du site A, par l'ancienne session du site B ! :priere:

Je reprends mon exemple pour que ce soit plus clair:

Site B:
echo session_id();         //<== Je récupère l'ancienne id avant de la modifier
session_id("0615a01612310dcda56121ae8aa53023");
...
Résultat:
azf651f6d51s6d5f1554161s5dzaas

Site A:
Je récupère l'ancien id du site B: azf651f6d51s6d5f1554161s5dzaas et je le met dans ma session ID du site A !
$id = session_id(azf651f6d51s6d5f1554161s5dzaas);
var_dump($_SESSION);
Et seulement à partir de ça, j'arrive à avoir ma session identique (peu importe mes modifications) sur les deux sites !

Donc j'aimerais comprendre pourquoi ? Désolé si l'explication est un peu bancale mais c'est vraiment pas facile à expliquer :(

Eléphant du PHP | 422 Messages

30 mars 2010, 14:00

hello

t'es deux site web ils sont organisés comment en terme d'hébergement ?

++
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

Eléphant du PHP | 53 Messages

30 mars 2010, 14:04

Les sites sont sur le même hébergement !

ViPHP
ViPHP | 5462 Messages

30 mars 2010, 14:28

Les sites sont sur le même hébergement !
et sur le même nom de domaine ?

Eléphant du PHP | 53 Messages

30 mars 2010, 14:40

Non :non:

Eléphant du PHP | 422 Messages

30 mars 2010, 14:40

hello

tu fait tes tests en local ou en prod ?
ou sont sauvegarder tes sessions ? par domaine ou global ? c'est quoi le path
attention les cookie sont liés aux domaines et les id de session stocké dans un cookie

Une idée serait de sauvegarder en BDD le panier lié au user et ensuite dans le domaine B tu peux le récupérer.

++
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

Eléphant du PHP | 53 Messages

30 mars 2010, 15:35

tu fait tes tests en local ou en prod ?

prod (mais c'est pas le distant !)


ou sont sauvegarder tes sessions ? par domaine ou global ? c'est quoi le path

global
/var/lib/php5

ViPHP
ViPHP | 5462 Messages

30 mars 2010, 15:38

ta peu sauvgarder tes sessions en sqlite ? (phpinfo -> session -> Registered save handlers)

Eléphant du PHP | 53 Messages

30 mars 2010, 16:06

Je regarde tout ça !

devlop78
Invité n'ayant pas de compte PHPfrance

30 mars 2010, 19:19

Sinon le plus simple c'est de faire des fonctions sessions (il y a une fonction dans laquelle tu définies les fonctions que tu vas utiliser ...). A part ça, si t'as le n° de session, tu n'as pas accès à /temp/n°session ou à un autre dossier ... ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

31 mars 2010, 10:57

Une solution que j'avais mise en place pour répondre à ce type de besoin était la mise en base de données de la session.
2 solutions :
  • utiliser le mécanisme de base de PHP pour pousser les sessions en base. Plus simple et plus rapide à mettre en place, mais il reste le soucis de partage de l'identifiant de sessions
  • surcoucher la session, pour que le système de stockage des données utilisateurs remplace la session. Plus long, mais permet de connecter plusieurs services, même si plusieurs langages. Toutefois, demande que l'utilisateur soit connecté
J'ai fait le choix de la seconde proposition.

Ma solution se présentait de la sorte :
Base de données :
Une table "user_data" qui contenait un id_user, un champ "data" binaire de grand format, et 2 marqueurs temporels (created_at et updated_at).

Applicatif :
A la connexion de l'utilisateur, je récupérais son id_user, que je stockais dans la session locale (sur le serveur, en mode fichier).
Je disposais d'une classe "UserData" qui pouvais, à partir de l'id_user, d'aller chercher et repousser les données de ma session dans la base de données. C'est cette classe qui se chargeait de la sérialisation/désérialisation des données, pour permettre le passage d'objet.

Ainsi, le stockage partagée est résolu, pas besoin de requête entre les serveurs pour partager les données (on diminue donc d'autant le nombre de requête), et il ne reste plus qu'à gérer la connexion.

Sinon, il existe aussi la solution du memcache
Il faut configurer PHP pour qu'il utilise un serveur de memcache pour les sessions, mais ça revient au même concernant le partage des identifiants de session.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer