1

次のようにハートビートを実装しました

$.ajax({
    cache:false,
    timeout:8000,  
    type:"POST",
    url:"someurl.php",
    data:allFormValues,
    error:function(){ alert("some error occurred") },
    success:function(response){ //call some functions  }
   });

そしてサーバー側で

$time = time();
        while(!proccessServer() && (time() - $time) < 60 )
        {
            sleep(5);
        }

false が返された場合は単純に関数を呼び出します。ループは 5 秒以上スリープしてからチェックしますが、問題は、これがリソース CPU を消費していることであり、これは 5 人のユーザーがテストしたときだけでした。

この前使ってた

window.setInterval(function(){
  //I call a function here 
}, 5000);

しかし、多くのリクエストのためにリソースを消費していました

おそらく私のアプリは同時に100Kをオンラインにしていますが、ブラウザの互換性のためにwebsocketsを使用することは考えていません これを解決するために何を提案しますか? どんな助けでも大歓迎です

4

2 に答える 2

2

Web サーバー (Apache?) は、リクエストが完了するまで 1 つのスレッドを使用し、リソースを消費します。そして、訪問者ごとに PHP プロセスを使用して、待っているだけです。PHP は、このようなソリューションにはあまり適していません。Comet を実行したい場合は、他のテクノロジを検討する必要があります。たとえば、node.js です。

また、Web サーバーとして NGiNX に切り替え、アプリケーションにhttp://pushmodule.slact.net/の NGiNX_HTTP_Push_Module を使用してから、PHP を使用することもできます。次に、NGiNX はビジターからの接続を受け入れ、コードがデータを NGINX にプッシュするのを待ちます。正確に何をしたいかによっては、うまくいくかもしれません。

于 2012-04-01T23:44:01.720 に答える
1

ここでの問題は、サーバーをスリープ状態にして再試行することです。それ自体がリソースを大量に消費します。賢く使ってください。

あなたがすべきことは、より長い間隔でサーバーをポーリングし、サーバーに「完了」または「失敗」のようなステータスで応答させることです。その後、JSに応答を決定させ、PHPではなく再試行させます。


または、新しいHTML5ソケットを使用して、クライアントからサーバーへの永続的な双方向接続を確立することもできます。サーバーは、クライアントが毎回要求することなく、新しいコンテンツをクライアントにプッシュできます。

于 2012-04-01T23:35:55.783 に答える