En ole kovin kehittynyt koodaaja. Mutta haluaisin viedä tekeleeni nyt seuraavalle tasolle jos niin voi sanoa.
Minulla on Shellitissä php-pohjainen UI jolla teen kirjauksia ja muutoksia tietokantaan. Tämä on nopeaa ja simppeliä ja vaivatonta eikä sinänsä kaipaa muutoksia.
Systeemini pullonkaula on eräs taulukko johon lasketaan "kokoovia" tietoja. Niiden laskenta on hidasta ja kestää monta sekunttia. Nykyään ne lasketaan erään php tiedoston toimesta aina tietyssä kohtaa esimerkiksi kun teen kirjauksen.
Tällöin joudun odottamaan jopa 10 sekuntia. Ei kiva. Ajaxin avulla UI latautuisi heti mutta edelleen, 10 sekuntia, kun tiedot päivittyvät, ja täytyy odottaa niitä. Ei riitä.
Haaveilen tällaisesta setupista:
-Käytän sivua edelleen php-pohjaisella UI:lla
-php-pohjainen UI hakee kootut tiedot listoihinsa kooste-taulukosta
-kooste-taulukon sisältö päivitetään - minun ollessa kirjautuneena sisään - esimerkiksi minuutin välein
>> Kun menen sivulla eri osiin, siellä on aina korkeintaan muutaman minuutin vanha tieto. Tämä olisi täydellistä, ja UI hakisi tiedot taulukoista ja latautuisi tosi nopeasti. Taustalla tapahtuu se hidas työ, jota en joudu odottamaan.
Kävi mielessä:
A) Teen javascriptin joka suorittaa ollessani kirjautuneena sisään tietyin väliajoin php-tiedoston.
B) Teen serverille jonkun ohjelman tjs. joka tekee haluamani asiat.
Mutta kun en tiedä, mistä lähteä B:ssä liikkeelle. Minulla on olio-ohjelmointitaustaa, mutta ei juurikaan web-taustaa, siksi tämä kaikki on hieman uutta. Mitä mieltä olette?
10 sekuntia kuulostaa kovin pitkältä. Voi olla, että jo itse laskennassa olisi paljon kehittämisen varaa.
Jos muutoksia tapahtuu todella usein (esimerkiksi useita muutoksia minuutissa), voi olla ihan hyvä laskea kooste uudestaan säännöllisin välein. Jos muutoksia tapahtuu harvemmin, olisi ehkä viisaampaa laittaa kooste muodostumaan taustalla silloin, kun päivitys on tapahtunut. Joka tapauksessa on syytä tarkastaa, onko kooste jo valmiiksi ajantasainen, jotta päivitystä ei pyöritetä turhaan.
Yksi ratkaisu olisi siis tulostaa sivulle aina jokin kooste ja samalla tarvittaessa JS-koodi koosteen päivittämiseen.
<?php $kooste = hae_kooste(); echo '<div id="kooste">', $kooste->html(), '</div>'; if ($kooste->vanhentunut()) { echo ' <script> jQuery(function(){ $("#kooste").load("paivita_kooste.php"); }); </script> '; }
<?php # paivita_kooste.php $lukko = fopen(__FILE__, "r+"); while (true) { $kooste = hae_kooste(); # Jos kooste on vanhentunut, yritetään päivittää se. # (Jos kooste ei ole vanhentunut, ohitetaan tämä vaihe. if ($kooste->vanhentunut()) { ignore_user_abort(true); # Vain yksi voi päivittää kerrallaan. # Jos ei saada lukittua, odotetaan hetki ja palataan alkuun. if (!flock($lukko, LOCK_EX | LOCK_NB, $wouldblock) && $wouldblock) { ignore_user_abort(false); sleep(1); continue; } # Saatiin lukittua, päivitetään. $kooste->paivita(); flock($lukko, LOCK_UN); } fclose($lukko); echo $kooste->html(); break; }
Kiitos. Muutoksia tapahtuu oikeastaan vain silloin kun teen jotain. Eli puhutaan että joskus 0 päivässä, joskus 300 päivässä, joskus isoina röykkiöinä, joskus yksittäisinä - joskus tunnin ajan tulee useita minuutissa.
Joten ehkä tämä olisi järkevää niin että käyttäjän tehdessä asioita, minulla on jokin funktio joka kirjaa tietokantaan, että nyt pitäisi päivittää. Lisäksi päivän vaihtuessa, täytyy päivittää. Tällöin tuo 1min välein suoritettava php tarkistaisi aina ensin, että onko A) päivä vaihtunut tai B) onko "nyt pitäisi päivittää"-funktio tehnyt tietokantaan kirjauksen, että pitäisi päivittää - ja toimii tai on toimimatta.
Olet siis sitä mieltä että tuo jQuery load paivita_kooste.php on ihan pätevä tapa tehdä näin enkä riko jotain fundamentaalia koodaajien etikettiä?
Tein tuollaisen skriptin äsken ja olen nyt tekemässä systeemistä juurikin tällaista. Sitten vielä se. Että päivittää vain tarpeen tullen.
Tämä tuntuu oikealta ratkaisulta. Firebugin kanssa seurailen tämä touhuja.
Aiemmin olin palastellut tietojen koostelaskennan osiin, jolloin vain osa päivitettiin päivitysten yhteydessä ja niitä joutui odottamaan. Kesti yleensä 5-6 sekuntia.
Nyt kun tämä on käytössä niin kestää alle sekunti ladata sivu ja homma pelittää. Todella mainiota.
Voisi myös miettiä, että tarviiko koko settiä joka kerta laskea uudestaan, jos kerran muutoksia tulee lähinnä kun päivität jotain tietoa. Jospa sieltä päivittäisi vain tarpeelliset osat.
Toki jos tämä olisi hirveän hankalaa, niin tuo nykyinen tapasi on lienee riittävän hyvä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.