Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Comet, Tietokanta ja päivitettävä taulu

Sivun loppuun

stageradio [24.08.2011 14:42:23]

#

Hei,

Osaisiko joku neuvoa miten päästä alkuun ongelmani kanssa:

Tarkoitus olisi tehdä taulukko, jota päivitetään usean käyttäjän toimesta jatkuvalla syötöllä, niin että muiden tekemät muutokset päivittyvät heti omalle selaimelle ilman sivunlatauksia. Eli siis Cometin kaltaista ratkaisua haetaan.
Kaikki siis päivittävät samaa tietokantaa ja muutokset näkyvät muiden koneilla välittömästi.

En vain oikein pääse liikkeelle..

Tekniikan ymmärrän jollain tasolla. Selain avaa yhteyden ja jää odottamaan serveriltä päivitystä, mutta miten tämä päivitys tulisi toteuttaa?

Toinen kysymys on, että miten olisi mahdollista että ainakun päivitys serveriltä tulee, niin ropellettaisiin vain kenttiä joita muutos koskee..

Kiitos.

Lebe80 [24.08.2011 15:24:09]

#

Kannattaa tutustuttaa itsensä tekniikkaan nimeltä Ajax.

http://api.jquery.com/jQuery.ajax/


Helpoiten tämä onnistuu esim. jQuery -ajax-kirjaston avulla, jolloin voit päivittää sivua muutaman sekunnin välein esim. ihan korvaamalla tietyn alueen nettisivusta lataamalla sen "ajaxilla" html-muodossa, jos ei jaksa parsia tulevaa dataa.

Tietenkin voit hakea dataa myös json-muodossa, ja käpistellä siitä dataa haluamiisi kenttiin.

jlaire [24.08.2011 17:44:29]

#

Jos pieni viive muutosten näkymisessä ja pieni lisärasite palvelinpäässä eivät haittaa, kannattaa unohtaa Comet ja tehdä kuten Lebe80 ehdotti. Datan pyytäminen muutaman sekunnin välein on todella helppo toteuttaa molemmissa päissä.

stageradio kirjoitti:

Tekniikan ymmärrän jollain tasolla. Selain avaa yhteyden ja jää odottamaan serveriltä päivitystä, mutta miten tämä päivitys tulisi toteuttaa?

for (;;) {
    if (muutos_tapahtunut()) {
        print(hae_muutokset_kannasta());
        break;
    }
    sleep(0.5 sekuntia);
}

Lisäksi silmukka kannattaa lopettaa jos muutoksia ei ole tapahtunut esim. 60 sekuntiin; voi tulla ongelmia, jos pitää HTTP-pyyntöä loputtoma pitkään hengissä. Kannattaa testata huolellisesti eri selaimilla.

Kun JavaScript saa ajax-pyyntöönsä vastauksen, joka voi siis timeout-tapauksessa olla tyhjä, se lähettää välittömästi uuden pyynnön.

Jos tällainen silmukka on liian raskas, voi miettiä tehokkaampia toteutustapoja.

stageradio kirjoitti:

Toinen kysymys on, että miten olisi mahdollista että ainakun päivitys serveriltä tulee, niin ropellettaisiin vain kenttiä joita muutos koskee..

Suosittelen if-rakennetta.

stageradio [24.08.2011 21:05:46]

#

Kiitokset vastauksista.

Pienenä tarkennuksena, että datan määrä ei ole kovin pieni, joten en mielellään sitä parin sekunnin välein haluaisi latailla.. kyse parhaimmillaan paristatuhannesta rivistä ja solujakin parisenkymmentä kussakin. Käyttäjiä ei tosin montaa tule olemaan, mutta kuitenkin.

Suurimpana kysymyksenä onkin että miten tietokantaa (php:n puolella) haistellaan päivitysten varalta. Tähän on varmasti jokin järkevä toiminto olemassa.. vai?

Grez [24.08.2011 21:10:53]

#

Yleisesti ottaen "tietokannan haistelu" on mahdollista toteuttaa esim. timestamp-sarakkeella (eli sarakkeella joka saa viimeisimmän ajan kun riviä päivitetään) ja hakemalla kyselyllä rivit joissa timestamp on suurempi kuin edellisen haun suurin timestamp tms.

jlaire [24.08.2011 21:15:29]

#

No mikset lataa pelkästään muuttuneita tietoja? Doctor, it hurts when I do this...

stageradio [24.08.2011 21:54:47]

#

Tokihan sen voisi toteuttaa niinkin, mutta kuitenkin sisälläni palaa halu oppia tekemään se taka-alalla ja vaikeimman kautta :D

Timestamp tyyli voisi olla toimiva. taidampa lähteä siitä liikkeelle.
Ymmärtääkseni serveri ei edes kuormitu liikaa jos tätä 2-5 sekunnin välein ajaa ja jos sitten niitä päivityksiä tulee niin sitten lähettää niitä käyttäjän selaimelle.

Ajatuksena olisi tehdä vielä joku hauska väri ilmoitus (css3:lla??) riveille jotka ovat muuttuneet (mielummin vielä pelkät muuttuneet solut), mutta sille taisin jo keksiä ratkaisun.

Jep jep .. takaisin koodaamaan :)

Lebe80 [25.08.2011 10:31:31]

#

