今天帮人改了个在线聊天室的作业,用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();

}

});

}

php高效轮询,PHP实现长轮询相关推荐

  1. php长轮询阻塞,ajax长轮询时php被阻塞

    刚接触实时通讯这块,知道用websocket更高效,但我想了解轮询的实现过程,循序渐进 短轮询用定时器setInterval已经实现了,但长轮询时后台进入死循环模块导致整个网站的php网页无响应,比如 ...

  2. java 实现http长轮询,Long Polling长轮询实现进阶

    Long Polling长轮询实现进阶 简书 涤生. 转载请注明原创出处,谢谢! 如果读完觉得有收获的话,欢迎点赞加关注. 介绍 由于Long Polling长轮询详解 这篇文章中的code实现较为简 ...

  3. php弹幕技术轮询,PHP实现长轮询消息实时推送功能代码

    入口文件index.html 反ajax推送 .send{color:#555;text-align: left;} .require{color:blue;text-align: right;} . ...

  4. php中长轮询,PHP完成长轮询【代码示例】_后端开发

    传统的AJAX轮询体式格局,客服端以用户定义的时候距离去服务器上查询最新的数据.种这类拉取数据的体式格局须要很短的时候距离才保证数据的精确度,但太短的时候距离客服端会对服务器在短时候内发送出多个要求. ...

  5. ajax长轮询tornado,Tornado长轮询和WebSocket

    Http协议是一种请求响应式协议, 不允许服务端主动向客户端发送信息. 短轮询是一种简单的实现服务端推送消息的解决方案, 客户端以一定间隔自动向服务端发送刷新请求, 服务端返回要推送的消息作为响应. ...

  6. Ajax轮询,Ajax长轮询和websockte

    http协议介绍: http协议是请求响应式的,每个http相应都对应一个http请求,http协议是没有状态的,多个http协议之间是没有关系的. http协议的被动性:在标准的http语义中,浏览 ...

  7. ajax长轮询 java web_Ajax长轮询

    varlongPollingCount; $(function() { longPollingCount= 1; $("#msg").html("第" +lon ...

  8. 用了这么久配置中心,还不知道长轮询是什么?

    前言 传统的静态配置方式想要修改某个配置时,必须重新启动一次应用,如果是数据库连接串的变更,那可能还容易接受一些,但如果变更的是一些运行时实时感知的配置,如某个功能项的开关,重启应用就显得有点大动干戈 ...

  9. 从RocketMQ看长轮询(Long Polling)

    前言 消息队列一般在消费端都会提供push和pull两种模式,RocketMQ同样实现了这两种模式,分别提供了两个实现类:DefaultMQPushConsumer和DefaultMQPullCons ...

最新文章

  1. 公式没有编号_知乎公式编辑器的一些小技巧 amp; 使用规范
  2. linux 环境变量文件_应急响应系列之Linux库文件劫持技术分析,有点硬核哟
  3. 用996打败员工,用“奋斗”替代生活
  4. qemu交叉编译arm内核_arm qemu (1) 内核启动调试环境搭建
  5. Java四种线程池的使用
  6. npm 安装less插件_IDEA编译less插件LESS CSS Compiler的安装
  7. mouseover/out和mouseenter/leave的区别及用法
  8. 案例:实现商品分类导航栏
  9. 1006. 换个格式输出整数 (15)-PAT乙级真题
  10. 智能机器人机器人心得_如果机器人说到上帝
  11. HttpUtil工具类
  12. 【PMP】PMBOK 笔记 第6章 项目时间管理
  13. PostmanCn: Postman中文版
  14. 百度网盘怎么批量改名(包含子文件夹)
  15. 规则引擎--Drools之规则文件
  16. 视频剪辑-OpenShot
  17. php 查询mysql数据库 打印_php 查询mysql数据库 打印
  18. 多线程发生异常怎么处理咩?
  19. 给datatable添加序号列
  20. google chorme f2 无法打开开发者工具

热门文章

  1. 国外:sap_oracle 国内:用友_金蝶_浪潮 我很想,中国ERP市场的发展现状如何?用友、浪潮、金蝶都有何动作?...
  2. 情有独钟,迷情电子三五年(二)
  3. c语言中求一个3x3的整形矩阵,编程实现求两个3x3矩阵的和(C语言)
  4. bzoj3208: 花神的秒题计划Ⅰ
  5. c#--实例选号器--实现打印、序列化方式保存
  6. Flask学习笔记(二):基于Flask框架上传图片到服务器端并原名保存
  7. memset函数的实现方式
  8. AtCoder Grand Contest 017 迟到记
  9. 毕业生入户深圳2023办理全流程
  10. 美国才是颠倒是非的“黑客帝国”