[PHP] Instance in Session of opnieuw uit db halen?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
Beste mede-Tweakers

Ik raak sinds enige tijd nog een PHP aan, normaal programmeer ik in .Net.
Nu, PHP is stateless, maar je wil natuurlijk data meenemen van de ene pagina naar de andere. Daarvoor bestaan er sessions.

Maar, als ik inlog wordt er data gefetched uit de database, en daar wordt een instance van een 'User' object aangemaakt. Wat is dan best practice?

A) Het aangemaakte instance in een session variable steken, en het zo onmiddellijk referencen op andere pagina's.

B) Een uid in een session variable steken, en elke keer keer dat ik de instance nodig hebt, alle gegevens uit de database halen.

Volgens mij is het een afweging tussen meer RAM verbruiken op de server (sessions) en ontiegelijk veel extra database access om bij elke hit 1 of meerdere objecten op te halen.

Wat is best practice en is zowat standaard in de industrie?

Dank!

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Nu online

Janoz

Moderator Devschuur®

!litemod

In een . NET omgeving is het inderdaad meer ram. PHP is echt stateless wat betekent dat er helemaal geen application-scope is. Alleen binnen hetzelfde request zitten de sessiegegevens in het RAM. Tussen de verschillende request wordt de sessie geserialiseerd naar de schijf. De afweging is dus meer, lees ik het elke keer uit de database, of lees ik het elke keer vanaf schijf (waarbij je op moet merken dat ook in het geval van een uid de schijf gebruikt wordt om de sessie bij een volgend request weer in te laden)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • HansvDr
  • Registratie: Augustus 2009
  • Niet online
Alleen Id in Session in combinatie met een gecached record uit de database is ook nog een optie.

Werkt hier prima.

Kijk bijvoorbeeld eens naar http://www.phpfastcache.com/

Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Je moet je afvragen hoe vaak en wanneer je al die data nodig hebt. Het ID heb je altijd en overal nodig dus die steek je in de session, verder zou ik (net zoals bijvoorbeeld hier bij Tweakers) wanneer je op elke pagina de username toont (ingelogd als: PietjePuk) deze ook in de sessie duwen zodat je 'm altijd gelijk beschikbaar hebt.

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • Carharttguy
  • Registratie: Juli 2010
  • Laatst online: 04-07 23:09
Bedankt voor jullie antwoorden!
Janoz schreef op vrijdag 2 juni 2017 @ 11:28:
In een . NET omgeving is het inderdaad meer ram. PHP is echt stateless wat betekent dat er helemaal geen application-scope is.
Daar had ik nog niet over nagedacht!
HansvDr schreef op vrijdag 2 juni 2017 @ 11:28:
Alleen Id in Session in combinatie met een gecached record uit de database is ook nog een optie.

Werkt hier prima.

Kijk bijvoorbeeld eens naar http://www.phpfastcache.com/
Thanks voor de tip, ik ga deze weg volgen.
Harrie_ schreef op vrijdag 2 juni 2017 @ 11:47:
Je moet je afvragen hoe vaak en wanneer je al die data nodig hebt. Het ID heb je altijd en overal nodig dus die steek je in de session, verder zou ik (net zoals bijvoorbeeld hier bij Tweakers) wanneer je op elke pagina de username toont (ingelogd als: PietjePuk) deze ook in de sessie duwen zodat je 'm altijd gelijk beschikbaar hebt.
Ja, maar dat laat een opening voor willekeur, welke variabelen geef je dan het privilege om in een sessievariabele te zitten en welke hou je dan in de instance?

Ik heb het liefste alles in objecten/instances. Dat vind ik persoonlijk zelf veel meer gestructureerd.

Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Carharttguy schreef op vrijdag 2 juni 2017 @ 11:57:

Ja, maar dat laat een opening voor willekeur, welke variabelen geef je dan het privilege om in een sessievariabele te zitten en welke hou je dan in de instance?
Willekeur is ook wel een erg groot woord... :o

Of het een best practice is of niet weet ik niet, maar wat ik altijd doe:
Variabelen die ik op _iedere_ pagina nodig hebt steek ik in de sessie, vaak is dat dus alleen het uid en de username. Soms wil ik dan ook nog wel iets in de sessie stoppen wat ik _bijna_ op iedere pagina nodig hebt en dat kun je willekeur noemen inderdaad O-)

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • ZeroXT
  • Registratie: December 2007
  • Laatst online: 16:39
De meeste objecten kan je ook serializen en opslaan zodat deze uit de cache gehaald kan worden en weer als individueel object benaderd kan worden.

Ik ga er eigenlijk vanuit dat phpfastcache.com dit ondersteund.

Acties:
  • 0 Henk 'm!

  • Jboy1991
  • Registratie: September 2012
  • Laatst online: 19:03
Ik weet niet of het veilig hoe ik het doe

Maar ik check op elke pagina of een user is ingelogd. Zo ja dan sla ik in een array alle mysql data op van deze user

Op deze manier hoef ik dus bijv alleen dit te doen user["username"] etc

Acties:
  • 0 Henk 'm!

Verwijderd

Jboy1991 schreef op zaterdag 3 juni 2017 @ 11:38:
Ik weet niet of het veilig hoe ik het doe
Of je nou alleen de userid opslaat en aan de hand daarvan elke keer de database raadpleegt, of bij het inloggen de hele user in een session-variabele stopt maakt qua veiligheid niks uit - als een sessie gekaapt zou worden is de kaper in beide gevallen ingelogd als die gebruiker.

Het gaat puur om gemak wat dat betreft - pas als je echt grote aantallen bezoekers hebt gaat de impact op de database meespelen in die overweging.

Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 16:57

TheBorg

Resistance is futile.

Jboy1991 schreef op zaterdag 3 juni 2017 @ 11:38:
Ik weet niet of het veilig hoe ik het doe

Maar ik check op elke pagina of een user is ingelogd. Zo ja dan sla ik in een array alle mysql data op van deze user

Op deze manier hoef ik dus bijv alleen dit te doen user["username"] etc
Dat kan maar:
ZeroXT schreef op vrijdag 2 juni 2017 @ 13:11:
De meeste objecten kan je ook serializen en opslaan zodat deze uit de cache gehaald kan worden en weer als individueel object benaderd kan worden.

Ik ga er eigenlijk vanuit dat phpfastcache.com dit ondersteund.
Is echt veel makkelijker en je hebt geen db requests. Misschien 1 als de sessie ook in de db staat.

Hier staat een mooi voorbeeld:
https://stackoverflow.com...jects-in-a-session-in-php

[ Voor 4% gewijzigd door TheBorg op 03-06-2017 12:31 ]

Pagina: 1