Woy schreef op dinsdag 03 maart 2009 @ 20:07:
Ook bij andere omgevingen moet je daar mee oppassen, als je in Asp.NET bijvoorbeeld gebruik maakt van een state-server worden de object ook gewoon ge-(de)serializeerd. JSP zal vast ook iets dergelijks kennen om server-farms te ondersteunen.
Ik vind het zelfs vrij eng klinken om resources via sessies ongedefinieerd lang en een ongedefinieerd aantal ervan open te laten zijn. Zeker met sockets, verbindingen databases en file handles moet je daar erg mee oppassen lijkt me zo. Het is tenslotte niet zo dat je de garantie krijgt dat een gebruiker weer terugkeert of nog even laat weten dat ie het voor gezien houdt, zodat je goed kan voorspellen dat bepaalde resources opgeruimd of vrijgegeven kunnen worden.
Wel kan het nuttig zijn om bepaalde zaken een langer leven te geven, terwijl je bij PHP eigenlijk altijd objecten uit een of andere serialized omgeving zult moeten halen (memcached en locale cachende omgevingen serializen doorgaans ook) als ze langer moeten blijven "leven" en dus ook "gedeelde" resources in principe altijd opnieuw aangemaakt moeten worden (vandaar ook dat MySQL zo goed aansluit bij PHP, die heeft een bijzonder goedkope verbindingscall).
Eigenlijk is het iets meer omgekeerd, een pagina heeft voor elk nieuw stukje data ruimte nodig en dat wordt dan voor die pagina gereserveerd (tot de memory_limit wordt gehaald). Binnen die geheugenruimte kan je wat sturen met het aanroepen van unset en/of het overschrijven van waarden, maar uiteindelijk wordt het inderdaad allemaal weer weggegooid als de complete pagina-request is verwerkt.
doeternietoe schreef op dinsdag 03 maart 2009 @ 17:57:
Het is mogelijk om objecten in sessies op te slaan zodat ze bij een volgende aanroep weer beschikbaar zijn. Dit brengt echter veel nadelen met zich mee. Er kan bijvoorbeeld onvoorspelbaar gedrag optreden als er een klasse gewijzigd is en er nog objecten van de oude klasse bestaan. Deze werkwijze is dus niet aan te raden en meestal ook niet nodig.
Veel nadelen? Je moet zeker oppassen met serialized objecten (maar dat moet je in elke omgeving), maar afgezien daarvan hoeft een sessie-systeem niet echt nadelen te hebben, zolang je maar weet wat je doet en je rekening houdt met het feit dat alle data in je sessie steeds opnieuw serialized en unserialized zal worden.
Ook zou het proces moeten stoppen als de gebruiker de verbinding verbreekt. Bij veel PHP applicaties is dat niet het geval.
Daar hebben PHP-applicaties zelf, vziw, bijzonder weinig invloed op. Tenzij ze allemaal structureel ignore_user_abort() aanroepen, maar zelfs dan zullen ze over het algemeen wel een keer eindigen, zij het wat later dan de verbroken verbinding.
PHP is verder inderdaad zo opgezet dat het verbindingen die je open hebt laten staan uiteindelijk ook wel sluit voor ie helemaal stopt.