[PHP/Javascript] Auto-refresh als nieuwe data beschikbaar is

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dag allen,

Momenteel werk ik aan een Javascript applicatie (PHP back-end) waarin diverse modules aan de gebruiker worden getoond. De modules bestaan uit DIV elementen, die d.m.v. AJAX requests gevuld worden. Tot dusver geen problemen, alles werkt naar behoren.

Echter, de data die getoond wordt is vrij dynamisch. Soms kan de data meerdere malen per minuut wijzigen (in de database), maar dit hangt af van vele factoren. Het kan ook voorkomen dat er tientallen minuten niets wijzigt.

Het is van belang dat de data die getoond wordt zo up-to-date mogelijk is.

Een client-side georiënteerde oplossing is het maken van een nieuwe request voor iedere afzonderlijke module, iedere n-seconden (statische interval). Echter, als de data tientallen minuten niet wijzigt, is dat niet nodig. Daar komt bij dat als er vele gebruikers zijn, die ieder laat-zeggen 6 modules open hebben staan, het aantal requests noemenswaardig zal zijn.

Ik heb tevens gedacht aan het periodiek (iedere n-seconden) versturen van 1 request, waarbij gecontroleerd wordt of er nieuwe data beschikbaar is voor een van de geopende modules. Als dat het geval is, pas dan wordt de relevante module daadwerkelijk opnieuw geladen (na de initiële 'pilot' request).

En de laatste oplossing, waarover graag jullie mening, is een server-side georiënteerde oplossing: het laten draaien van een service (PHP, Nodejs) die met bepaalde regelmaat controleert of er nieuwe data aanwezig is. De service triggered in het geval van nieuwe data een event dat wordt opgepikt door de client side applicaties, die luisteren naar dat event.

Hebben jullie ervaring met dit probleem?
Wellicht zit ik op een verkeerd spoor :)

Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 03-09 15:40
Naar mijn weten gebruiken alle sites die content op de achtergrond refreshen een vaste interval. Een variabele interval is alleen mogelijk wanneer je kan voorspellen of de data gaat wijzigen of niet. Aangezien dit (bijna) nooit het geval is, denk ik dat je het beste kan gaan voor de "pilot" request op een vaste interval.
Serverside een event triggeren wat clientside wordt opgevangen is volgens mij niet mogelijk met javascript. Je zou dan een constante verbinding open moeten houden, maar dan is het efficiënter om op een interval te controleren of er updates zijn.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Met node.js kun je volgens mij gewoon pushen naar de client op een efficiente manier. Je kunt ook kijken naar APE Server (gratis ook) of Beaconpush (betaald geloof ik).

Polling is een geinige techniek maar is niet echt schaalbaar op een standaard webserver die hier niet voor geoptimaliseerd is.

Acties:
  • 0 Henk 'm!

  • MuddyMagical
  • Registratie: Januari 2001
  • Laatst online: 11-09 19:11
Is het niet makkelijker om een timestamp te maken bij een update van de gegevens.
Dan kan je de pagina elke 30 seconden ofzo laten controleren of de timestamp die ergens hidden in de pagina zit gelijk is aan de timestamp op de server / database.
Zo niet, dan alle data ophalen.

Acties:
  • 0 Henk 'm!

  • joppybt
  • Registratie: December 2002
  • Laatst online: 09:33
Robbiedobbie schreef op woensdag 14 maart 2012 @ 17:58:
Serverside een event triggeren wat clientside wordt opgevangen is volgens mij niet mogelijk met javascript. Je zou dan een constante verbinding open moeten houden, maar dan is het efficiënter om op een interval te controleren of er updates zijn.
Zo vreemd is dat niet hoor, zoek maar eens op Comet.
Daarmee houdt je daadwerkelijk een verbinding naar de server open.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Cartman! schreef op woensdag 14 maart 2012 @ 18:04:
Polling is een geinige techniek maar is niet echt schaalbaar op een standaard webserver die hier niet voor geoptimaliseerd is.
Long polling bedoel je dan. Polling is een gewone request, daar zijn webservers voor gemaakt.

