2017-12-08 5 views
0

私はAJAX long-pollingで遊んでいて、ボタンをクリックしてMySQLセルの単純なカウンタ(数値)を読み込み/更新しようとしています。Ajax/PHPの長いポーリングの結果が503エラー

PHPは無限ループを作成し、対応するセルの値が変更されているかどうかを確認します(MySQL "current_timestamp"、UNIX)。それがあり、current_timestampの値がAJAX呼び出しのタイムスタンプより大きい場合、それはループを破り、更新された値と更新されたcurrent_timestampをクライアントに送信します。 AJAXはデータを処理します。

問題:これは動作しますが、しばらくしてから503エラーが表示されます。私はそれが明らかにwhileループまたは他のブラウザ(テスト用)の複数のウィンドウを介して他の開いている接続だと思います。

PHP-ファイルtext.php:

// Connect to database 
$con = mysql_connect('XX', 'XX', 'XX'); 

if (!$con) 
{ 
    die('Error' . mysql_error()); 
} 

mysql_select_db('X', $con); 

// Get data 
$query = mysqli_query("SELECT counter_value, last_modified FROM content WHERE X = 'X' ORDER BY X DESC"); 

// Start infinite loop 
set_time_limit(0); 

while (true) 
{ 

    // The timestamp of the last ajax call = the last modified timestamp 
    $last_ajax_call = $_GET['timestamp']; 

    clearstatcache(); 

    // Get the value of the counter and the last modified timestamp 
    while($row = mysql_fetch_array($query)) 
    { 
     $counter_value = $row['counter_value']; 
     $last_modified= strtotime($row['last_modified']); 
    } 

    // If the time of the last modified timestamp is bigger/later than the last ajax call 
    if ($last_modified > $last_ajax_call) 
    { 

     $result = array(
      'counter_value' => $counter_value, 
      'timestamp' => $last_modified 
     ); 
     $json = json_encode($result); 
     echo $json; 

     break; 

    // If not, try again in 3 seconds 
    } else 
    { 
     sleep(3); 
     continue; 
    } 
} 

// Close database 
mysql_close($con); 

AJAXパートJS-ファイルで:

​​

だから、結果は約後に消える503エラーです10分、それは再び働いている。

(フォーマットタイプミスは/コードをクリーンアップの結果かもしれません。) は、私はちょうどPHPとJSを学び始めたので、そこにはいくつか初心者間違いや奇妙なラインがあるかもしれない、いいことしてください。コードを最適化するためのアドバイスは非常に高く評価されています!

+0

あなたのgetContent関数は、それ自身を呼び出していて、ajaxは非同期であるため、無限ループになります。 fyi:実際に行っているものに使用するのが簡単なgetJSONというjQueryメソッドがあります。 私は、リアルタイムのTCPソケットをシミュレートしようとしています。 WebSocketプロトコルを使用しているNode.jsとsocket.ioを見ましたか? –

答えて

0

PHPはあなたが思うように動作しないので、それは死ぬ。

意図的にあなたのコードに無限ループを置くと、あなたのコードはループし続け、各ループの次のGETリクエストを再チェックします。

現実には、コードはリクエストごとに1回実行され、コードの実行が完了するまでサーバーは応答しません。

AJAX longポーリングでは、PHPでの特別な処理は必要ありません。ループ内のAJAXリクエストです。あなたのAJAXコードに少し遅れを入れたいのであれば、あなたのサーバーはリクエストで叩かれます。

これは長いポーリングが何のためにあるのかない正直に言うと、そのアイデアは、あなたがボタンのクリックなどのユーザーイベントを監視する場合など

未読のメッセージ通知を表示するには、ユーザーの操作なしにページを更新することですAJAX関数をボタンのクリックにバインドします。

関連する問題