Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
warwas
HV Guru

liitunud: 06.07.2003
|
14.09.2009 00:25:43
jQueryUI Progress Bar ja PHP tsükkel - kas toimivad koos? |
|
|
Leheküljel tõmmatakse jQuery $.get() abil käima üks PHP tsükkel.
Praeguses testüsteemis on tsükli jooksutamiseks vajalik aeg suht lühike, küll aga kui asi live'i läheb, siis see aeg pikeneb kordades. Ehk siis oleks vaja mingit tagasisidet kui kaugel tsükkel omadega on.
Tekkis mõte, et poogiks sinna kuidagi jQueryUI pakutava Progress Bar'i külge. Probleem aga tekkis "progressi" väärtuse teada saamisega (PHP tsükkel ei väljasta ju reeglina enne lõppu mitte piiksugi infot).
Ehk siis:
1) kas on kuidagi võimalik tsüklist vahepeal mingit infot kätte saada?
2) kuidas seda infot Progress Bar'ile ette sööta?
|
|
Kommentaarid: 247 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
3 :: |
224 |
|
tagasi üles |
|
 |
Andrus Luht
itimees.ee

liitunud: 11.06.2002
|
|
Kommentaarid: 377 loe/lisa |
Kasutajad arvavad: |
   |
:: |
5 :: |
1 :: |
318 |
|
tagasi üles |
|
 |
warwas
HV Guru

liitunud: 06.07.2003
|
14.09.2009 10:05:48
|
|
|
BReaK da iCE kirjutas: |
Kirjelda seda tsüklit. |
kõige labasem for-tsükkel. Lihtsustatuna midagi sellist:
php:
|
for($i=0; $i<$ringide_arv; $i++) { tee_midagi(); tee_veel_midagi(); }
|
Idee poolest saaksin ju "$"i ja "$ringide_arv" abil vabalt selle protsendi välja arvutada. Ainus küsimus on selles, kuidas ma selle protsendi iga ringi lõpus välja "köhin".
|
|
Kommentaarid: 247 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
3 :: |
224 |
|
tagasi üles |
|
 |
Andrus Luht
itimees.ee

liitunud: 11.06.2002
|
|
Kommentaarid: 377 loe/lisa |
Kasutajad arvavad: |
   |
