Autor Zpráva
Andrej.B
Profil
Zdravim,

ak funguje tato cast kodu na localhoste
<?php
header( 'Content-type: text/html; charset=utf-8' );
echo 'Begin ...<br />';
for( $i = 0 ; $i < 10 ; $i++ )
{
    echo $i . '<br />';
    flush();
    ob_flush();
    sleep(1);
}
echo 'End ...<br />';


?>
a vypisuje postupne cisla pod sebou, ale na producnom servery nie, vypise za 10 sekund komplet
Begin ...
0
1
2
3
4
5
6
7
8
9
End ...

Je nieco, co treba zapnut/vypnut na producnom servery? Alebo chapem nieco zle.
Diky
anonym_
Profil *
Andrej.B:
Nemáš na localhostu nějakou hodně starou verzi PHP? Kdyžtak si porovnej phpinfo() obou serverů, jak jsou nastavené.

Mě se vypíše vše až po 10s, imho by to tak mělo fungovat (na serveru se něco zpracuje a pak pošle do prohlížeče). Pro postupný výpis v časovém intervalu použij JS.

Mimochodem: www.php.net/manual/en/function.sleep.php#refsect1-function.sleep-examples
...kód podobny tvému:
„This example will output (after 10 seconds)“
Keeehi
Profil
Andrej.B:
Je potřeba aby bylo "všude všechno vypnuté". Jde nejen o konfiguraci PHP ale i o konfiguraci webserveru (apache/nginx/...). Například pokud bude na serveru zapnutá komprese výstupu, PHP to sice bude posílat každou vteřinu, server si to ale bude ukládat v paměti a pošle to teprve až to bude mít celé. Je to z důvodu že aby to mohl server komprimovat, musí znát celý obsah.
A těch věcí, co mohou stát v cestě tomu postupnému odesílání je více.
Andrej.B
Profil
anonym:
praveze na locale mam 8.1 a na producnom 7.4.9.
moj testovaci skript na locali funguje ako chcem. Teda kazdu sekundu vypise na obrazovku cislo 1 az 9. Na produkcnom caka celych 10 sekund avypise naraz cisla 1 az 9 pod sebou. Co je nieco, co nechcem.

Keeehi:
Co vsetko mam pozriet v php.ini aby bolo rovnake? Inak kompresia je zapnuta, podla www.whatsmyip.org/http-compression-test, cize bude stacit ju vypnut v configu Apache? alebo nechat zapnutu a vypnut ak sa da, az v tom scripte ktory potrebujem?
Davex
Profil
Keeehi:
Například pokud bude na serveru zapnutá komprese výstupu, PHP to sice bude posílat každou vteřinu, server si to ale bude ukládat v paměti a pošle to teprve až to bude mít celé. Je to z důvodu že aby to mohl server komprimovat, musí znát celý obsah.
Souhlasím, většinou ano, ale za vhodných okolností jde nastavit, aby flush() způsobil okamžité odeslání částečně komprimovaných dat. Například při použití Apache v kombinaci mod_proxy_fcgi a PHP FPM viz parametr v příkladech: flushpackets=on.
Krakatoa
Profil
Jen taková poznámka ke kompresi.
Na tom localhostě by mu to nejspíš jelo i s kompresí.
Na localhostě mám:
Windows 10
Apache/2.4.58
PHP/8.2.12 (apache2handler)
OpenSSL/3.1.4
HTTPS (HTTP/2)
Přenos komprimován pomocí BROTLI.
A normálně mi ob_implicit_flush(); výstup kouskuje po částech s časovou mezerou s tím, že po shlédnutí v prohlížeči F12 komprimovaný přenost normálně funguje.
A nic extra pro flush jsem nenastavoval, vše na default.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0