Ja sitten joukkoon jonkin sortin käyttöliittymäpohdintaa:
Eli pitääkö softassa välttämättä palautella "tuhansia" rivejä dataa kerralla?

Voisiko tässäkin miettiä miten datan järjestelee ja miten sitä näyttää ruudulla. Esim. jonkin sortin sivutustoiminto tms.

stageradio [25.08.2011 12:40:33]

#

Kyllähän tuota pohdintaa on tullut harjoitettua. Kaikki tieto jota ei välttämättä heti tarvitse nähdä piilotetaan ja otetaan sitten esille javascriptillä. Esillä tulee todennäköisesti olemaan jotain 50-200 rivin välillä ja sitä en lähde sivuiksi lohkomaan.

Kyse hieman monimutkaisesta kokonaisuudesta, mutta hyvällä suunnittelulla siitä kyllä hyvä tulee :D

punppis [26.08.2011 09:23:18]

#

Kaikki palvelimet/selaimet (en nyt osaa sanoa kummasta johtuu) eivät ainakaan suoraan tue tuota comet-tekniikkaa. Ainakin joskus kun testasin tuollaista while-loopilla toimivaa skriptiä, niin data tuli selaimelle vasta kun skriptin lopetti toimintansa. Dataa ei siis lähetetty kesken skriptin suorituksen.

Itse tekisin tuon siten, että aluksi lataisin kaikki rivit tietokannasta ja muutaman sekunnin välein lisäisin taulukkoon aina uudet rivit. Turhahan sieltä on samoja rivejä hakea uudestaan, jos niitä ei ole muokattu. Helposti menee servun kapasiteettia hukkaan, jos vaikka 100 käyttäjää lataa 5 sekunnin välein 2000 samaa riviä uudestaan. Tämä on helppo toteuttaa esim. jos tietokantaan on tallennettu tiedon syöttämisen aika tai id-numero on tyyppiä auto_increment.

Metabolix [26.08.2011 16:17:54]

#

punppis kirjoitti:

Dataa ei siis lähetetty kesken skriptin suorituksen.

No mutta tuossahan on nimenomaan ideana lopettaa skriptin suoritus siinä vaiheessa, kun dataa löytyy. Ei pitäisi olla mitään ongelmia.

Grez kirjoitti:

Yleisesti ottaen "tietokannan haistelu" on mahdollista toteuttaa esim. timestamp-sarakkeella

Ainakin MySQL:ssä TIMESTAMP (ja muut vastaavat) antavat leiman vain sekunnin tarkkuudella, jolloin pelkkä edellistä vastausta suurempien hakeminen voi jättää välistä rivejä, jotka on lisätty pari sadasosaa myöhemmin mutta samalla sekunnilla kuin viimeisin vastaus. Ongelman voi ratkaista käyttämällä aikaleiman sijaan juoksevaa numeroa, mistä on toki ylimääräistä vaivaa silloin, kun päivitetään vanhoja rivejä. Toinen vaihtoehto on palauttaa selaimelle tiedot sekunnin myöhässä, jottei samalle sekunnille voi enää tulla muutoksia.

kinnala [26.08.2011 16:20:33]

#

punppis kirjoitti:

Kaikki palvelimet/selaimet (en nyt osaa sanoa kummasta johtuu)

Apachen kanssa ilmeisesti ainakin tulee vastaan ongelmia koska se luo defaulttina prosessin jokaista yhteyttä kohti -> muisti loppuu palvelimesta kun yhteyksien määrä kasvaa ja niitä pidetään auki.

Kun etsii hakusanalla "XMLHttpRequest long polling" niin löytyy aika paljon esimerkkikoodia. Käytännössähän siis tekniikan idea on luoda request palvelimeen AJAXin avulla ja odottaa kunnes palvelin siihen vastaa. Aina kun palvelimelta saadaan vastaus niin luodaan valmiiksi uusi request odottamaan seuraavaa tapahtumaa.

Node.js olisi kuin luotu tällaiseen. ;-) Käsittääkseni Scalan Lift käyttää myös aika runsaasti Cometia.

Blaze [26.08.2011 20:12:06]

#

punppis kirjoitti:

Kaikki palvelimet/selaimet (en nyt osaa sanoa kummasta johtuu) eivät ainakaan suoraan tue tuota comet-tekniikkaa. Ainakin joskus kun testasin tuollaista while-loopilla toimivaa skriptiä, niin data tuli selaimelle vasta kun skriptin lopetti toimintansa. Dataa ei siis lähetetty kesken skriptin suorituksen.

Arvaan: käytit PHP:ta ja output buffering oli päällä?

stageradio [31.08.2011 13:17:37]

#

Nyt kun tutkistelin kinnalan mainitsemaa Node.js:sää nii täytyy sanoa että tekisi mieli aloittaa kokonaan alusta, opiskella tuota ja tehdä se sillä. Varsinkin kun projekti on vielä ihan aluillaan.

Onko kellään kokemuksia tuosta? Voitteko suositella?

jlaire [31.08.2011 17:49:13]

#

Merkittävin ongelma on kirjastojen vähäisyys, mutta jos se ei haittaa niin suosittelen kyllä. Joskus joutuu tekemään samoja asioita selaimessa ja servulla, ja vaikka Node.js laajentaakin JavaScriptiä joillain tavoilla niin samaa koodia voi usein käyttää selaimessakin jos on tarvetta.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta