konto usunięte

Temat: Wypisywanie wyników w przeglądarce linia po linii

Witam.

Mam problem z konfiguracją PHP.

Program:


print 'start<BR>';

for($a=1;$a<10;$a++){
print 'OK<BR>';
ob_flush();
flush();
sleep (1);
}


powinien wypisywać co 1 sekundę na stronie WWW słowo "OK" aż do zakończenia pętli.

Na jednym hostingu to działa prawidłowo na innym serwer czeka jak PHP skończy cały skrypt i wypluwa do przeglądarki całość.

W jaki sposób ustawić php.ini aby skrypt pokazywał na ekranie browsera co sekundę printowaną linię?

Z góry dziękuję za podpowiedzi.
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: Wypisywanie wyników w przeglądarce linia po linii

Spróbuj na początku skryptu dodać:

ob_start();
ob_implicit_flush(TRUE);


A więcej info znajdziesz w komentarzach tutaj:
http://php.net.pl/manual/pl/function.ob-implicit-flush...
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Wypisywanie wyników w przeglądarce linia po linii

Buforowanie może też się odbywać po stronie przeglądarki, więc wynik jest andal niepewny.
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: Wypisywanie wyników w przeglądarce linia po linii

Jeśli takie wyświetlanie wyników na żądanie ma służyć do jakichś celów administracyjnych, gdzie będzie uruchamiane w kontrolowanych warunkach, to można to ustawić. Ale jeśli to ma być coś dostępnego publicznie, to chyba lepiej pokombinować w kierunku ajaxa.

konto usunięte

Temat: Wypisywanie wyników w przeglądarce linia po linii

Trzymałbym się z daleka od Sleepa i tego typu kulawych konstrukcji..

Popieram ideę ajaxową, zrób to chopie porządnie ;)

konto usunięte

Temat: Wypisywanie wyników w przeglądarce linia po linii

Programik jest jak najbardziej do celów administracyjnych.

Obecna wersja "testera":

<?
print 'start<BR>';

ob_start();
ob_implicit_flush(TRUE);

for($a=1;$a<10;$a++){
print 'OK<BR>';
ob_flush();
flush();
sleep(1);
}
ob_end_flush();
?>


Niestety, nadal serwer wypluwa całość a nie linia po linii. Przypomnę, że na poprzednim hostingu wszystko działało poprawnie więc jest to kwestia ustawień PHP lub Apache. Pytanie - która dyrektywa w php.ini (httpd.conf) jest za to odpowiedzialna?
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: Wypisywanie wyników w przeglądarce linia po linii

Zgodnie z jednym komentarzem ze strony manuala PHP, raczej powinno to wyglądać tak:
<?
// This works !
ob_end_flush();
for($i=0;$i<10;$i++) {
echo "yeah :-))))\n";
@ob_flush();
sleep(1);
}
?>


Które ustawienia php.ini lub httpd.conf odpowiadają za to, to konkretnie nie powiem. Też miałem taki przypadek, że na jednym serwerze nie działało, ale po dodaniu ob_implicit_flush() już było ok.
Stawiam, że będą to parametry dot. buforowania (output_buffering_*).
A może jest automatyczny start sesji i wówczas wyjście z każdego skryptu będzie buforowane niezależnie od ustawień ob_*.
Jakie to hostingi? Może wyświetl sobie na obu phpinfo i porównaj.
<?php echo phpinfo(); ?>

konto usunięte

Temat: Wypisywanie wyników w przeglądarce linia po linii

Tutaj jest przykład jak to powinno działać:

http://www.theworldsend.net/php-ping.php?host=www.yaho...!
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Wypisywanie wyników w przeglądarce linia po linii

Możesz zakombinować z nagłówkiem multipart (nie będzie działać w IE)


<?php
header('Content-type: multipart/x-mixed-replace; boundary=section');

$echo = '';
for($a = 1;$a<10;$a++) {
sleep(1);
echo PHP_EOL."--section".PHP_EOL;
echo "Content-type: text/html".PHP_EOL.PHP_EOL;
$echo .= "OK<br/>";
echo $echo;
ob_flush();
flush();

}
echo "\n--section--\n";
Maciej Niedźwiecki

Maciej Niedźwiecki Born to rails hell

