【问题标题】:notifications without reloading the page (like facebook or google plus notifications)无需重新加载页面的通知(如 facebook 或 google plus 通知)
【发布时间】:2013-10-14 04:41:07
【问题描述】:

将 Facebook 等通知发送到仪表板的理想机制是什么?我认为最好的方法是每 5 秒对 php 页面进行一次 Ajax 调用并检索通知。

有没有更好的方法来做类似的改变?

它也应该适用于所有移动浏览器。

我是这样做的,

在 jquery 中使用$.post 获取数据而不刷新页面。

$.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 秒内收到这样的错误消息。

错误:超时(超时)

如何预防?

参考:Javascript Variable Scope

【问题讨论】:

  • 我认为定期发布 ajax 帖子是最好的方法。但是它提出了一个问题,如果有一天你得到,比方说,10 亿用户,其中 3 亿在任何给定时间点登录,这意味着每 5 秒对 PHP 页面进行 3 亿次调用!我很想知道还有哪些其他方法。
  • @DS。是的,这是真的,但我正在寻找其他选择。
  • @mazraara 如果你想做正确的事情,请查看 websocket 服务器,socket.io 是一个流行的。
  • @mazraara - 看看这个,它可能会有所帮助 - stackoverflow.com/questions/16860106/…
  • @DS。请检查上面编辑过的问题。

标签: php jquery ajax


【解决方案1】:

据我所知,基本上有两种方法可以做到这一点:轮询和 websockets。轮询要么每隔一段时间发出许多请求,要么有一个很长的请求,浏览器和服务器知道很长(也称为长轮询)。然后是websockets。我已经有一段时间没有进入 PHP 领域了,但最后我检查了那里并没有真正支持 websockets。它本来可以改变的。在 Node 世界中,socket.io 是一个很好的解决方案,它使用 websockets 和长轮询作为备份。

快速搜索找到了 websockets 和 php: http://socketo.me/docs/

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    相关资源
    最近更新 更多