Возможный дубликат:
что такое буферизация вывода?
У меня есть некоторый контент, который требуется для создания PHP. Тем временем я хотел бы использовать этот простой трюк JS для отображения сообщения «Загрузка …». Сообщение исчезнет, как только будет создан выход.
<p id="loading_msg">Loading...</p> <h1>Hello</h1> <?php sleep(2); // This is the greedy function call print '<p>This content definitely took a while to be generated !.</p>'; ?> <script type="text/javascript"> var e = document.getElementById("loading_msg"); e.style.display = "none"; </script>
Проблема заключается не в том, чтобы отправить все до sleep(2);
затем блокировка, она будет ждать до того, как будет создана вся страница, а затем отправьте ее все сразу . Это явно нарушает цель моего сообщения «Загрузка …», потому что оно не появляется до истечения 2 секунд. Любые идеи о том, почему, и как я мог бы обойти это?
По умолчанию PHP будет буферизовать ваш вывод и отправлять пользователю меньшее количество больших кусков. Вы можете использовать flush
для немедленного отправки содержимого буфера записи пользователю:
<p id="loading_msg">Loading...</p> <h1>Hello</h1> <?php flush(); sleep(2);
Это не будет работать, если вы ранее активировали буферизацию вывода, вызывая ob_start
или директиву output_buffering
директивы php.ini output_buffering
1
.
Использование «flush» может работать на некоторых веб-серверах / браузерах (meagar верен, что он не будет работать, пока включена буферизация вывода, но это не значит, что он будет работать в остальное время).
Веб-сервер должен решить, когда вернуться к закодированному кодированию, – большинство из них начнет отвечать на запросы, когда вы вызываете флеш, пока вы не сжимаете выходной поток. Затем браузер должен решить, когда он начнет показывать неполный ответ, а поведение будет зависеть от содержимого. Например, никто не начнет рендеринг таблицы до тех пор, пока не будет закрыт тег.
Лучшее решение, пытающееся обработать его на принимающей странице, должно обрабатывать его на странице отправки – например, с помощью litebox для отображения сообщения. В качестве альтернативы сообщение может быть представлено на промежуточной странице, которая делает перенаправление на сгенерированный контент.