Fråga
Hur kan man få ett värde på en hemsida att uppdateras så fort som möjligt när en förändring sker i en MySQL DB utan att köra en fråga 1ggr/sek med AJAX?
Kan man göra en fråga med AJAX och serven väntar till förändring sker och skickar då tillbaks värdet?
Min hemsida: www.pchallen.com säg att vi vill ha en chatt men inte generera massa trafik om inget händer i chatten, men så fort något sker ska klienterna kunna se det omedelbart.
Svar
Hej Simon
Det finns många sätt att kommunicera till och från en webbserver till en webbsida. Man kan t ex låta ett PHP-skript skapa socket-connection mot en server, t ex via någon av dessa lösningar http://us2.php.net/manual/en/sockets.examples.php
Du nämner Ajax, så antar du är ute efter en ajax-lösning för kommunikation. Historiskt sätt har man forsökt lösa det genom att behålla uppkopplingen som skapas vid en HTTP-request och sen via det skicka nya meddelande.
Ett klassiskt sätt att använda den här tekniken är att ha en gömd iframe på sin hemsida, sedan låter man framen ta emot javascript som exekveras med tiden och uppdaterar innehållet för andra delar av webbsidan.
Nu förtiden så är det vanligare med så kallad ”long polling”, och många Ajax implementationer har realiserat det genom XMLHttpRequest, även känt som XHR. Long polling går ut på att man skickar ett asynchront meddelande, som servern tar emot, där meddelandet begär en signal från servern när och om något har inträffat. Sedan behöver klienten inte utföra något förrän servern hör av sig. Signalen som kommer tillbaka är en http: multipart/x-mixed-replace, som sedan kopplas in till en så kallad callback, dvs en specifik java script funktion, i det här fallet onreadystatechange. Däriifrån kan sedan webbsidan utföra uppdatera sig.
Dock finns det en nackdel med den här tekniken, t ex är den webbläsarspecifik. En lösning på problemet är att använda ett färdigt Ajax-paket. För en hel del av dessa ramverk med ajax-teknik tillhandahåller alternativa lösningar beroende på vilken webbläsare besökaren använder.
Ett färdigt ramverk du kan använda är http://xajaxproject.org/developer/q_no/Comet/comet.php Som du ser på deras webbsida så implementerar detta bibliotek en gömd iframe om besökaren kör Internet Explorer, annars så använder den XHR.
Sedan kan det vara en bra idé att leta efter andra lösningar. T ex behöver man inte använda en databas för att lagra chatt-meddelande. En idé kan vara att installera en jabber-server på din server, och sedan låter du en jabber-klient köra på webbsidan. Det ger dig även möjlighetatt chatta med dina besökare via en vanliga jabber-klient på datorn, med andra ord, du slipper själv vara online på webbsidan.
Jabber kommunicerar via xmpp-protokollet och det finns olika färdiga implementationer för att integrera det på webbsidan, t ex för php finns http://code.google.com/p/xmpphp/ och för ajax kan man tänka sig något i stil med http://code.google.com/p/ijab/. Den senare ser tyvärr ut att kräva att användaren kör eget konto osv. Antagligen hade du fått skriva om den en del. Rekommenderar dig att leta runder på nätet och se om du hittar ett färdigt bibliotek som passar ditt ändamål och behov, eller så använder du tidigare nämnda tekniker.
Lycka till