Ucitavanje velikih podataka iz MySQL-a pomocu ajaxa

Ucitavanje velikih podataka iz MySQL-a pomocu ajaxa

offline
  • Pridružio: 26 Avg 2007
  • Poruke: 13

Pozdrav svima. Radim jedan web sajt sa mysql bazom. Zamisljeno je da sve bude "uzivo", tj. da se na svakih 5 sekundi citaju podaci iz baze preko ajaxa. Sajt je slican nekom chat-u, pa je potrebno da prikazuje sve podatke u odredjenoj sobi. Ja sa ajax-om pozivam php fajl koji mi vraca sve podatke iz baze pomocu query-ja. Moje pitanje je, da li ce usporiti i opteretiti server i bazu veliki broj upita i koje je optimalno vreme pozivanja php fajla putem ajax-a, kao i da li treba uvek citati sve podatke ili treba citati samo nove pomocu OFFSET-a?

MySQL:
"SELECT * FROM mesage WHERE Ime = 'Bla bla' AND Pregledi = 0 ORDER BY DatumPoruke ASC"

Javascript (ajax):
function porukice() { if (window.XMLHttpRequest)   {// code for IE7+, Firefox, Chrome, Opera, Safari   xmlhttp=new XMLHttpRequest();   } else   {// code for IE6, IE5   xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");   } xmlhttp.onreadystatechange=function()   {   if (xmlhttp.readyState==4 && xmlhttp.status==200)     {     document.getElementById("novaporuka").innerHTML=xmlhttp.responseText;     setTimeout('porukice()', 5000);     } xmlhttp.open("POST","poruke.php?ime="+<?php echo $_GET['ime']?>,true); xmlhttp.send(); }

Da napomenem da je u pitanju veliki broj upita ka bazi i veliki broj podataka u bazi.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3664
  • Gde živiš: 127.0.0.1

Ukoliko ocekujes veliki broj poseta, i veliki broj razmenjenih poruka, PHP + MySQL za chat je daleko od dobrog resenja. Ja bih u ovakvoj situaciji pre isao na kombinaciju Node.js + Socket.io (server-side JavaScript).

U tom slucaju - ides obrnutom logikom: ne zoves server na svakih 5 sekundi da proveris ima li sta novo, vec server obavestava klijente o novim porukama u realtime-u. Ako nema novih poruka npr 15 minuta - nista se apsolutno ne desava.

Druga stvar je to sto ti baza u stvari ne treba. Napises poruku, lupis enter, tvoj klijent emituje event i podatke ka serveru. Server ceka event, kad naidje - prosledi svim ili nekim klijentima poruku. Sve je asinhrono.

Tutorial za multi-room chat server mozes da pogledas ovde: http://psitsmike.com/2011/10/node-js-and-socket-io-multiroom-chat-tutorial/



offline
  • Pridružio: 26 Avg 2007
  • Poruke: 13

Rastafarii, hvala na odvojenom vremenu. Ovo što ja pravim nije klasični čet već više nešto kao wall post na faceu ili neki forum, tako da tu neće poruke stizati svake sekunde. Slab sam sa javom. PHP, MySQL znam vrlo dobro, i malo java script-e, pa se sada ne bi upuštao u neka nova učenja, a i projekat je pri kraju, pa je sada kasno sve menjati. Da li po vama treba da povećam vreme provere (tako da bude manje upita ka bazi), i koje je vreme optimalno postaviti? Interesuje me da li ovaj kod što sam postavio po vama ima nekih rupa koje mogu da se zloupotrebe? Hvala svima unapred.

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3664
  • Gde živiš: 127.0.0.1

Ovo sto sam ti ja predlozio nija Java, vec bas Javascript. Java i Javascript, osim 4 ista slova u nazivu, nemaju nista zajednicko.

U slucaju da koristis PHP + MySQL, nema potrebe da svaki put iscitavas sve poruke za odredjenog korisnika - koristi vreme poslednje iscitane poruke tako da prikazes samo nove. Ovo, naravno, vazi pod pretpostavkom da prilikom upisivanja nove poruke cuvas i vreme kad je napisana.

offline
  • Pridružio: 26 Avg 2007
  • Poruke: 13

Rastafarii, hvala ti na predlogu. Predpostavio sam i ja da ne treba uvek ucitavati sve podatke iz baze, vec samo nove. Tu mi se javlja novi problem. Naime sada sam uradio da se u zahtev salje i timestamp poslednje poruke, ali mi se sada vracaju samo novi podaci, dok se svi stari obrisu. Kako da zadrzim stare poruke koje su vec bile prikazane, i da na njih dodajem samo nove. Evo i koda:

function porukice() { if (window.XMLHttpRequest)   {// code for IE7+, Firefox, Chrome, Opera, Safari   xmlhttp=new XMLHttpRequest();   } else   {// code for IE6, IE5   xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");   } xmlhttp.onreadystatechange=function()   {   if (xmlhttp.readyState==4 && xmlhttp.status==200)     {     document.getElementById("poruke").innerHTML=xmlhttp.responseText;     setTimeout('porukice()', 5000);     } xmlhttp.open("POST","poruke.php?ime="+<?php echo $_GET['ime']?>&vre=<?php echo $_GET['vreme']?>,true); xmlhttp.send(); }

$Poruke = "SELECT * FROM mesage WHERE Ime = 'Bla bla' AND Pregledi = 0 AND DatumPoruke > 'vreme poslednje poruke'  ORDER BY DatumPoruke ASC" echo "<div id='poruke' align='center'>".$Poruke."</div>";

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3664
  • Gde živiš: 127.0.0.1

Umesto

document.getElementById("poruke").innerHTML=xmlhttp.responseText;

stavi:

document.getElementById("poruke").innerHTML+=xmlhttp.responseText;

jedan jedini + ispred znaka jednako pravi razliku

offline
  • Pridružio: 26 Avg 2007
  • Poruke: 13

hvala puno Smile

Ko je trenutno na forumu
 

Ukupno su 402 korisnika na forumu :: 17 registrovanih, 3 sakrivenih i 382 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: Bogoslov, cole77, Dorcolac, GveX, HrcAk47, Insan, Kaneda, kolateralnasteta, kuntalo, Marko Marković, Recce, Staki00, Toper, Trpe Grozni, vlad the impaler, vlvl, Wisdomseeker