【问题标题】:Long polling chat system长轮询聊天系统
【发布时间】:2013-03-28 20:58:34
【问题描述】:

我知道长轮询是让聊天更新其内容的最佳方式,我知道 web-socket 但我认为长轮询是最好的,因为许多浏览器不支持 web-socket 。问题是我不知道如何编写长轮询脚本,我有一个常规的 ajax 和一个常规的 php get 和 post 脚本,那么我怎样才能使这个 php 代码和 ajax 代码以长轮询的方式工作? (我不希望它每秒都在请求我希望它从数据库中回显任何新消息......)

这是我的 ajax 代码:-

var chat = {}

chat.fetchMessages = function () {
$.ajax({
    url: 'ajax/ajax/chat.php',
    type: 'POST',
    data: { method: 'fetch' },
    success: function(data) {
        $('#chats').html(data);
        $('#chatshere').scrollTop($('#chatshere')[0].scrollHeight);
   }
}); 

}

chat.interval = setInterval(chat.fetchMessages, 1000);
chat.fetchMessages();

这是我的 php 代码:-

<?php
require '../core/init.php';
if(isset($_POST['method']) === true && empty($_POST['method']) === false) {

$chat = new Chat();
$method = trim($_POST['method']);

if($method === 'fetch') {

    $messages = $chat->fetchMessages();

    if(empty($messages) === true) {
        echo 'There is no any messages !';
    }
    else
    {
        foreach($messages as $message) {
        $log_username = $_SESSION['username'];

            if($message['user1'] == $log_username){
            ?>
            <ul class="mychat">
            <li class="first">
            <div class="sOutline">
            <div class="suser">
            <a href="#">
            <img style="height:30px; width:30px;" title="belowfs" alt="belowfs" class="profilepic-belowfs" src="http://demo.scritterscript.com/images/membersprofilepic/thumbs/default-s.jpg">
            </a>
            </div>
            </div>
            </li>                                          
            <li style="margin-left:-5px;">
            <div style="border:1px solid #0099CC; border-radius:5px; background:#0099CC; color:#FFFFFF; padding:7px; max-width:165px;">
            <?php echo nl2br($message['message']); ?>
            </div>
            </li>
            </ul>
            <?php
            }else if($message['user2'] == $log_username){
            ?>
            <ul style="float:right;" class="hischat">
            <li class="first">
            <div class="sOutline">
            <div class="suser">
            <a href="#">
            <img style="height:30px; width:30px;" title="belowfs" alt="belowfs" class="profilepic-belowfs" src="http://demo.scritterscript.com/images/membersprofilepic/thumbs/default-s.jpg">
            </a>
            </div>
            </div>
            </li>                                          
            <li style="margin-right:-5px;">
            <div style="border:1px solid #999; border-radius:5px; background:#999; color:#FFFFFF; padding:7px; max-width:165px;">
            <?php echo nl2br($message['message']); ?>
            </div>
            </li>
            </ul>
            <?php
            }
        }
    }
}
else if($method === 'throw' && isset($_POST['message']) === true) { 
    $message = trim($_POST['message']);
    if(empty($message) === false) {
        $chat->throwMessage($_SESSION['user'], $message);   
    }
}
 }
 ?>

非常感谢...

【问题讨论】:

标签: php ajax long-integer polling


【解决方案1】:

你可能想这样做

chat.interval = setInterval(function(){chat.fetchMessages()}, 5000);

而不是

chat.interval = setInterval(chat.fetchMessages, 1000);

用于每 5 秒获取一次消息。休息取决于您的 PHP 代码来回显新消息。

【讨论】:

  • 感谢您的快速回放,但您能告诉我这会做什么吗?
  • 将每 5 秒请求一次。我想我误读了你的问题。对吗?
  • 是的,我希望它是长轮询(仅在可用时将新消息带入数据库,而不仅仅是像我的代码那样继续请求)
  • 我认为如果您不打算使用流/套接字,那么您作为替代者所做的事情是正确的。就像它说的那样,你应该考虑只在你的 PHP 脚本中传递新消息,以减少网络流量和响应大小。
  • 你的意思是我必须首先从数据库中获取所有消息然后我检查他们的新消息是否可用,我知道如何使用短轮询 ajax 来做到这一点,但我该怎么做它带有长轮询(我希望它查看是否有新消息可用)
【解决方案2】:

这是一个链接,其中清楚地解释了不同的方法:

What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?

长轮询系统:

  • 客户端使用常规 http 向服务器请求网页(参见上面的 http)。
  • 请求的网页执行从服务器请求文件的 javascript。
  • 服务器不会立即响应请求的信息,而是等待有新信息可用。
  • 当有新信息可用时,服务器会以新信息进行响应。
  • 客户端收到新信息后,立即向服务器发送另一个请求,重新启动进程。

如果要获取消息的时间间隔,您可能需要查看 Ajax 轮询部分。

【讨论】:

  • 包括代码或建议的解决方案,如果链接被破坏,那么这个答案将会失效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 2015-03-05
  • 2012-11-06
  • 2013-08-14
  • 2012-10-22
  • 1970-01-01
相关资源
最近更新 更多