Рендеринг веб -страницы до получения всех данных
-
26-10-2019 - |
Вопрос
В настоящее время у меня есть веб -страница, на которую нужно загрузить время. PHP -сторона страницы выполняет много обработки данных и вычислений, и это (к сожалению) неизбежно. Я хотел бы отобразить что -то на странице, пока PHP обрабатывает. К сожалению, большая часть страницы зависит от вычисления PHP.
Текущее решение, которое у меня есть, является следующим:
HTML/PHP (начало):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title id="title">Loading</title>
<link href="style.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="preLoading.js"></script>
</head>
<body onload="onLoad()">
<?php
flush();
?>
<?php
// computation.
?>
JavaScript:
document.write('<span id="loading">Please wait... Loading and processing data.</span>');
function onLoad() {
if (document.getElementById) {
var loading = document.getElementById("loading");
loading.style.display="none";
}
}
Это хорошо работает в том смысле, что, хотя страница рендеринга, есть небольшое сообщение о ожидании, пока отображается страница. Но это не работает в том смысле, что страница все еще ждет всех данных, которые будут получены до того, как что -либо издают. Как я могу сделать последнее?
Одна вещь примечания: пустая линия перед Doctype содержит 1024 пространства, потому что я читал в некоторых местах (включая Stackoverflow), что браузеры ждут, пока не прочитают определенное количество символов, прежде чем пытаться что -либо сделать.
Любые идеи были бы хорошы. Браузеры заполнены тайными уловками и взломами, которые меня мистифицируют.
Решение
Попробуй это:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title id="title">Loading</title>
<link href="style.css" rel="stylesheet" type="text/css"/>
<script type ="text/javascript" src="jquery.js"> </script>
<script type="text/javascript">
$(document).ready(function(){
$.get('data.php',
function(output) {
$('#dataDiv').html(output).fadeIn(250);
});
});
</script>
</head>
<body>
<div id="dataDiv"> Please wait while loading... </div>
<?php
// computations placed in data.php file
?>
Обратите внимание, что это требует использования jQuery и для перемещения ваших вычислений PHP в файл «data.php».
Другие советы
Лучшим выбором было бы отправить только скелет страницы, а затем получить вычислительные дорогостоящие данные с помощью вызовов AJAX. Таким образом, вы можете поставить страницу заполнителя и заполнить вещи по мере их появления.
Переветлей в этом заключается в том, что вы не зависите от буферов промывки - что не гарантирует, что данные фактически будут отправлены клиенту, только в том, что следующий более высокий уровень в программном стеке должен получить все, что доступно прямо сейчас.
Недостатком является то, что теперь у вас будет как минимум два HTTP -запроса, чтобы сгенерировать страницу - один, чтобы получить скелет страницы, и, по крайней мере, один или несколько для запроса AJAX, чтобы получить данные «заполнить пробелы».
Попробуйте использовать
flush(); ob_flush();
Как указано в руководстве PHP. Это приближает выход как можно ближе к браузеру.
Более подробную информацию о том, как подтолкнуть буфер в браузер можно прочитать в руководстве PHP для flush ();
- Для начала попробуйте поместить сообщение по загрузке сразу после тега тела. Таким образом, браузер должен отобразить его как можно скорее.
- Проверьте конфигурацию на наличие сжатия (например, GZIP) по умолчанию.
- Не используйте таблицы. Они не отображаются до полной загрузки.
Загрузите контент, который займет навсегда с помощью вызова Ajax.
Вам необходимо выключить выходной буферизацию и неявно промывать выход, так как ваш процесс PHP выполняет свою работу.
Вы можете захотеть заказать Выход буферизации. Анкет Также обратите внимание, что промывание буфера зависит от браузера и того, насколько он ожидает, прежде чем он показывает выход.
А Связанный вопрос что вы можете найти полезным.