Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Berichten ophalen

Pagina: 1
Acties:

  • kevinkrs
  • Registratie: Juni 2010
  • Laatst online: 21-11 11:52
Beste tweaker,

Ik ben sinds kort bezig met een uitdaging, namelijk het maken van een 'realtime' ajax/javascript/php chatbox.
Het is al redelijk ver af, je kunt met elkaar chatten, maar niet zoals ik het wil.

Er wordt bij elk ajax request een query geopend, en alle berichten worden dan opgehaald.
Vervolgens wordt het div met het id çhatbox'(waar alle berichtenstaan) geleegd en alle berichten er opnieuw ingezet.

Dit is 'zwaar'en 'traag', athans het moet veel efficienter kunnen.
Nu is mijn vraag, waar ik mijn hersenen maar niet over kan breken, hoe zorg ik ervoor dat ik alle NIEUWE berichten (dus die nog niet in je chat zijn opgehaald) geselecteerd wordt uit de database en vervolgens onderaan de chat ingevoegd wordt.

Ik ben benieuwd hoe jullie zoiets zullen oplossen,

Met vriendelijke groet, Kevin.

Verwijderd

Ik neem aan dat je alle berichten in de database een unique id hebben. Als dit zo is dan kan je, elke keer als je de berichten ophaalt, het hoogste id in een variabele opslaan. Als je dan weer de berichten gaat ophalen, zorg je dat je met je query alle berichten selecteert die een hoger id hebben dan het id uit je variabele. Op die manier krijg je alleen de nieuwste berichten terug. Deze voeg je dan toe aan je div#chatbox, dat lijkt mij het handigst.

  • kevinkrs
  • Registratie: Juni 2010
  • Laatst online: 21-11 11:52
ja zoiets had ik ook in gedachte, eerst dacht ik het te kunnen doen met microtime. Maar als ik er goed over nadenk is het praktisch onmogenlijk aangezien er ook een maar milliseconden tussen het uitvoeren van bestanden zit.

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 16:27
Enkele opties hiervoor:

1. Gebruik maken van WebSocket's. Ze zijn nieuw, hip, nauwelijks ondersteunt, maar perfect voor asynchrone push updates vanaf een webserver. Serverside draait je applicatie continue, en zodra daar een bericht binnenkomt wordt het doorgestuurt naar alle verbonden clients. Enigszins simpel te maken met bijvoorbeeld JAVA, ware het niet dat het handshake protocol een grote berg prut is. Gelukkig zijn er kant-en-klare implementaties die je zo van het web kan plukken.

2. Elk bericht een uniek ID geven (bijvoorbeeld het insert-ID in je database). Elke keer als je de server vraagt om een nieuw bericht geef je het ID mee van het laatst-opgehaalde bericht. Serverside laad je vervolgens enkel nieuwe berichten in, die je append aan je div. Qua geheugengebruik is het dan alsnog wel een goed idee af en toe je div te legen, of een fifo queue te maken.

Serverside kan het nog wat efficienter door niet per request te werken, maar een langlopende thread te hebben die alle berichten bijhoudt en die je vervolgens ook weer uit kan lezen. PHP is niet de ideale taal hiervoor, maar het kan in principe wel.

//edit @ laat
Microtime is niet per definitie uniek per bericht. Een auto-increment ID gebruiken in je database is dan waarschijnlijk simpeler :)

[ Voor 8% gewijzigd door FragFrog op 26-01-2011 19:37 ]

[ Site ] [ twitch ] [ jijbuis ]


  • kevinkrs
  • Registratie: Juni 2010
  • Laatst online: 21-11 11:52
FragFrog schreef op woensdag 26 januari 2011 @ 19:34:
Enkele opties hiervoor:

1. Gebruik maken van WebSocket's. Ze zijn nieuw, hip, nauwelijks ondersteunt, maar perfect voor asynchrone push updates vanaf een webserver. Serverside draait je applicatie continue, en zodra daar een bericht binnenkomt wordt het doorgestuurt naar alle verbonden clients. Enigszins simpel te maken met bijvoorbeeld JAVA, ware het niet dat het handshake protocol een grote berg prut is. Gelukkig zijn er kant-en-klare implementaties die je zo van het web kan plukken.

2. Elk bericht een uniek ID geven (bijvoorbeeld het insert-ID in je database). Elke keer als je de server vraagt om een nieuw bericht geef je het ID mee van het laatst-opgehaalde bericht. Serverside laad je vervolgens enkel nieuwe berichten in, die je append aan je div. Qua geheugengebruik is het dan alsnog wel een goed idee af en toe je div te legen, of een fifo queue te maken.

Serverside kan het nog wat efficienter door niet per request te werken, maar een langlopende thread te hebben die alle berichten bijhoudt en die je vervolgens ook weer uit kan lezen. PHP is niet de ideale taal hiervoor, maar het kan in principe wel.

//edit @ laat
Microtime is niet per definitie uniek per bericht. Een auto-increment ID gebruiken in je database is dan waarschijnlijk simpeler :)
FragFrog schreef op woensdag 26 januari 2011 @ 19:34:
Enkele opties hiervoor:

1. Gebruik maken van WebSocket's. Ze zijn nieuw, hip, nauwelijks ondersteunt, maar perfect voor asynchrone push updates vanaf een webserver. Serverside draait je applicatie continue, en zodra daar een bericht binnenkomt wordt het doorgestuurt naar alle verbonden clients. Enigszins simpel te maken met bijvoorbeeld JAVA, ware het niet dat het handshake protocol een grote berg prut is. Gelukkig zijn er kant-en-klare implementaties die je zo van het web kan plukken.

2. Elk bericht een uniek ID geven (bijvoorbeeld het insert-ID in je database). Elke keer als je de server vraagt om een nieuw bericht geef je het ID mee van het laatst-opgehaalde bericht. Serverside laad je vervolgens enkel nieuwe berichten in, die je append aan je div. Qua geheugengebruik is het dan alsnog wel een goed idee af en toe je div te legen, of een fifo queue te maken.

Serverside kan het nog wat efficienter door niet per request te werken, maar een langlopende thread te hebben die alle berichten bijhoudt en die je vervolgens ook weer uit kan lezen. PHP is niet de ideale taal hiervoor, maar het kan in principe wel.

//edit @ laat
Microtime is niet per definitie uniek per bericht. Een auto-increment ID gebruiken in je database is dan waarschijnlijk simpeler :)
Dat php niet de juiste taal is, maakt het juist een uitdaging.
Het werkt voor de rest wel prima, op dan dat selecteren na, ik heb wel ongeveer een idee hoe het zou kunnen.

Ik ben trouwens wel bezig met java leren, alleen ik ben nog allang niet ver genoeg gevorderd om dat te kunnen maken in java.

Trouwens auto-increment heb ik standaard als colum in mijn database :9

Voor de rest dacht ik dan al: In de while loop de laatste ID ophalen (laatste bericht is dus laatste id) en in de query te doen: mysql_query("blaat WHERE `id` > '".$varid."' ");

Ongeveer zo zou het moeten kunnen lukken, of zou het nog anders kunnen/moeten?

  • Cartman!
  • Registratie: April 2000
  • Niet online
APE (Ajax Push Engine) is wat je wilt gebruiken denk ik: http://www.ape-project.org/

heb er in een uurtje een simpele chat mee gemaakt met joinen/parten van channels en berichten versturen binnen die channels.
Pagina: 1