我对Long Polling的实施是对吗?

时间:2018-03-30 12:42:59

标签: javascript php jquery html long-polling

我正在尝试为基于Web的系统实现一个简单的通知系统。我已经读过websocket,ratchet,socket.io等等。但问题是,我没有足够的时间来实现这些,所以我决定用长时间的民意调查来解决。但是,我不确定我是否真的做得对,或者我只是在上传系统后发送垃圾邮件。我还阅读了有关长轮询的几个主题,但我不太确定它们与我目前使用的有何不同。所以我的担忧是:

1.任何人都可以告诉我,我是否正在进行长时间的投票?
2。如果不是,我应该用我的代码更改什么?

HTML:

<li class="dropdown notifications-menu" id="notif-div">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                <i class="fa fa-bell-o"></i><?php if (!empty($notif_count)): ?><span class="label label-warning" id="notif-count"><?php echo $notif_count->notif_count?></span>
                <?php endif; ?>
              </a>
              <ul class="dropdown-menu">
                <li>
                  <ul class="menu">
                    <?php foreach ($notifications as $key => $notification): ?>
                      <?php if ($notification->type_of_notification == 'Comment'): ?>
                        <li>
                          <a href="<?php echo $notification->href ?>">
                            <i class="ion-chatbubble"></i> <?php echo $notification->title_content ?>
                          </a>
                        </li>
                      <?php elseif ($notification->type_of_notification == 'Reply'):?>
                        <li>
                          <a href="<?php echo $notification->href ?>">
                            <i class="ion-chatbubbles"></i> <?php echo $notification->title_content ?>
                          </a>
                        </li>
                      <?php endif; ?>
                    <?php endforeach; ?>
                  </ul>
                </li>
              </ul>
            </li>

JS:

(function() {
  var notif = function(){
    var user_id = {
        user_id: "<?php echo $traveller_details->user_id ?>"
    };
    $.ajax({
      url: "/Home/get_notif",
      type: "POST",
      data: user_id,
      success: function (data){
          $('#notif-div').html(data);
      }
    });
  };
  setInterval(function(){
    notif();
  }, 60000);
})();

PHP:

public function get_notif()
  {
    $this->data['notif__count'] = $this->Homes->get_notif_count($this->input->post('user_id'));
    $this->data['notifications'] = $this->Homes->get_notifications($this->input->post('user_id'));
    echo '
      <a href="#" class="dropdown-toggle" data-toggle="dropdown">
        <i class="fa fa-bell-o"></i>';
        if (!empty($this->data['notif__count'])) {
          echo '<span class="label label-warning" id="notif-count">'.$this->data['notif__count']->notif_count.'</span>';
        }
      echo '</a>';
      echo '<ul class="dropdown-menu">
        <li>
          <ul class="menu">';
          foreach ($this->data['notifications'] as $key => $notification) {
            if ($notification->type_of_notification == 'Comment') {
              echo '
              <li>
                <a href="'.$notification->href.'">
                  <i class="ion-chatbubble"></i> '.$notification->title_content.'
                </a>
              </li>
              ';
            }elseif ($notification->type_of_notification == 'Reply') {
              echo '
              <li>
                <a href="'.$notification->href.'">
                  <i class="ion-chatbubbles"></i> '.$notification->title_content.'
                </a>
              </li>
              ';
            }
          }
          echo '
            </ul>
          </li>
        </ul>
      ';
  }

我对长时间的民意调查并不熟悉,所以我道歉了。顺便说一下,我正在使用Codeigniter框架。提前谢谢。

1 个答案:

答案 0 :(得分:0)

你的代码看起来是正确的但是如果你真的想要使用这种方法,你仍然可以改进你的代码。

因此,首次加载页面时,您将收到该用户的所有新通知。现在在会话中存储通知的最后一个ID。即,如果最后插入的通知ID为200,例如,只需在会话中添加商店200。

当您对php函数进行ajax调用时,从会话中获取存储的通知ID,并在when条件中添加一个条件

->where("notification_id",">",$YOUR_ID);

因此,根据我的示例,您将在ID 200之后添加所有通知。现在,在发送此结果之前,请使用最新的通知ID更新会话值。

在您的AJAX功能中,您可以简单地将新数据附加到现有数据,而不是替换整个HTML。因此,而不是从数据库中获取所有行并替换HTML仅获取新添加的数据并追加。