2012-01-11 4 views
0

Demo.phpファイル htmlファイルが更新されている場合、divタグを更新しますか?

<?php 
function write_back() 
{ 
    echo file_get_contents("sample.html"); 
    sleep(2); 
    write_back(); 
} 
write_back(); 
?> 

は、私が2秒ごとのためのAjaxリクエストに戻って、PHPスクリプトからHTMLコンテンツをエコーた私は、このエラー Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\omnama\demo.php on line 8

を得ました。

Demo.htmlファイル

function loadXMLDoc() 
{ 
var xmlhttp; 
    if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
    else 
    {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function() 
{ 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 
    } 
    } 
    xmlhttp.open("GET","demo.php",true); 
    xmlhttp.send(); 
} 

私がやろうとしていますかを説明しましょう。私は更新を続けているsample.htmlファイルを持っていますが、現在ログインしているユーザー数や、話すことができる人数などが含まれている可能性があります。

新しいユーザーがログインすると、htmlファイルがPHPファイルの概念を使用してユーザー名で更新され、これらのhtmlファイルがすべてのオンラインユーザーに更新されるため、私はhtmlファイルを使用しました。 <div id="myDiv">タグは、demo.phpファイルのレスポンスを持っています

私はいつもMySqlにログインしているかどうかを確認するためにHTMLファイルを使用していますが、htmlファイルを使用したいという深刻なサーバー問題が発生します。毎回ファイルの内容が私にこれらのエラーを与えています。

私はこれを行うと考えていました。ファイルの最終更新時刻を確認してください。前回と異なる場合は、その内容をエコーし​​てください。これは正しい方法ですか?

私はどのようにしてsample.htmlを追跡し、ログインしたユーザーにその内容を更新するのですか?私はいくつかの助けが必要です。ありがとう

+0

私はこの問題を逃しているかもしれませんが、JavaScriptのsetIntervalを使って、間隔ごとに新しいajaxリクエストを実行するのはなぜですか? -http://www.w3schools.com/jsref/met_win_setinterval.asp - 編集:私はそれを今得ました、より完全な答えを書くつもりです... – mobius

+0

@mobius同じエラーが報告されました – niko

+0

setIntervalサーバ側からsleep(2)を削除してブラウザに置きます。しかし、もっと私の完全な答えを見てください。 – mobius

答えて

0

これについてはいくつかの方法がありますが、最終的には、あなたが持っているリクエスト/アップデートの数になります。

は、しかし、私はあなたが興味のある結果を取得しようとしている方法を決定する必要がありますから始めることだと思い

  • 簡単に解決策:あなたはのsetInterval()を使用しますと、ブラウザが新しいを実行する可能性がありサーバー上のXmlHttpRequest(POLL)を使用して、あらかじめ定義された一定の間隔で新しいユーザーリストを取得する

  • さらに複雑な解決策:サーバーとブラウザーの間の接続のような "Webソケット"を確立し、ユーザーのリストサーバー、長いポーリングカスタム実装、またはsocket.io(http://socket.io/ - 私は大ファンです)のような彗星を設定して、何かが発生したときにサーバーがリスニングブラウザーに通知するように設定できます価値のある通知が発生します。

    サーバ側に今

:個人的に

私は実際にデータベースクエリを避けるために、htmlファイルへの書き込みを持つあなたのアプローチが好きではありません。明らかな方法は、要求に応じて新しいユーザーをデータベースに照会して返信することです。サーバーのボトルネックの原因となるユーザーは非常に多いですか?もしそうなら、あなたはそれにサーバーを追加できますか? (mysqlはこれを提供するためだけに複製されています)リクエストにタイムスタンプを追加した場合(おそらくXXXから変更されたことを教えてください)、クエリを高速化する可能性があります。

他の方法はありますか?私。socket.ioを使用すると、オンラインオフライン状態全体が、サーバー側のソケット状態によって処理される可能性があります。 (socket.ioサーバはどのクライアントが接続しているかを知っています)。

もう1つの考え方は、オンラインユーザーをmemcachedやredis serverなどのメモリストレージに保つことです。したがって、各ログイン/ログアウト時に、memcachedサーバーを更新し、それに応じて結果を取得します。

私はそれにもっと時間を費やすと、おそらくそれについてもっと多くの方法が考えられます。しかし、実際にこれらがすべて必要で、単純なSQLクエリーでは作業できない場合は、確実に確認する必要があります。

+0

ありがとうmobius私はそれを見てみましょうが、私にいくつかの詳細情報を与えることを試みるありがとう – niko

+0

@nikoどのトピックでより多くの情報が必要ですか? – mobius

0

私は再帰関数funcitonを使用しないと思いますwrite_backは良い考えです。 2分ごとにajax send xmlhttprequestを使用すると(setTimeoutまたはsetInterval)、 、またはcomet techを使用することができます。 最初の質問に答えるには、これらの助けてください。

関連する問題