variables de session, a consommer avec modération?

variables de session, a consommer avec modération? - PHP - Programmation

Marsh Posté le 06-03-2003 à 11:04:03    

Yo!  :hello:  
 
Ben voila, j'aimerai me rassurer, car j'utilise pas mal de variables de session, et qui sont consultés et modifiés tres tres souvent pour chacun des utilisateurs. (50 utilisateurs connectes en meme temps qui consultent et modifient 20 variables de session chacuns, toutes les 3 à 4 secondes...)
 
Donc j'aimerai savoir si plein de variables de session c'est bieng ou c'est pas bieng? Puis-je en abuser a volonter??
Ou si ça fait ramer a mort le serveur etc...
 
Rassurez moi siou plait!  :jap:


Message édité par Mr yvele le 06-03-2003 à 11:08:33

---------------
yvele n'est plus.
Reply

Marsh Posté le 06-03-2003 à 11:04:03   

Reply

Marsh Posté le 06-03-2003 à 11:22:47    

Heu et vous perso, vous en utilisez plein des variables de session?
 
 :bounce:


---------------
yvele n'est plus.
Reply

Marsh Posté le 06-03-2003 à 11:37:56    

non ... assez peu, moi je garde en DB.
juste  
 
correspondant a la table online
chaine_unique
 
correspondant a la table membre
idmembre
login
 
et quand la saisie sur un formulaire est pas bonne, je colle en session le tableau des infos pour reconstituer mon formulaire.  
 

Citation :


Donc j'aimerai savoir si plein de variables de session c'est bieng ou c'est pas bieng? Puis-je en abuser a volonter??  
Ou si ça fait ramer a mort le serveur etc...  


 
je peux pas te repondre, je garde juste en session les infos necessaires pr passer dune page a lautre, le strict minimum pr recreer le contexte.
 
inconvenient que je vois : les sessions sont lues sur le disque a louverture de page + ecriture a chaque changement.


Message édité par beleg le 06-03-2003 à 11:41:16
Reply

Marsh Posté le 06-03-2003 à 14:01:03    

Merci pour ta réponse..  :jap:  
 
Bah....
En fait moi j'utilise les sessions pour limiter au strict minimum le nombre de requettes vers la bdd...
 
Je pense qu'une requete mysql bouffe plus de ressources qu'une variable de session...?
Cette question m'interesse à fond... Quelquun auré une reponse?  :??:
 
 


---------------
yvele n'est plus.
Reply

Marsh Posté le 06-03-2003 à 15:40:42    

je suis en train de recoder une bonne partie de mon site pour utiliser au max les sessions.
Une requête bouffe bcp plus de temps qu'une session.
Tu fais un select id, login from user_online where sess_id='$session' est 10x plus lent que de rapatrier ces infos d'une session existante.
 
PS : Même une classe Session codée moi même sur base de fichiers est plus lente que d'utiliser les sessions php (qui créent elles-aussi des fichiers)...


---------------
...oups kernel error...
Reply

Marsh Posté le 06-03-2003 à 21:27:35    

Ok.. merci ethernal...
 
C'est bien ce que je pensais, mais je voulais en etre bien sur..
Allé a+
 
 :jap:

Reply

Marsh Posté le 06-03-2003 à 21:53:44    

ethernal a écrit :

je suis en train de recoder une bonne partie de mon site pour utiliser au max les sessions.
Une requête bouffe bcp plus de temps qu'une session.
Tu fais un select id, login from user_online where sess_id='$session' est 10x plus lent que de rapatrier ces infos d'une session existante.
 
PS : Même une classe Session codée moi même sur base de fichiers est plus lente que d'utiliser les sessions php (qui créent elles-aussi des fichiers)...


 
on est daccord, les infos dont on a besoin souvent (cad, des requetes qui reviendrait frequemment), interet a sauvegarder ca une fois pr toute. spour ca que je garde le login, l'id. Apres faut pas mettre des infos dont lutilité est reduite ... Pr le moment, jai pas a garder bcp de choses en session mais je vais y reflechir la pour un truc que je fais.
 
problematique : je genere une page en fonction de plusieurs tables, une fois les parametres bien validés, la page risque de ne pas changer bcp, donc ca serait pas mal de la stocker sous la forme dun fichier ( => supression de 3 requetes ), mais la ou jai a reflechir, c quand mettre a jour le fichier ...  
- a chaque changement de base,  je vais pas generer le source de la page pr le sauvegarder.
- je la sauvegarde quand le proprio regarde sa page, le source etant generé, ca me coute qune ecriture en plus par rapport a maintenant, et jeconomise qd les autres la consulte.
- je lui colle un bouton publier/valider/mettre en ligne.
 
