Aller au contenu

problème de cache et d'attributs en POO


mackwic

Messages recommandés

Bonjour à tous!

Je suis sur un projet de site en PHP (5.2.6 sur serveur débian). La première version en procédurale commençait à devenir trop difficile à maintenir et à faire évoluer.

Le conseil a donc été réuni et à décidé à l'unanimité (une voix donc :francais: ) de passer le site en POO.

Ayant des notions de C++, je pensait que ça se passerait sans trop de problème et globalement ça a été le cas. La programmation poo en php est pas si différente de celle du C++... à quelques exceptions près. (sinon je serait pas là) :love:

Bon alors voici le topo:

Je souhaite gérer moi même les sessions des utilisateurs. Pour cela, je substitue le tableau $session à la variable globale $_SESSION.

A chaque appel de page (création d'une instance de User donc) le serveur récupère la clé unique stockée dans un cookie et récupère les variables de cache attachées à cette clé. Si l'utilisateur n'a pas de clé, c'est qu'il ne s'est pas identifié, donc exception.

Le système de cache est APC.

A priori rien d'impossible ni de bien compliqué.

Sauf que j'ai été confronté à plusieurs difficultés.

Voici ma classe User:

class User extends SiteAbstract{

protected $m_login;
protected $m_id;
protected $m_ip;
protected $m_pages_visite;
protected $m_date_co;
protected $m_rank;
public $m_session = array();

public function __construct($login = FALSE, $passwd = FALSE) {
...}

public function __sleep(){ ...}

private function verifier_ident($login, $passwd){
...}

private function load_user(){  // demande à la BDD les infos sur l'utilisateur
...}

private function session_load(){ // crée la variable $session à partir des données du cache
...}

public function session_write(){ // équivalent de session_write_close() adapté à ma classe
...}

public function destructeur(){ // pour détruire le cookie de connexion et supprimer le cache. Appelé uniquement dans deco.php donc pas __destruct()
...}

Elle hérite de SiteAbstract où l'on trouve les méthodes de gestion du cache (stocker, sortir, évaluer, vider etc...) et de connexion à la BDD en fonction de l'objet qui en fait la demande.

Je n'ai pas fait d'interface car il n'y avait pas de réel intérêt pour l'instant.

Je met un m_* devant les attributs pour les différencier des variables classiques et des méthodes. Un peu à la façon site du zéro sur le C++.

Première difficulté:

Impossible d'avoir un attribut en array ou de le modifier correctement (vous avez du voir dans la déclaration le mot clé array pour m_session).

Uh? Il y a une façon spécifique de faire?

La seule méthode qui semble marcher c'est: $session = array( truc => bidule, etc) ; $this->m_session = $session

Seconde difficulté:

Au moment de la connexion, les données sont bien chargées et placées dans m_session (et donc dans $session).

Cependant, dès le chargement de la page suivante, m_session est vide!

Cela peut venir de plusieurs chose: apc qui ne marche pas (mais il marche j'ai vérifié), une mauvaise utilisation des attributs array (cf problème 1 :fete: ), ou encore... merde j'avais pensé à un ou deux autres trucs mais ça m'a échappé.

Bon, le réveillon arrive et je n'ai plus trop le temps de compléter mon début de pavé... Je vous remercie d'avance très profondément pour votre attention. Je repasserait pour compléter.

Si quelqu'un pouvait déjà me confirmer/infirmer mes soupçons sur la gestion des array en objet ça pourrait déjà bien m'aider.

Lien vers le commentaire
Partager sur d’autres sites

Le problème ne viendrais t'il pas simplement du refresh de tes cookies ?

si j'ai bien compris synthétiquement =>

Je me connecte => création d'un cookie avec une clé unique cryptée => Enregistrement dans la BDD de ton site de cette clé unique => si l'utilisateur reviens le serveur est intérogée sur cette clé unique et pour que ça marche bah ... il faut que la clé soit dans les cookie de l'user et sur le serveur pour établir une correspondance, le problème est donc que la clé disparait dés qu'on passe sur la page suivante.

plusieurs solutions => ton serveur n'enregistre et n'authentifie qu'un cookie par page et donc quand tu change de page ce cookie n'éxiste pas car il n'est pas répété sur l'ensemble de ton site dans ce cas applique une variable globale pour l'enregistrement du cookie sur le serveur pour que la personne reste connecté quand elle change de page.

la variable de clé unique change a chaque page et ton formulaire d'authentification est donc de ce fait obsolète à chaque nouvelle page car elle demande une nouvelle clé que l'ordinateur n'a pas.

Soit ton serveur fait un refresh automatique a chaque nouvelle page et la clé n'éxiste plus quand tu change de page donc l'user a bien sa clé mais quand il interroge ton serveur sur la nouvelle page celui ci ne trouvant pas dans le répértoire associé la clé correspondante déconnecte l'user.

Après si j'dis des conneries corrige moi XD

Lien vers le commentaire
Partager sur d’autres sites

Euh.... Je devais être bourré avant l'heure. En fait c'était quasiment Ok partout. Juste quelques variables mal orthographiées à réécrire. Fausse alerte quoi.

Ah, et j'avais aussi commenté une ligne de trop.

Mais merci quand même pour ta réponse relativement rapide. Sans vouloir te vexer je préfère quand même ne pas avoir besoin d'aide, au moin ça veut dire que je me démmerde pas trop mal.

Sinon j'ai apparemment pas été assez clair dans mes explications, vu que t'es un peu à coté de la plaque. Désolé. :cartonrouge:

La procédure est pourtant pas bien compliquée mais j'étais un peu pressé.

Authentification => création d'une clé unique K et d'un espace associé sur le cache C[k] contenant les variables de session de l'utilisateur

K est enregistrée via un cookie coté client, ce qui lui permet de passer automatiquement l'authentification et de retrouver ses variables de session.

J'ai tendance à favoriser l'accès au cache plutôt qu'à la BDD... Si les session étaient gérées par BDD, j'aurais plutôt paramétré des handler de session personnalisé. Comme décrit ici dans la doc. (doc php fr)

Actuellement le code a pas mal progressé. Là j'en suis à bosser sur des fonctions génériques pour le dialogue avec la BDD (insert et read, pas encore update: le plus facile pour la fin).

Je rencontre quelques difficultés avec les requêtes préparées mais, rien d'insurmontable. Juste que j'ai un peu peur que les perfs perdues en testant les entrées de la fonction ne compensent pas celles gagnées par un dialogue PHP<->BDD entièrement pré-compilé.

Il faudrait voir avec les tests...

EDIT: je n'ose pas mettre en résolu... ça pourrait toujours servir... :craint:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...