:: |
5 :: |
1 :: |
318 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
14.09.2009 21:21:36
|
|
|
BReaK da iCE esimene link on täitsa asjakohane, teine samas täiesti teemast mööda.
Kuid esimese põhjal annab vast ehitada asja, mida sul vaja. Üksnes selle asemel et saata pilte, saadab PHP väikesi JavaScripti lõike; ning selle asemel, et laadida kogu lehekülg, luua lehele hoopis tilluke iframe.
html:
|
// start loading by creating iframe function start() { var iframe = document.createElement("iframe"); iframe.id = "loader"; iframe.src = "pushlet.php?r="+Math.random(); iframe.width = 0; iframe.height = 0; document.body.appendChild(iframe); } // Assign the following methods to window, // to make them accessible from iframe. // updates progress bar window.update = function(n) { document.getElementById("progress").innerHTML = n + "%"; } // removes the iframe after we are done window.finish = function() { var iframe = document.getElementById("loader"); document.body.removeChild(iframe); } </script> </head> <button onclick="start();">Start </button> </body> </html>
|
pushlet.php:
php:
|
<?php for ($i=10; $i<=100; $i+=10) { // call the update method of parent window echo "<script> parent.update($i); </script>\n"; } echo "<script> parent.finish(); </script>\n"; ?>
|
Mingi kaunis lahendus see just pole, aga testisin ja töötas. Aga ega ma väga paljude brauseritega just ei testinud, kuid peaks toimima.
--> Panin näite veebi üles kah.
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
linnumees
HV kasutaja
liitunud: 15.06.2005
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
14.09.2009 22:56:18
|
|
|
nene, tõenäoliselt oleks targem ehk iframe asemel kasutada jQuery ajaxipoolt?
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
14.09.2009 23:10:39
|
|
|
mikk36 kirjutas: |
nene, tõenäoliselt oleks targem ehk iframe asemel kasutada jQuery ajaxipoolt? |
iframe on oluline koostisosa, sest selle sisuks olevat koodi hakkab brauser renderdama niipea kui see kohale jõuab, ootamata ära kogu dokumendi laadmist, ning seda meil ongi vaja. XmlHttpRequesti puhul ootab aga brauser kuni server on kogu töö lõpetanud, millest meil antud juhul pole miskit kasu.
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
inzinz
HV kasutaja
liitunud: 26.01.2005
|
15.09.2009 10:25:24
|
|
|
Aga nene, kas tohib küsida, miks ikkagi oleks just vaia kasutada seda push lähenemist, et ühendus kogu aeg lahti oleks ?? Eriti veel pikaldaste protsesside puhul, kus see jääb tõenäoliselt päris pikaks ajaks lahti...
Idee push'il on hea, et kohe kui update/staatusemuutus tuleb serverist, kohe klient näeb, reaalsuses aga tõmbab aktiivse ühenduse lahti hoidmine serveri omajagu kooma, eriti kui kasutuses on tavaline apache ja lehte kasutavad üle paarikümne inimese. Ja siis sealt koomas olekust üle saamiseks tuleb hakata teisi veebiservereid proovima mis paremini connectioneid lahti hoida suudavad, või kood ümber teha (kumbki pole eriti hea tegevus ).
Ja pealegi, kui see push ühendus ära katkeb, siis tuleb js ja php pool tõenäoliselt eriloogikat teha vms, et siis staatust edasi küsida saaks. Stateless pull tundub igatahes mõttekam lähenemine...
html:
|
var last_status_time = (new Date()).getTime(); function getStatus() { var mytime = (new Date()).getTime(); $.get('http://mingiaadress', {}, function(data) { if(mytime >=last_status_time) {//kui üks request on toppama jäänud ja järgmine request on läbi läinud uuema statuse infoga, siis vana requesti ei töötle last_status_time = mytime; //siia siis json data käsitlemise loogika, progressbari update vms } }, 'json'); } vat stat_timer = setInterval(getStatus, 1000); </script>
|
PHP poole pealt siis peab script andma tagasi vajaliku staatuse info. Üks variant oleks töötlemise progress andmebaasi salvestada või siis unikaalse nimega faili sisse, mida uuendab tööd tegev skript ja ksukohast siis vaatab staatust see staatuse infot javascriptile tagastav php skript.
Lisamärkusena pikka aega kestvate protsesside juures koosluses PHP sessioonidega mainiks veel seda, et enne pikka protsessi tuleb ära teha session_write_close() php poole pealt ja peale protsessi siis uuesti session_start(), kuna vastasel juhul kogu selle pika protsessi ajal ei saa kasutaja veebilehel lingi liikuda.
_________________ Upload.ee - eestimaine failiupload |
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
15.09.2009 11:58:30
|
|
|
inzinz kirjutas: |
Aga nene, kas tohib küsida, miks ikkagi oleks just vaia kasutada seda push lähenemist |
Ega polegi tarvis. Aga pakkusin lihtsalt välja sellise võimaluse. warwas ju ei öelnud ka kui kaua see protsess seal serveris tal oodatavalt aega võtab. On see sekundites, minutites või tundides mõõdetav?
Pollimine on kindlasti hea lähenemine, aga samuti oma halbade külgedega. Mida harvem seda tehakse, seda parem. Kui see käib iga sekundi takka, siis võib asi veelgi koormavamaks osutuda.
Aga eks warwas peab ise vastavalt oma situatsioonile õige lähenemise leidma.
Mulle antud juhul pakkus tegelikult päris palju lõbu selle väikese pushimise-skripti tegemine
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
warwas
HV Guru

liitunud: 06.07.2003
|
15.09.2009 12:21:27
|
|
|
inzinz ja nene - suured tänud ideede eest! Mõlemad lähenemised on päris huvitavad. Hakkan kohe katsetama...
Protsess ise kisub arvatavasti 3..4 minuti ringi.
|
|
Kommentaarid: 247 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
3 :: |
224 |
|
tagasi üles |
|
 |
inzinz
HV kasutaja
liitunud: 26.01.2005
|
15.09.2009 13:29:23
|
|
|
Pollimisel jah on see overhead et pidevalt avatakse ja suletakse connectioneid, pluss kui php/server ei ütle header('Connection: close'); siis jääb tavaliselt vaikimisi keepalive connection ikkagi püsti ja apache poolt vaadates on asi koormavam kui push, kuna selle asemel et apachest infi ainult välja läheks ilma midagi vastu tulemata, tuleb info saatmisele lisaks pidevalt päringuid stiilis "mis staatus on?"
Aga peamine võit serveri poolelt on ikkagi see, et kui sul staatuse vastuse väljastaja kood on kiire (pluss connection:close), võtab näiteks 4ms aega, siis mahub korraga rohkem inimesi sama serveri/lehe taha seda staatust küsima. Kui võtta ideaaljuht, et näiteks iga request on 4ms ja tuleb 250 järjestikku kohe kinni minevat ühendust, siis see jätab avatud connectionite hulga stabiilselt selliseks, nagu oleks ainult 1 ühendus 1 sekundi lahti olnud (antud näitega oleks connectionite arvu poolest 250 korda efektiivsem kui push). Päris elus nii ideaalset juhtu ei tule vast, aga üldiselt need poll requestid hajuvad ikkagi suht võrdselt sekundi raames laiali.
Aga küsimus tekkis ka tegelikult, et mismoodi sa selle protsessi käima paned ? Kas http requesti peale, nii et formi postitades hakkab protsess tööle ja protsessi lõppedes alles laeb uus leht ette nö ? Või formi postitamise peale pannakse taustal protsess tööle ?
Kui on see esimene variant (protsess töötab, peale mida laeb lehe ära), siis lihtsam kasutusele võtta oleks nene pakutud push versioon, et paned iframe sisse postitama ja sealt järjest tuleb javascripti vastu mis uuendab staatust.
Aga ise isiklikult soovitaksin ikkagi sellist lähenemist, et formi postitamise tulemusena pannakse taustal protsess tööle, ja siis kuskil staatuse kuvamise lehel (formiga samal lehel kasvõi) javascript pollib staatuse skriptilt infot. Tsipa keerukam, aga perf koha pealt peaks olema suht optimaalne.
Edu katsetamisel
_________________ Upload.ee - eestimaine failiupload |
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
|