umm la 2eme ...

Reply

Marsh Posté le 06-03-2003 à 23:15:42    

tu as 2 solutions facile à mettre en place :
- le bouton publier dont tu parlais (qui est +- la même solution que le chgt de base)
- un timer qui vérifie d'après la durée que tu donnes si la page est toujours d'actualité.
 
Si tu le fais par rapport à la personne qui consulte la page (sous entendu, si le proprio regarde alors update), tu devras faire une query pour voir si l'utilisateur est le proprio... non ? Donc j'écarterais cette possibilité.


---------------
...oups kernel error...
Reply

Marsh Posté le 07-03-2003 à 00:47:14    

ahah comment on rattrape le topic ... pkoi faire une requete, l'ID de la personne connecté est important donc on conserve cette info via non pas la session mais presque pareil, une classe (qui sert a logguer / delogguer / qui est online / depuis quand), dont un simple == me permet de savoir si le proprio visite sa page  :) .
 
Finalement ... tant quil edite sa page et agit sur certaines des tables qui contiennent les infos necessaires a la generation de la dite page. on se contente dupdater la table en cause.
 
Il veut voir le resultat, (loutil d'edit noffre pas la vue globale, presence de Edition Bloc / suppression Bloc), la on enregistre sur le disque.
 
Une autre personne veut voir la page ?
- la page existe sur le dur, on charge le source (donc aucune requete de faite, youou)
- la page nexiste pas, on genere le source (3 requetes)
 
 
au fait, ton job en cobol ou php ? jai finlement été accepté pr celui de php, mais pour le moment, cest guere passionnant, je suis revenu a lage de pierre, pas de classes, pas de templates/skin, un bordel issue de 2 ans de dev  [:wam]  :o  ... et meme pas le droit de faire du net ... tt ca de 9'30 a 19  :sweat:  
 
vs voulez rire ?
 
exemple de code :
 

Code :
  1. if (pas le droit de lire cette page)
  2.    echo "<javascript>this.location = /index.php</javascript>"


 [:psywalk]  
 
 
 

Reply

Marsh Posté le 07-03-2003 à 10:04:00    

beleg a écrit :

ahah comment on rattrape le topic ... pkoi faire une requete, l'ID de la personne connecté est important donc on conserve cette info via non pas la session mais presque pareil, une classe (qui sert a logguer / delogguer / qui est online / depuis quand), dont un simple == me permet de savoir si le proprio visite sa page  :) .


 
je te suit plus là  :??:  
comment tu passes ta classe de page en page ??
ta classe "online" fait chaque fois au moins une query non ??


---------------
...oups kernel error...
Reply

Marsh Posté le 07-03-2003 à 10:04:00   

Reply

Marsh Posté le 07-03-2003 à 10:11:17    

beleg a écrit :

au fait, ton job en cobol ou php ? jai finlement été accepté pr celui de php, mais pour le moment, cest guere passionnant, je suis revenu a lage de pierre, pas de classes, pas de templates/skin, un bordel issue de 2 ans de dev  [:wam]  :o  ... et meme pas le droit de faire du net ... tt ca de 9'30 a 19  :sweat:


 
aucune nouvelle :( à mon avis il n'ont jamais reçu ma candidature par mail.... faut qu'il les regarde parfois :D Peut-être qu'ils font des delete de masses à cause des spams ?? :lol:
 
Toute mes félicitations Mr le développeur PHP  [:tuffgong]  
C'est vrai qu'on dirait qu'ils sont un peu à la masse :(


---------------
...oups kernel error...
Reply

Marsh Posté le 07-03-2003 à 23:17:48    

ethernal a écrit :


 
je te suiS plus là  :??:  
comment tu passes ta classe de page en page ??
ta classe "online" fait chaque fois au moins une query non ??


 
en mettant les infos en session pr les recuperer et recréer ma classe, oui je sais, il etait tard hier appremment  :D  :o , je travaille trop. donc les sessions c bon ... servez vs en.
 
et ma classe online fait soit 1 soit 2 query, le plus svt 2.

Reply

Marsh Posté le 08-03-2003 à 15:52:35    

hier en pleine soirée avec des copains, ils m'ont appelés (pour le job cobol)... j'ai rendez-vous lundi :)
 
pour le module online, j'ai trouvé un nouveau système pour éviter les querys inutiles :
Mettre le dernier temps de raffraichissement de la table online dans une variable de session.

Code :
  1. if ($HTTP_SESSION_VARS['timeout'] < date('U')-3*60){
  2.   $HTTP_SESSION_VARS['timeout']= date('U');
  3.   //query update/replace
  4.   //query delete where timeout < date('U')-3*60
  5. }
  6. // query count where timeout >= date('U')-3*60


 
je vois pas comment faire mieux.
Tu fais comment toi ?


---------------
...oups kernel error...
Reply

Marsh Posté le 09-03-2003 à 13:30:00    

umm, si tu utilises les session pr savoir qd deconnecté une personne, comment maintiens tu une liste de connectés valide ?
faut que jemerge, je vois pas comment tu fonctionnes  :sweat:  
 
 

Code :
  1. if (session existe)
  2. { // un visiteur/membre poursuit sa visite
  3.    ...
  4.    select idonline,finconnection from online where idonline = ....
  5.    si (aucune ligne ou finconnection < maintenant)
  6.        deconnection
  7.    sinon
  8.        update online set finconnection = ".(time()+1800)." where idonline = ....
  9.    ...
  10. }
  11. else
  12. { // un visiteur arrive
  13.    ...
  14.    insert into online (idunique,debutconnection,finconnection) values ('".$this->idunique."',".time().",".(time()+1800)." )";
  15.    ...
  16. }


 
vider la table online

Code :
  1. "delete from online where finconnection < '".time()."'"


 
nb de personnes online, temps de connection

Code :
  1. select count from online
  2. select idmembre, debut connection from online ...


 
des gens qui travaillent le soir, faut se mefier  :o , bonne chance ...

Reply

Marsh Posté le 09-03-2003 à 14:08:23    

j'évite ces lignes-ci, mais le principe reste le même:

Code :
  1. select idonline,finconnection from online where idonline = ....
  2. si (aucune ligne ou finconnection < maintenant)


 
toute les pages contiendront  

Code :
  1. session_start();
  2. if ($HTTP_SESSION_VARS['timeout'] == NULL){
  3. //Nouveau connecté
  4.   $HTTP_SESSION_VARS['timeout']= time()-2400; //forcer l'update de la table online
  5. }
  6. //pas besoin de la query pour voir si il faut rafraichir la table online, puisque l'ont regarde la variable de session
  7. if ($HTTP_SESSION_VARS['timeout'] < time()-1800){
  8. //updater la table online et la variable de session
  9.   REPLACE into online (id_session,timeout, user_id, emplacement) values ('".$this->session_id."',".time().",...)";
  10.   $HTTP_SESSION_VARS['timeout'] = time();
  11.   "delete from online where finconnection < '".time()-1800."'"
  12. }


 
Lors de l'action "login", je stocke dans les variables de session l'id, le login du user et registered=true et j'update la table online.
 
Comptage des users online classique comme tu le fais.
 
 
La seule chose que je fait différemment, c'est que je stocke le temps du dernier rafraichissement de la table online dans une var de session.  Comme ça à chaque chargement de page, je ne dois pas regarder dans la table session si pour ce user là je dois updater ou pas.
En supposant que l'utilisateur charge 30x la page sur les 3mins de temps "online", j'économise 30 querys.
 
[job]
c'est une société de chasseur de tête qui s'en occupe... en général, ils appellent essentiellement le soir pour ne pas déranger les gens qui bossent)  
En plus, ils ont entièrement refait leur site en php  :love: (mais je pense que c'est une société externe qui s'en est occupé, ça sent le pro, surtout pour le design ! :()
[/job]


---------------
...oups kernel error...
Reply

Marsh Posté le 09-03-2003 à 17:31:14    

ok je comprends mieux ... Mais apparemment, un surfeur peut au cours de sa visite avoir sa ligne online effacée et recrée des quil rouvre une page.
je pense que ca correspond pas a mes besoins mais je vais mettre ca ds un coin, et essayer de mieux me servir des sessions. Je tiens pas assez compte des sessions quand je fais mes modeles de données.
 
 [:dde]  
 

Reply

Marsh Posté le 09-03-2003 à 17:50:23    

beleg a écrit :

Mais apparemment, un surfeur peut au cours de sa visite avoir sa ligne online effacée et recrée des quil rouvre une page.


 
chez toi aussi avec la ligne "delete from online where time<time()"
non ?


---------------
...oups kernel error...
Reply

Marsh Posté le 09-03-2003 à 19:00:53    

Moi, tant quil surfe et visite des pages, il est connecté pendant des jours si il veut, je repousse la date de fin de connection. Apres 30 minutes de non activité effectivement, il est viré de online et si il revient, il est considéré comme nouveau (panier vidé et/ou membre deconnecté selon les sites).  
 
Toi, il me semble, que si A et B se connectent au temps T1,surfent jusqua T1+30, passé les 30 minutes, A ne fait rien et B visite une autre page, B rentre dans if ($HTTP_SESSION_VARS['timeout'] < time()-1800) donc "delete from online where finconnection < '".time()-1800."'" :
La ligne de A est effacé, A se reveille a T1+35, il rentre aussi dans if ($HTTP_SESSION_VARS['timeout'] < time()-1800){  
 et donc recré une ligne ds online.  
 
mais effectivement, tu economises les queries, la rien a dire.
Faut que jetudie ca ... je fais 3 requetes minimum a chaque visite dune page
 
Si personne ne reste sur ton site plus d'une demi heure, les lignes ds online ne sont jamais effacées ?
 

Reply

Marsh Posté le 10-03-2003 à 00:07:18    

oui chez moi c'est 30min (3min en fait) à partir de la première connexion qu'il recharge 10 pages ou aucune.
Pour bien faire, je devrais updater si le temps contenu dans la var de session est par ex la moitié du temps de online prit en compte.
Imaginons que je prenne un temps de latence de 3mins pdt lesquels l'utilisateur est considéré comme online, je pourrais considérer d'updater ma table online toute les 1 min.
Evidemment, s'il recharge 40 pages dans les 59 secondes, puis aucune dans les 2.01 min qui restent, il sera considéré comme offline.  C'est un choix à faire.
Je vais tester tout ça puisque c'est encore en projet, j'espère pouvoir te montrer si ça fct bien ou pas bientôt.
 
 
Oui, si personne ne restent plus de 3mins, la table reste remplie.
Mais à la prochaine connexion, je la vide.  Ce n'est pas utile de la vider à chaque fois, de toute façon il ne prend en compte que ceux qui sont dans les temps (il y devrait y avoir un index sur le temps) et un mysql_num_rows sur un select(id) ou un count(id) n'est pas très gourmand.  
Et sans doute moins gourmand que de faire des delete à chaque chargement de page alors que ce sera utile une fois sur 10.


---------------
...oups kernel error...
Reply

Marsh Posté le 10-03-2003 à 10:13:43    

Damned, on a piqué mon topic!!  
Vous voulez ptetre que je change le titre du topic?  :D
 
En tout cas merci pour vos reponses..  :jap:


---------------
yvele n'est plus.
Reply

Marsh Posté le 10-03-2003 à 12:00:50    

bah on parle de données en base et de session, on reste ds le sujet. Pour un projet, jai developpé mon modele de base sans tenir compte du fait que ca serait dev sous du php, donc avec des sessions. Resultat, jai un truc robuste mais peu optimisé, qui a chaque page commence par faire 3-4 requetes quoi quil arrive vu que ttes les infos sont ds la base. En session, ya juste un lien vers le champ de la table online + quelques infos rajoutés justement pr economiser quelques requetes. Les sessions sont donc sous exploitées.
 
Donc quand jaurais un peu de temps, cad, ds longtemps, sceance optimisation.
 

Citation :

Oui, si personne ne restent plus de 3mins, la table reste remplie. Mais à la prochaine connexion, je la vide.


je suis a la ramasse des fois moi  :o
 

Citation :

Et sans doute moins gourmand que de faire des delete à chaque chargement de page alors que ce sera utile une fois sur 10.


 
je viens de consacrer ma pause a essayer de optimiser les delete de online .. et tt ce que je trouve, c :
si tirer un chiffre de 1 a 10 == 5  :sweat:
    alors faire le delete
 
 :D  jeconomise ~ 9/10 des requetes ... technique employée chez wanadoo-goa.com pr soulager les serveurs :lol:  cad virer 9/10 des visiteurs qui veulent sinscrire a leur nouveau jeux.


Message édité par beleg le 10-03-2003 à 12:11:08
Reply

Marsh Posté le 10-03-2003 à 16:22:31    

beleg a écrit :

 
 :D  jeconomise ~ 9/10 des requetes ... technique employée chez wanadoo-goa.com pr soulager les serveurs :lol:  cad virer 9/10 des visiteurs qui veulent sinscrire a leur nouveau jeux.


c'est une bonne idée aussi :)
wanadoo-goa :lol:
 
je rentre de l'interview là... réponse d'ici 2 semaines pour l'interview suivante avec le directeur de la boite.


---------------
...oups kernel error...
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed