最初の質問は2つの手法の違いでしたので、これから始めます:
AJAXポーリング
AJAXポーリングを使用してページを更新するということは、定義された間隔でサーバーにリクエストを送信することを意味します。これは次のようになります。
クライアントはサーバーにリクエストを送信し、サーバーはすぐに応答します。
簡単な例(jQueryを使用)は次のようになります:
setInterval(function(){
$('#myCurrentMoney').load('getCurrentMoney.php');
}, 30000);
これに伴う問題は、すべてのリクエストに常に新しいものがあるとは限らないため、これにより多くの役に立たないリクエストが発生することです。
AJAXロングポーリング
AJAXロングポーリングを使用するということは、クライアントがサーバーにリクエストを送信し、サーバーが応答する前に新しいデータが利用可能になるのを待つことを意味します。これは次のようになります:
クライアントはリクエストを送信し、サーバーは「不規則に」応答します。サーバーが応答するとすぐに、クライアントはサーバーに新しいリクエストを送信します。
クライアント側は次のようになります:
refresh = function() {
$('#myCurrentMoney').load('getCurrentMoney.php',function(){
refresh();
});
}
$(function(){
refresh();
});
これにより、getCurrentMoney.php
をロードするだけです。 の出力を現在のmoney要素に入れ、コールバックが発生するとすぐに、新しいリクエストを開始します。
サーバー側では、通常、ループを使用します。サーバーが新しいパブリケーションをどのように認識するかという質問を解決するには、クライアントが利用できる最新のパブリケーションのタイムスタンプをサーバーに渡すか、「長いポーリング開始」の時間を指標として使用します。
<?
$time = time();
while ($newestPost <= $time) {
// note that this will not count as execution time on linux and you won't run into the 30 seconds timeout - if you wan't to be save you can use a for loop instead of the while
sleep(10000);
// getLatestPostTimestamp() should do a SELECT in your DB and get the timestamp of the latest post
$newestPost = getLatestPostTimestamp();
}
// output whatever you wan't to give back to the client
echo "There are new posts available";
ここでは、「役に立たない」リクエストはありません。