9

Facebook のような通知をダッシュ​​ボードに受け取る理想的なメカニズムは何でしょうか?. 5秒ごとにphpページへのAjax呼び出しを行い、通知を取得するのが最善の方法だと考えています。

同様の変更を行うためのより良い方法はありますか?

すべてのモバイル ブラウザーでも動作するはずです。

私は次の方法でそれをやっています、

$.postページを更新せずにデータを取得するために jquery で使用します。

$.post("page.php",{"act":1},function(data){
    $("#id").html(data);
});
in page.php write your query

編集1

いくつかのオンラインノートとリアルタイムでの動作を参照した後、このような関数を作成しました。

var TimeStamp = null;
      function waitForMsg() {
         $.ajax({
            type: "GET",
            url: "getData.php?timestamp=" + TimeStamp,
            async: true,
            cache: false,
            timeout: 50000, /* Timeout in ms */
//          data: "TimeStamp=" + TimeStamp,
            success: function( data ) {
               var json = eval('(' + data + ')');

               if ( json['msg'] != "" ) {
                  alert( json['msg'] );
               }
               TimeStamp = json['timestamp'];

               setTimeout(
                   'waitForMsg()', /* Request next message */
                   1000            /* ..after 1 seconds */
               );
            },
            error: function( XMLHttpRequest, textStatus, errorThrown ) {
               alert("error:" + textStatus + "(" + errorThrown + ")");
               setTimeout(
                   'waitForMsg()', /* Try again after.. */
                    "15000");       /* milliseconds (15seconds) */
               },
            });
         }
      ;

      // calling after dom is ready
      $(document).ready(function() {
          waitForMsg();
      });

PHPファイルは、

<?php
   $filename = dirname(__FILE__).'/data.txt';
   $lastmodif = isset( $_GET['timestamp'] ) ? $_GET['timestamp'] : 0;
   $currentmodif = filemtime( $filename );

   while ( $currentmodif <= $lastmodif ) {
      usleep( 10000 );
      clearstatcache();
      $currentmodif = filemtime($filename);
   }

   $response = array();
   $response['msg'] = file_get_contents( $filename );
   $response['timestamp'] = $currentmodif;
   echo json_encode($response);

編集2

すべて正常に動作しますが、data.txt ファイルに変更がない場合、50 秒でこのようなエラー メッセージが表示されます。

エラー:タイムアウト(タイムアウト)

どうすればこれを防ぐことができますか?

REF : Javascript 変数のスコープ

4

1 に答える 1

4

私の知る限り、これを行うには基本的に 2 つの方法があります。ポーリングと WebSocket です。ポーリングは、一定の間隔で多くのリクエストを作成するか、ブラウザーとサーバーが長いことを認識している非常に長いリクエスト (ロング ポーリングとも呼ばれます) のいずれかです。次に、WebSocket があります。私はしばらく PHP の世界に行っていませんでしたが、最後に Websocket が実際にサポートされていないことを確認しました。それは変わったかもしれません。ノードの世界では、socket.io は Websockets とロング ポーリングをバックアップとして使用する優れたソリューションです。

簡単な検索で、websockets と php を見つけました: http://socketo.me/docs/

于 2013-10-14T05:02:15.520 に答える