Avaleht
uus teema   vasta Tarkvara »  WWW »  jQueryUI Progress Bar ja PHP tsükkel - kas toimivad koos? märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
warwas
HV Guru
warwas

liitunud: 06.07.2003



Autoriseeritud ID-kaardiga

sõnum 14.09.2009 00:25:43 jQueryUI Progress Bar ja PHP tsükkel - kas toimivad koos? vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Andrus Luht
itimees.ee
Andrus Luht

liitunud: 11.06.2002



Autoriseeritud ID-kaardiga

sõnum 14.09.2009 00:30:11 vasta tsitaadiga

Kirjelda seda tsüklit.
_________________
Äriklassi serverilahenduste müük, paigaldus ja haldus. SaaS / PaaS / IaaS lahendused
Kasutatud äriklassi serverite, andmesalvede ja võrguseadmete ost-müük-rent
Tier-3 privaatpilvede, virtuaal- ja virtuaal-privaat-serverite lahendused. 24/7 haldus, monitooring
Kommentaarid: 377 loe/lisa Kasutajad arvavad:  :: 5 :: 1 :: 318
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
warwas
HV Guru
warwas

liitunud: 06.07.2003



Autoriseeritud ID-kaardiga

sõnum 14.09.2009 10:05:48 vasta tsitaadiga

BReaK da iCE kirjutas:
Kirjelda seda tsüklit.

kõige labasem for-tsükkel. Lihtsustatuna midagi sellist:
php:
  1. for($i=0; $i<$ringide_arv; $i++) {
  2.      tee_midagi();
  3.      tee_veel_midagi();
  4. }

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
vaata kasutaja infot saada privaatsõnum
Andrus Luht
itimees.ee
Andrus Luht

liitunud: 11.06.2002



Autoriseeritud ID-kaardiga

sõnum 14.09.2009 10:41:03 vasta tsitaadiga

Aga sa tekita seda progress-bar asja seal tsükli sees...
Mõned näited: http://www.silverspider.com/2005/php-progress-bar/
http://www.kksou.com/php-gtk2/articles/display-progress-bar-while-processing-long-task---Part-1.php

_________________
Äriklassi serverilahenduste müük, paigaldus ja haldus. SaaS / PaaS / IaaS lahendused
Kasutatud äriklassi serverite, andmesalvede ja võrguseadmete ost-müük-rent
Tier-3 privaatpilvede, virtuaal- ja virtuaal-privaat-serverite lahendused. 24/7 haldus, monitooring
Kommentaarid: 377 loe/lisa Kasutajad arvavad:  :: 5 :: 1 :: 318
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 14.09.2009 21:21:36 vasta tsitaadiga

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:
  1. <title>Progress bar</title>
  2. <script type="text/javascript">
  3.   // start loading by creating iframe
  4.   function start() {
  5.     var iframe = document.createElement("iframe");
  6.     iframe.id = "loader";
  7.     iframe.src = "pushlet.php?r="+Math.random();
  8.     iframe.width = 0;
  9.     iframe.height = 0;
  10.     document.body.appendChild(iframe);
  11.   }
  12.  
  13.   // Assign the following methods to window,
  14.   // to make them accessible from iframe.
  15.  
  16.   // updates progress bar
  17.   window.update = function(n) {
  18.     document.getElementById("progress").innerHTML = n + "%";
  19.   }
  20.  
  21.   // removes the iframe after we are done
  22.   window.finish = function() {
  23.     var iframe = document.getElementById("loader");
  24.     document.body.removeChild(iframe);
  25.   }
  26. </script>
  27. </head>
  28.   <p id="progress"></p>
  29.  
  30.   <button onclick="start();">Start</button>
  31. </body>
  32. </html>


pushlet.php:
php:
  1. <?php
  2.  
  3.   for ($i=10; $i<=100; $i+=10) {
  4.     // call the update method of parent window
  5.     echo "<script> parent.update($i); </script>\n";
  6.     flush();
  7.     sleep(1);
  8.   }
  9.  
  10.   echo "<script> parent.finish(); </script>\n";
  11.  
  12. ?>


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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
linnumees
HV kasutaja

liitunud: 15.06.2005




sõnum 14.09.2009 21:41:25 Re: jQueryUI Progress Bar ja PHP tsükkel - kas toimivad koos? vasta tsitaadiga

warwas kirjutas:
PHP tsükkel ei väljasta ju reeglina enne lõppu mitte piiksugi infot

http://ee.php.net/flush
http://ee.php.net/ob_flush
Kommentaarid: 3 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 3
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 14.09.2009 22:56:18 vasta tsitaadiga

nene, tõenäoliselt oleks targem ehk iframe asemel kasutada jQuery ajaxipoolt?
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 14.09.2009 23:10:39 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 15.09.2009 10:25:24 vasta tsitaadiga

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 icon_razz.gif).

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:
  1.  
  2. var last_status_time = (new Date()).getTime();
  3. function getStatus() {
  4.     var mytime = (new Date()).getTime();
  5.     $.get('http://mingiaadress', {}, function(data) {
  6.         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
  7.             last_status_time = mytime;
  8.             //siia siis json data käsitlemise loogika, progressbari update vms
  9.         }
  10.     }, 'json');
  11. }
  12. vat stat_timer = setInterval(getStatus, 1000);
  13. </script>
  14.  


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
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 15.09.2009 11:58:30 vasta tsitaadiga

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 icon_smile.gif

_________________
Mõistus otsas? Pane pinusse...
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
warwas
HV Guru
warwas

liitunud: 06.07.2003



Autoriseeritud ID-kaardiga

sõnum 15.09.2009 12:21:27 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 15.09.2009 13:29:23 vasta tsitaadiga

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?" icon_biggrin.gif

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 icon_wink.gif

_________________
Upload.ee - eestimaine failiupload
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  WWW »  jQueryUI Progress Bar ja PHP tsükkel - kas toimivad koos?
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.