Я хочу, чтобы PHP выводил некоторый текст, а затем спал в течение полутора секунд, а затем выводил еще немного текста.
<?php echo 'Output one.'; usleep(1500000); echo 'Output two.'; ?>
Моя проблема заключается в том, что весь текст выводится одновременно – после ожидания этих 1,5 секунд. Я кое-что прочитал о функции, называемой flush, но она не работает. Может быть, я его не пишу. Любая помощь будет оценена ^^
Заранее спасибо!
Проверь это
<?php ob_start(); echo 'Output one.'; ob_flush(); usleep(1500000); echo 'Output two.'; ob_flush(); ?>
Ответ Pentium10 не совсем сработал для меня. Однако, когда я перешел на страницу документации PHP, там было много хороших комментариев.
http://php.net/manual/en/function.ob-flush.php
Это сработало для меня, используя Firefox 3.5.9, PHP 5.2.11, Apache работает на локальном ноутбуке Windows 7:
echo "test"; ob_end_flush(); flush(); usleep(x); echo "test";
Ob_end_flush () имеет решающее значение для отправки данных.
Я думаю, что это больше проблема с запросом / ответом HTTP. В командной строке ваш скрипт отлично работает.
Обычно ответ готов полностью и отправляется клиенту. Если ваш ответ имеет такой размер, который нужно отправить нескольким пакетам tcp, может случиться так, что первые пакеты будут отправлены, прежде чем скрипт будет готов с обработкой. Таким образом, это зависит от размера вывода. В зависимости от клиента / веб-браузера также может случиться так, что первые пакеты будут отображаться до того, как на клиент поступит полный ответ.
Как ответил Нуфаль Ибрагим, когда я печатал, я полностью согласен с ним. Сделайте это асинхронным способом.
Хотя решение Pentium10, вероятно, будет работать, возможно, вы захотите переместить его на клиентскую сторону. Имейте асинхронный вызов, чтобы получить первое значение, распечатать его, спящий на требуемое время и затем повторить для второго значения.
Ваша проблема в том, что это PHP. Это предварительный процессор. Таким образом, скрипт php запускается, выводит первый журнал, затем спит, затем выводит второй журнал и только тот, который он отправлен и показан в вашем браузере.
Вам нужен javascript, если вы хотите, чтобы задержка отображалась на экране вашего браузера.
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>
echo 'Output one.'; ob_flush(); flush(); usleep(1500000); echo 'Output two.';