2011-07-25 4 views
1

現在、ロードに時間がかかるウェブページがあります。ページの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個のスペースが含まれています。何かをレンダリングしようとする前に、ブラウザが特定の文字数を読み込むまで待つ場所があります。

すべてのアイデアをいただければ幸いです。ブラウザは私を神秘的にする秘密の秘密とハックで満たされています。

答えて

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 
?> 

これは「data.php」ファイルにPHPの計算を移動するためのjQueryとあなたを使用する必要がありますのでご注意ください。

+0

ありがとう、これは私がやったことです(少し変更)。 – duane

1

PHPマニュアルに記載されているように

flush(); ob_flush(); 

を使用してみてください。これにより、ブラウザにできるだけ近い出力が得られます。

バッファをブラウザにプッシュする方法の詳細は、flush()のphpマニュアルを参照してください。

+0

'ob_flush()'は出力バッファリングがオフになっても効果がありません。 – phihag

+0

良いヒント!ありがとう。 – duane

0

Ajaxコールで永遠にかかるコンテンツをロードします。

0

出力バッファリングをオフにして、PHPプロセスがその仕事をしているときに暗黙的に出力をフラッシュする必要があります。

Output Bufferingをチェックアウトするとよいでしょう。また、バッファをフラッシュすることは、ブラウザに依存し、出力を表示する前にどれくらい期待しているかにも注意してください。

related questionあなたが役に立つかもしれません。

+0

私はPHPの出力をフラッシュしました。コードを参照してください。 – duane

+0

フラッシュでは不十分です。PHP.iniファイルで出力バッファリングが有効か無効かを確認する必要があります。このコメントは、PHPのマニュアルを参照してください:http://www.php.net/manual/en/function.flush.php#99988 – Abs

4

より良い選択は、ページのスケルトンだけを送信し、AJAX呼び出しを介して計算機の高価なデータをフェッチすることです。こうすることで、プレースホルダページを作成し、利用可能になったときに記入することができます。

これは、データを実際にクライアントに送信することを保証するものではなく、ソフトウェアスタック内の次の上位層が使用可能なものすべてを取得する必要があることを意味します今。

ページを生成するための少なくとも2つのHTTPリクエストがあります。ページのスケルトンを取得するリクエストと、AJAXリクエストで少なくとも1つ以上のリクエストを取得して、ブランク "データを含む。

0
  1. 最初はbodyタグの後ろにローダーメッセージを置いてみてください。この方法では、ブラウザはできるだけ早く表示する必要があります。
  2. デフォルトで圧縮を行わない設定(gzipなど)をオンにします。
  3. テーブルを使用しないでください。それらは完全にロードされる前にレンダリングされません。
関連する問題