Temat: Wypisywanie wyników w przeglądarce linia po linii

Robert Kozakiewicz:
Tutaj jest przykład jak to powinno działać:

http://www.theworldsend.net/php-ping.php?host=www.yaho...!

Hehehe, to ja praktycznie dokładnie coś takiego robiłem. Do sprawdzania węzłów sieci, jak gdzieś ping nie odpowiadał, to znaczyło, że się router zawiesił albo siadło zasilanie.

konto usunięte

Temat: Wypisywanie wyników w przeglądarce linia po linii

Michał Jarosz:
Możesz zakombinować z nagłówkiem multipart (nie będzie działać w IE)


<?php[/quote]> header('Content-type: multipart/x-mixed-replace; [quote]boundary=section');

$echo = '';
for($a = 1;$a<10;$a++) {[/quote]> sleep(1);[quote] echo PHP_EOL."--section".PHP_EOL;
echo "Content-type: text/html".PHP_EOL.PHP_EOL;
$echo .= "OK<br/>";
echo $echo;
ob_flush();
flush();

}
echo "\n--section--\n";

ten kod powoduje radosny zwis chrome
w czym to działa?
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Wypisywanie wyników w przeglądarce linia po linii

Przemysław R.:

ten kod powoduje radosny zwis chrome
w czym to działa?

Sprawdziłem w FF i w Chrome. U mnie działa.

konto usunięte

Temat: Wypisywanie wyników w przeglądarce linia po linii

Michał Jarosz:
Przemysław R.:

ten kod powoduje radosny zwis chrome
w czym to działa?

Sprawdziłem w FF i w Chrome. U mnie działa.

ff, działa
chrome 5.0.xxx zawiesza się okienko w którym uruchamiam link
IExplore 8, chce pobrać plik
Jakub L.

Jakub L. Programista

Temat: Wypisywanie wyników w przeglądarce linia po linii

Zawsze możesz sprawdzić wiresharkiem co dokładnie po sieci idzie.

konto usunięte

Temat: Wypisywanie wyników w przeglądarce linia po linii

Czy już możemy powrócić do tematu ustawień PHP aby działał podany przeze mnie program bez buforowania?

konto usunięte

Temat: Wypisywanie wyników w przeglądarce linia po linii

Pierwsze dwa przykłady z manuala:
http://pl2.php.net/manual/en/function.ob-flush.php#85383
http://pl2.php.net/manual/en/function.ob-flush.php#84297

konto usunięte

Temat: Wypisywanie wyników w przeglądarce linia po linii

Aleksander Wons:
Pierwsze dwa przykłady z manuala:
http://pl2.php.net/manual/en/function.ob-flush.php#85383
http://pl2.php.net/manual/en/function.ob-flush.php#84297

w chrome lata ikonka, czekam chwilę i wypluwa całość

konto usunięte

Temat: Wypisywanie wyników w przeglądarce linia po linii

Ciekawa sytuacja, bo np. skrypt podany przez Michała J. u mnie pod chromem działa bez problemu tak samo jak pod ff. Ale za to w operze pokazuje tylko pierwszego "OK" potem czeka sekundę i już wypluwa całą resztę na raz.

Ten od pingów działa i owszem, ale pod FF i IE. Pod operą i chromem wypluwa wszystko na raz.

Czyli zapewne jest to połączenie konfiguracji php, nagłówków, jakiegoś proxy po drodze, i samej przeglądarki. Nie wiem czy apache ma tu coś do rzeczy, bo domyślnie (przynajmniej powyżej 1.3) nie buforuje wyjścia.

PS. Sprawdziłem sprawę z zipowaniem kontentu. Nie ma to wpływu na buforowanie.

konto usunięte

Temat: Wypisywanie wyników w przeglądarce linia po linii

Spóbuj tak, może pomoże.


print 'start<BR>';



for($a=1;$a<10;$a++){

echo str_pad('OK' . '<br />', 1024, ' ', STR_PAD_RIGHT) . "\n";

ob_flush();

flush();

sleep (1);

}


konto usunięte

Temat: Wypisywanie wyników w przeglądarce linia po linii

Piotr Picheta:
Spóbuj tak, może pomoże.

Niestety, nadal to samo.

Następna dyskusja:

[Aptana] Znak nowej linii




Wyślij zaproszenie do