Průběžné vypisování stránky – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Průběžné vypisování stránky – PHP – Fórum – Programujte.comPrůběžné vypisování stránky – PHP – Fórum – Programujte.com

 

fix0
Stálý člen
14. 5. 2020   #1
-
0
-

Ahoj,

prosím jak zajistit, aby PHP vracelo výsledek do prohlížeče postupně, pouze při použití PHP, bez nějakého AJAXu apod.

Mějme např. skript:

<?php

echo "prvni";

sleep(10);

echo "druhy";

sleep(10);

echo "treti";

?>

Výsledek je nyní takový, že se mi 30 vteřin vrtí kolečko signalizující generování stránky a po 30 vteřinách mi tam skočí všechny tři echa.

Chtěl bych to, aby se "první" echo zobrazilo hned, "druhé" po deseti vteřinách, a třetí až po dalších 10 vteřinách. Jenže ono to asi PHP při zpracování na straně serveru v rámci jednoho requestu zřejmě takhle sekvenčně asi neumí co?

AJAXem se mi něco podobného v minulosti podařilo řešit, ale vidím v tom složitost a mám nechuť si to zjišťovat, ale jestli mi neporadíte nějakou jednoduchou cestu, tak hold sáhnu po tom AJAXu.

Děkuji za názory.

Nahlásit jako SPAM
IP: 31.30.172.–
KIIV
~ Moderátor
+43
God of flame
14. 5. 2020   #2
-
0
-

#1 fix
Ono jsou vsude buffery (mozna je i zaply buffer v samotnem PHP - takze muzes poslat headery ikdyz uz posilas data). Pokud je to nejaky php buffer, urcite je nekde nastaveni na jeho vypnuti, nebo flush na jeho odeslani

Pokud je to neco na webserveru, tak to bude trochu zajimavejsi (mozna jen poslat vice dat)

Nahlásit jako SPAM
IP: 78.80.17.–
Program vždy dělá to co naprogramujete, ne to co chcete...
peter
~ Anonymní uživatel
3981 příspěvků
14. 5. 2020   #3
-
0
-

Musis zacit premyslet uz konecne sam :)

google = php zobrazovani stranky postupne

<?php
#header('Content-type:text/plain');  # on/off
#header('Content-Transfer-Encoding: chunked'); # on/off
for($o=5;--$o;){	
#echo "$o<br>"; 
# jedno	
#echo "$o-br-"; 
# nebo druhe	
usleep(1e6);	
ob_flush();
}

A dale na te strance, co jsem nasel, tak odkazuji na vyhledavani slov
google = php flush
https://www.php.net/…on.flush.php
 

<?php
if (ob_get_level() == 0) ob_start();
for ($i = 0; $i<10; $i++){
        echo "<br> Line to show.";
        echo str_pad('',4096)."\n";   
        ob_flush();
        flush();
        sleep(2);
}
echo "Done.";
ob_end_flush();
?>

---

<?php
  ob_implicit_flush();
  ob_end_flush();
  ?><body>[1013 more characters]<?php
  for ($i = 1; $i < 30000000; ++$i) {}
  echo "something that didn't show up immediately";
?>
Nahlásit jako SPAM
IP: 2001:718:2601:258:340d:98d5:9f6:80a5...–
peter
~ Anonymní uživatel
3981 příspěvků
14. 5. 2020   #4
-
0
-

   

ob_end_flush();

# CODE THAT NEEDS IMMEDIATE FLUSHING

ob_start();

---

ob_implicit_flush(true);

# CODE THAT NEEDS IMMEDIATE FLUSHING

ob_implicit_flush(false);

Ale, jak pise kiv, vetsinou byva z nastaveni serveru prednastaveno chovani, aby se vypisovalo vse naraz.

Jeste mne napada reseni pomoci metarefresh

// ale muze se ti stat, ze to browser blokne po 1-2 presmerovanich :)
$i = isset($_GET['page']) ? (int) $_GET['page'] : 1;
if ($i>0 && $i<5)
    {
    echo '<meta http-equiv="refresh" content="5;url=http://example.com/zobraz.php?page='.(++$i).'" />';
    }
echo --$i;
Nahlásit jako SPAM
IP: 2001:718:2601:258:340d:98d5:9f6:80a5...–
peter
~ Anonymní uživatel
3981 příspěvků
14. 5. 2020   #5
-
0
-

Mozna zkus napsat, ceho chces docilit. Mozna by se naslo vhodnejsi reseni. Treba mne jeste napada 

https://jsfiddle.net/qk2m3rsy/

<span id=aaa></span>
<script>
function writeText(str)
{
var el;
el = document.getElementById('aaa');
el.innerHTML = str;
}
writeText('1');
setTimeout("writeText('2')", 1000);
setTimeout("writeText('3')", 2000);
setTimeout("writeText('4')", 3000);
</script>
Nahlásit jako SPAM
IP: 2001:718:2601:258:340d:98d5:9f6:80a5...–
Kit+15
Guru
14. 5. 2020   #6
-
0
-

#1 fix
Tohle je třeba řešit Javascriptem na klientovi. Nejlépe podle posledního příspěvku, který napsal Peter.

Nahlásit jako SPAM
IP: 78.80.25.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
3981 příspěvků
18. 5. 2020   #7
-
0
-

Viz Kit. Ono zalezi na tom, jakym zpusobem to chces dal pouzivat. Na kazdou funkcionalitu je vhodnejsi jiny zpusob.
- Pokud ti jde jen o to, zobrazit uzivateli data se zpozdenim a data se nemeni, tak je odesles vsechna najednou a jen mu je prezentujes javascriptem postupne. Viz treba ruzne pohyblive texty, slidery obrazku.
- Pokud se ta data ale meni v prubehu casu, pak pouzijes ajax. (napriklad chat)
- Pokud se jedna o vypis programu, ktery bezi na serveru, jen vypis. A nepotrebujes to sdilet dalsim X osobam, tak se da pouzit ten ob_flush(); Ale taky musis prenastavit timelimit, protoze php ma omezeni na dobu, po kterou script bezi.
- Treba, kdyby sis chtel udelat vlastni websocket server, tam musis vypnout timelimit uplne. Spustis nekonecny cyklus na vybranem porte. A cokoliv dojde na port, tak prebira tvuj program a muzes na to reagovat. Treba to budes mit chat. Jenze, kdyz nastavis cas na nekonecno, tak ten program nejde jinak vypnout, nez ho odpojit z portu pres seznam bezicich procesu. Takze by ten program mel mit v sobe moznost, kdyz mu posles nejaky kod, heslo, tak se vypne. S tim jsem mel dost pozite, ze jsem prvne nevedel, ze to musim zhodit pres procesy a divil se, proc mi php pri novem spusteni pinda neco o tom, ze port je obsazeny :)

Cili, menit timelimit je ozehava zalezitost a bylo by lepsi, kdybys program resil jinym zpusobem nez jsi psal na zacatku s tim sleep.
 

Nahlásit jako SPAM
IP: 2001:718:2601:258:188c:303b:fd47:c9ec...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý