php 长轮询_js轮训

php 长轮询_js轮训今天帮人改了个在线聊天室的作业,用PHP+Ajax实现了一个长轮询(longpolling)。服务端主要是两点,一个是用set_time_limit(0);去除页面执行时间的限制。再就是用一个while判断是否有数据,没有的话就sleep几秒钟再重新取。客户端就是一个Ajax,把当前页面的最后一条的记录传给服务器,请求这之后的数据。回调函数sucess和error中都包括调用当前函数。以保证会一…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

今天帮人改了个在线聊天室的作业,用PHP+Ajax实现了一个长轮询(long polling)。

服务端主要是两点,一个是用set_time_limit(0);去除页面执行时间的限制。再就是用一个while判断是否有数据,没有的话就sleep几秒钟再重新取。

客户端就是一个Ajax,把当前页面的最后一条的记录传给服务器,请求这之后的数据。回调函数sucess和error中都包括调用当前函数。以保证会一个接一个的不断请求,其实这里用setInterval()也可以。如果要用回调的话,Ajax里需要加上cache: false,否则某些浏览器(如IE10)会在第二次请求的时候拿到304 Not Modified,浏览器会瞬间卡死。

具体的代码实现非常短,贴在下面:

chatview.php

set_time_limit(0);

//require(‘chatconfig.php’);

header(‘Content-type: application/json’);

//开始计算当前页面循环时间

$begintime = time();

//从某个ID开始取

$begin = 0;

if(isset($_GET[‘begin’]) && is_numeric($_GET[‘begin’]) && $_GET[‘begin’]>0)

{

$begin = $_GET[‘begin’];

}

$sql = sprintf(“SELECT * FROM (SELECT * FROM chat WHERE id > ‘%d’ ORDER BY id DESC LIMIT 100) t ORDER BY id ASC”, $begin);

$result = $mysql->query($sql);

//如果没有取到数据,且执行时间小于30秒,则暂停1秒后重新查询

while($result->num_rows == 0 && (time()-$begintime<30))

{

sleep(1);

$result = $mysql->query($sql);

}

//用JSON返回数据

$ret = array();

if ($result->num_rows > 0)

{

while($row = $result->fetch_assoc())

{

$ret[]=array(‘id’=>$row[“id”],’nick’=>$row[“nick”],’content’=>$row[“content”]);

}

}

echo json_encode($ret);

$mysql->close();

?>

JavaScript代码(jQuery)

function chat_update()

{

$.ajax({

url: “chatview.php”,

//取最后一条ID之后的数据

data: {begin: window.Lastid},

cache: false,

success: function (data) {

//将数据填入页面上

resolveMsg(data);

chat_update();

},

error: function(){

chat_update();

}

});

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183759.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 华三vlan配置_路由器配置vlan的步骤

    华三vlan配置_路由器配置vlan的步骤基于MAC地址划分vlan配置思路:创建VLAN100、VLAN200。配置DeviceA和DeviceC的上行端口为Trunk端口,并允许VLAN100和VLAN200的报文通过。配置DeviceB的下行端口为Trunk端口,并允许VLAN100和VLAN200的报文通过;上行端口分别加入VLAN100、VLAN200。Laptop1和Laptop2的MAC地址分别与VLAN100、VLAN200关联。SWA与SWC的配置一致:创建vlan:vlan100

    2022年9月19日
    2
  • 拉姆达表达式的使用[通俗易懂]

    拉姆达表达式的使用[通俗易懂]1.什么是λ表达式 λ表达式本质上是一个匿名方法。让我们来看下面这个例子:   publicintadd(intx,inty){       returnx+y;   }转成λ表达式后是这个样子:       (intx,inty)-&gt;x+y;参数类型也可以省略,Java编译器会根据上下文推断出来:   (x,y)…

    2022年9月19日
    1
  • 谷歌提示密码外泄_你不要把手机丢了泄露

    谷歌提示密码外泄_你不要把手机丢了泄露前不久,Google正式对外推出了基于Gmail的Google Buzz,以此重新进入了微博客和社交网络服务。Google Buzz可以认为是一个类似微博客的状态更新工具,用户可以在里面分享消息、图片

    2022年10月15日
    2
  • Enterprise Library 3.1 介绍「建议收藏」

    Enterprise Library 3.1 介绍「建议收藏」EnterpriseLibrary3.1是Microsoftpatterns&practicesEnterpriseLibrary的一个新的发行。EnterpriseLibrary是一个应用程序块的集合。这些可重用的软件组件为帮助开发者解决普通企业开发的挑战而设计。这个EnterpriseLibrary发行包括了二个新的应用程序块,一个用于创建应用程序块和提供程序的软

    2022年10月20日
    20
  • vue slot插槽_vue插槽的使用场景

    vue slot插槽_vue插槽的使用场景为什么使用slotslot(插槽)在生活中很多地方都有插槽,电脑usb的插槽,插板当中的电源插槽插槽的目的是为了让我们原来的设备具备更多的扩展性比如电脑的USB我们可以插入U盘,手机,鼠标,键

    2022年8月7日
    6
  • 西门子PLC_300F系列PLC_初始化MMC卡实验教程 S_L01[通俗易懂]

    西门子PLC_300F系列PLC_初始化MMC卡实验教程 S_L01[通俗易懂]西门子300F安全PLC忘记安全密码没有读卡器如何清空MMC卡西门子300FPLC安全密码操作前注意事项本次实验使用的硬件设备将新硬件进行组态和IP分配使用此硬件配合MMC进行操作西门子300FPLC安全密码300系列PLC在下载程序前必须设定一个安全密码,此密码会写在MMC卡里面,而且无法通过PLC拨码初始化,如果忘记密码可以通过使用西门子官方读卡器进行格式化,但是绝对不能插在普通读卡器或者带有读卡器的电脑上,这样操作会导致内存卡误格式化,损坏MMC卡。本实验将讲解如何在没有西门子官方读卡器的情

    2022年5月9日
    245

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号