2

我目前有一个网页需要一段时间才能加载。页面的 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)读到浏览器会等到读取一定数量的字符后再尝试渲染任何内容。

任何想法,将不胜感激。浏览器充满了让我感到困惑的神秘技巧和黑客行为。

4

6 回答 6

4

更好的选择是只发送页面的骨架,然后通过 AJAX 调用获取计算量大的数据。这样,您可以放置​​一个占位符页面并在可用时填写内容。

这样做的好处是您不依赖于刷新缓冲区——这并不能保证数据实际上会发送到客户端,只是软件堆栈中的下一个更高层应该获得现在可用的所有内容。

不利的一面是,现在您将有至少两个 HTTP 请求来生成页面 - 一个用于获取页面的骨架,并且至少有一个或多个用于 AJAX 请求以获取“填充空白”数据。

于 2011-07-25T19:38:32.043 回答
1

尝试使用

flush(); ob_flush();

如php手册中所述。这使输出尽可能靠近浏览器。

更多关于将缓冲区推送到浏览器的信息可以在flush()的php手册中阅读;

于 2011-07-25T19:35:46.537 回答
1
  1. 首先尝试将加载程序消息直接放在正文标记之后。这样浏览器应该尽快显示它。
  2. 检查默认情况下没有启用压缩(例如 gzip)的配置。
  3. 不要使用表格。它们在完全加载之前不会被渲染。
于 2011-07-25T20:00:56.200 回答
1

试试这个:

<!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”文件。

于 2011-07-25T20:28:59.273 回答
0

使用 Ajax 调用加载需要很长时间的内容。

于 2011-07-25T19:36:20.290 回答
0

您需要在 PHP 进程完成其工作时关闭输出缓冲并隐式刷新输出。

您可能需要检查Output Buffering。另请注意,刷新缓冲区取决于浏览器以及它在显示输出之前的期望值。

一个您可能会觉得有用的相关问题。

于 2011-07-25T19:36:49.890 回答