5

最初に、新しいプログラマーを助けてくれた素晴らしい人々に感謝したいと思います。

ロングポーリングについて質問です。コメット プログラミングのロング ポーリング手法に関する記事をいくつか調べました。サーバー側にいくつかのスクリプトをインストールする必要がある場合もあるため、この方法は私には非常に難しいようです。

今、ロングポーリングの例を見つけました。うまく機能していますが、それが適切な方法であるかどうかはわかりません。サンプル スクリプトは、チャットのようなアプリケーションに関するものです。この php スクリプトは次のように機能します。

  1. php スクリプトは、data.txt ファイルが変更されるまで継続的にチェックします。
  2. data.txt が変更されるとすぐに、新しいテキストが Web ページに出力されます。

phpスクリプトは次のとおりです。

<?php
$filename  = dirname(__FILE__).'/data.txt';

// store new message in the file
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
if ($msg != '')
{
    file_put_contents($filename,$msg);
    die();
}

// infinite loop until the data file is not modified
$lastmodif    = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
$currentmodif = filemtime($filename);
while ($currentmodif <= $lastmodif) // check if the data file has been modified
{
    usleep(500000); // sleep 500ms to unload the CPU
    clearstatcache();
    $currentmodif = filemtime($filename);
}

// return a json array
$response = array();
$response['msg']       = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);
flush();
?>

質問を簡単にするために、Webページのコードは含めていません。Web ページには、変更されるたびに data.txt のテキストを表示する div のみがあります。

私の質問の主なポイントは次のとおりです。

  • このループ方法は、サーバーを長くポーリングする適切な方法ですか?
  • また、サーバーが実行中の場合、sleep();他の同時リクエストはどうなりますか?
  • 長いポーリングの連続スクリプトによるサーバーの負荷を軽減する手法はありますか?
  • この長いポーリング リクエストを開始したクライアントが切断された場合、その切断されたクライアントのスクリプトをどのように認識して停止できますか?

この問題について親切に案内してください...ありがとう

4

2 に答える 2

5

はい、それはアイデアです。ただし、このスクリプトは終了せず、すべてのユーザーに対してPHPのインスタンスが生成されることに注意してください。v8cgiサーバー側でlongpollロジックを使用しています。クライアントがXMLHttpリクエスト(XHR)を開始した後、サーバーは新しい入力の間隔でチェックを開始します。タイマーサーバー側を追加して、5分ごとに応答を送信します。その後、クライアント(切断されていない場合)がXHRを再送信し、手順が繰り返されます。

したがって、サーバー側メカニズムのすべてのインスタンスは最大5分以内に実行されます。これは、クライアントが切断された場合、サーバーが5分後に送信する応答の後に新しいXHRが続かないためです。

プロセスは次のようになります。

  • クライアントはXHRを送信します
  • サーバースポーンは、更新のチェックを定期的に処理します
  • 更新を送信する必要がある場合:サーバーが応答を送信します
    • クライアントは応答を処理し、XHRを再起動します
    • サーバーはプロセスを生成し、更新を定期的にチェックします
  • 更新なしで5分が経過した場合:
    • サーバーは応答を送信し、生成されたプロセスを終了します
    • クライアントは(空の)応答を処理し、XHRを再起動します
    • サーバーは新しいプロセスを生成し、チェックを開始します
  • 更新を送信する必要がある場合:サーバーが応答を送信します
  • [...]
  • 更新なしで5分が経過した場合:
  • [...]
  • クライアントが切断されるまで(=サーバーの応答後に新しいXHRがない)
于 2012-06-15T06:21:46.027 に答える
1

はい、これは簡単で便利な方法であり、適切な方法ではありませんが、最良のアイデアではありません。利用者が増えるにつれて、多くの問題を引き起こします。

共有ホスティングの場合、これは良い考えではありません。この方法は、ユーザーがそれほど多くなく、独自のサーバーがある場合にのみうまく機能します。共有ホスティング サーバーでこの方法を使用すると、使用されるサーバー リソースが最大になるか、セッション ロックの問題が発生し、http サービスがしばらく利用できなくなる可能性があります。

または、チャット アプリケーション用に既存の API を使用するか、またはnode.js同様のサーバー モジュールのようなスクリプトを実行できる専用サーバーを用意することができます。

于 2012-06-18T06:44:37.067 に答える