0

この PhP スクリプトはロング ポーリングに対する正当なアプローチですか、それともサーバーに負荷がかかりすぎますか?

$FoundNewContent = false;

$tokens = array();

while(!$FoundNewContent) {
    usleep(300000);
    clearstatcache();
    $SQL1 = "SELECT * FROM tokens WHERE  ID > ".$_GET['tokenID'];
    $result1 = mysql_query($SQL1);
    while($row1 = mysql_fetch_array($result1, MYSQL_ASSOC)) {
        array_push($tokens, $row1);
        $FoundNewContent = true;
    }
}

// Parse XML array    

flush()

このスクリプトを Ajax 経由で呼び出しています。

4

1 に答える 1

1

サーバーの設定に依存します - セッションを使用しない限り問題なく動作するはずですが、一度に接続が多すぎるとサーバーが停止する可能性があります。

また、何も返さずにポーリングを再開する時間制限を追加します。そうしないと、データが追加されず、サーバーのタイムアウトが無制限に設定されている場合、スクリプトが永久に実行される可能性があります。私は通常、30 秒の制限を追加します。

何かのようなもの:

$FoundNewContent = false;
$tokens = array();
$time = time();
while(!$FoundNewContent) {
  usleep(300000);
  clearstatcache();
  $SQL1 = "SELECT * FROM tokens WHERE  ID > ".$_GET['tokenID'];
  $result1 = mysql_query($SQL1);
  while($row1 = mysql_fetch_array($result1, MYSQL_ASSOC)) {
    array_push($tokens, $row1);
    $FoundNewContent = true;
  }
  if($time<time()-30) break;
}
flush()
于 2012-11-06T10:56:07.420 に答える