Node.js is erg flexibel. Ik heb met socket.io eens een testje gedaan, en dan kun je met één thread regelmatig via SQL kijken of er updates zijn, en die dan naar alle clients pushen. De vraag is of je het nodig hebt, want als het aantal users niet bijzonder groot is dan werkt polling ook prima.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
GlowMouse schreef op woensdag 14 maart 2012 @ 18:14:
Long polling bedoel je dan. Polling is een gewone request, daar zijn webservers voor gemaakt.
De gebruikelijke webservers (apache, iis) zijn er niet voor gemaakt met veel users iedere seconde te gaan pollen, dat schaalt niet. Daarom heb je dus de alternatieven die ik noemde die specifiek voor dat doel gemaakt zijn.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Cartman! schreef op woensdag 14 maart 2012 @ 18:21:
[...]

De gebruikelijke webservers (apache, iis) zijn er niet voor gemaakt met veel users iedere seconde te gaan pollen, dat schaalt niet. Daarom heb je dus de alternatieven die ik noemde die specifiek voor dat doel gemaakt zijn.
Iedere seconde is dan ook voor 9 van de 10 denkbare toepassingen gewoon niet zinnig. In veruit de meeste gevallen zal een keer per 5 of 10 seconden al ruim voldoende zijn. En dat schaalt best; tegen de tijd dat je genoeg bezoekers hebt om daar een webserver mee op te blazen geef je graag wat extra geld uit voor nog wat hardware.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • t_captain
  • Registratie: Juli 2007
  • Laatst online: 11-09 22:49
Met HTTP ben je gebonden aan polling via AJAX. Met SPDY kun je pushen vanuit de server. Moet je wel een server hebben die het protocol ondersteunt, en de gebruiker van je site moet Chrome gebruiken.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Met een comet-server heb je dat extra geld helemaal niet nodig, het kan gewoon naast apache draaien. Best tool for the best job imo. Waarom pollen als je kunt pushen?

Acties:
  • 0 Henk 'm!

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Cartman! schreef op woensdag 14 maart 2012 @ 20:02:
Waarom pollen als je kunt pushen?
Kleine nuance:
Technische gezien is op HTTP niveau een push 'request', vaak gewoon aan antwoord op een long-polling request. Dat je daar de juiste software voor nodig hebt (plus een extra IP om ook op poort 80 te kunnen draaien) ben ik het wel mee eens. ;)

On track


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Als je niet aan oude browsers vastzit, kan je websockets gebruiken. Die zijn er precies voor gemaakt :)

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
WouZz schreef op woensdag 14 maart 2012 @ 20:17:
[...]

Kleine nuance:
Technische gezien is op HTTP niveau een push 'request', vaak gewoon aan antwoord op een long-polling request. Dat je daar de juiste software voor nodig hebt (plus een extra IP om ook op poort 80 te kunnen draaien) ben ik het wel mee eens. ;)
True, een slimme webserver slim framework gebruikt dat alleen als het niet anders kan (moderene browsers ondersteunen zoals gezegd wordt bijv. websockets). En een server die geoptimaliseerd is voor push (danwel longpolling) kan veel meer van zulke requests aan dan standaard apache.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Veel dank iedereen.
Hierbij enkele handige links die ik heb gevonden naar aanleiding van jullie input.

http://net.tutsplus.com/t...g-html5-websockets-today/
http://socket.io/

Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 14:37

TheNephilim

Wtfuzzle

Wij gebruiken op dit moment http://www.ape-project.org/ voor chat en enkele andere dingen die eigenlijk per interval gechecked moeten worden.

http://pusher.com/ is een betaalde variant, maar daar heb je niks met servers ofzo te doen. Dus je ontwikkeld hier alleen de webkant. Je hoeft geen comet/push server op te zetten in eigen beheer.

Verder is het belangrijk hoe vaak er nieuwe gegevens zijn, als de kortste periode 3 seconden is, kun je met nette JSON requests vaak prima werken met polling.
Mocht het toch veel data zijn, dan is er nog een oplossing die helpt; een hash maken van de data. De client checked de hash, en haalt de 1e keer de data op. Vervolgens word er (bijv.) elke 10 seconden gekeken of de hash veranderd is. Pas als de hash veranderd word de complete dataset opgehaald.
Zo voorkom je dat je steeds alle data stuurt als het eigenlijk niet nodig is.
Pagina: 1