2010-06-20 16 views
5

Chcę, aby PHP wyprowadził jakiś tekst, a następnie spać przez półtorej sekundy, a następnie wypisać więcej tekstu.Tekst wyjściowy PHP przed snem

<?php 

echo 'Output one.'; 

usleep(1500000); 

echo 'Output two.'; 

?> 

Moim problemem jest to, że cały tekst jest zgasić jednocześnie - po czekała te 1,5 sekundy. Przeczytałem coś o funkcji o nazwie flush - ale to nie działa. Może nie używam tego zapisu. Każda pomoc zostanie doceniona^^

Z góry dziękuję!

Odpowiedz

8

zajrzyj na

<?php 

ob_start(); 

echo 'Output one.'; 
ob_flush(); 
usleep(1500000); 
echo 'Output two.'; 
ob_flush(); 

?> 
+0

ta nie działa dla mnie, ale dodałem 'flush();' 'po każdym ob_flush();' to działało. Czy ktoś może mi wyjaśnić, dlaczego muszę "spuścić"? – Salam

1

Choć rozwiązanie Pentium10 będzie prawdopodobnie działać, warto rozważyć przeniesienie tego na stronie klienta. Mieć połączenie asynchroniczne, aby uzyskać pierwszą wartość, wydrukować, spać przez wymagany czas, a następnie powtórzyć dla drugiej wartości.

2

Myślę, że jest to bardziej problem dotyczący żądania/odpowiedzi HTTP. W linii poleceń twój skrypt działa poprawnie.

Zazwyczaj odpowiedź jest przygotowywana całkowicie i wysyłana do klienta. Jeśli twoja odpowiedź ma taką wielkość, że trzeba wysyłać wiele pakietów tcp, może się zdarzyć, że pierwsze pakiety zostaną wysłane, zanim skrypt będzie gotowy do przetworzenia. To zależy od wielkości wyjścia. W zależności od klienta/przeglądarki internetowej może się zdarzyć, że pierwsze pakiety zostaną wyrenderowane, zanim kompletna odpowiedź dotrze do klienta.

Jak odpowiedziałem na Noufal Ibrahim podczas pisania, całkowicie się z nim zgadzam. Zrób to w sposób asynchroniczny.

4

Odpowiedź Pentium10 nie była dla mnie odpowiednia. Jednak kiedy poszedłem na stronę dokumentacji PHP, było tam wiele dobrych komentarzy.

http://php.net/manual/en/function.ob-flush.php

Ten pracował dla mnie za pomocą Firefoksa 3.5.9, PHP 5.2.11, Apache zjechania z lokalnym Windows 7 laptop:

echo "test"; 
ob_end_flush(); 
flush(); 
usleep(x); 
echo "test"; 

ob_end_flush() było niezbędne do uzyskania danych wysyłanych.

+0

Dziękuję, działało! –

-1
echo 'Output one.'; 
ob_flush(); 
flush(); 
usleep(1500000); 
echo 'Output two.'; 
0

Twój problem polega na tym, że jest to PHP. To pre-procesor. Tak więc skrypt PHP uruchamia się, wyprowadza pierwszy log, następnie śpi, a następnie wysyła drugi log, i tylko wtedy, gdy jest wysyłany i wyświetlany w przeglądarce.

Potrzebujesz javascript, jeśli chcesz, aby opóźnienie było widoczne na ekranie przeglądarki.

function showLog() { 
 
    $(".secondlog").show(); 
 
} 
 

 
$(document).ready(function() { 
 
    setTimeout(showLog,3000); 
 
});
.firstlog { 
 
    border: 1px solid #AEAEAE; 
 
} 
 

 
.secondlog { 
 
    display: none; 
 
    border: 1px solid #AEAEAE; 
 
    margin-top: 20px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="firstlog"> 
 
    Output of first log 
 
</div> 
 
<div class="secondlog"> 
 
    Output of second log 
 
</div> 
 

 
<p>Wait for 3 seconds...</p>