Php 长轮询聊天系统
我知道长轮询是更新聊天内容的最佳方式,我也知道WebSocket,但我认为长轮询是最好的方式,因为许多浏览器不支持WebSocket。问题是我不知道如何编写长轮询脚本,我有一个常规的ajax和一个常规的php get和post脚本,那么我如何才能使这个php代码和ajax代码以长轮询方式工作?(我不希望它每秒钟都在请求我希望它回显数据库中的任何新消息…) 以下是我的ajax代码:-Php 长轮询聊天系统,php,ajax,long-integer,polling,Php,Ajax,Long Integer,Polling,我知道长轮询是更新聊天内容的最佳方式,我也知道WebSocket,但我认为长轮询是最好的方式,因为许多浏览器不支持WebSocket。问题是我不知道如何编写长轮询脚本,我有一个常规的ajax和一个常规的php get和post脚本,那么我如何才能使这个php代码和ajax代码以长轮询方式工作?(我不希望它每秒钟都在请求我希望它回显数据库中的任何新消息…) 以下是我的ajax代码:- var chat = {} chat.fetchMessages = function () { $.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);
}
}
}
?>
-
-
-
-
非常感谢…您可能需要这样做
chat.interval = setInterval(function(){chat.fetchMessages()}, 5000);
而不是
chat.interval = setInterval(chat.fetchMessages, 1000);
用于每5秒获取消息。Rest由您的PHP代码来响应新消息。这里有一个链接,其中清楚地解释了不同的方法: 长轮询系统:
- 客户机使用常规http(参见上面的http)从服务器请求网页
- 请求的网页执行从服务器请求文件的javascript
- 服务器不会立即响应请求的信息,而是等待有新信息可用
- 当有新信息可用时,服务器将用新信息进行响应
- 客户机接收到新信息并立即向服务器发送另一个请求,从而重新启动流程
如果要获取消息有一个间隔,您可能需要查看Ajax轮询部分。感谢您的快速重播,但是您能告诉我这将做什么吗?将每5秒请求一次。我想我误解了你的问题。是吗?是的,我希望它是长轮询(只有当数据库可用时才在数据库中引入新消息,而不是像我的代码那样不断请求),我认为如果你不打算使用流/套接字,那么你作为替代者所做的是对的。正如它所说的,你应该考虑只在PHP脚本中传递新消息以减少网络流量和响应大小。你是说我必须首先从数据库中带来所有的消息,然后我检查SE如果他们的新消息可用OK,我知道如何用短轮询Ajax来做它,但是如何用长轮询来完成它。(我想让它看看是否有新的消息可用)您可能想查看和。包括代码或建议的解决方案,如果链接断开,那么这个答案将变得死气沉沉。