1、轮询(Polling):客户端按规定时间定时向服务端发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接,这种方式简单直接,但频繁请求可能会造成服务器压力大和资源浪费。
2、长轮询(Long Polling):属于轮询的升级版,在客户端和服务端都进行了一些改造,使得消耗更低,速度更快,客户端发送请求后,如果服务端没有数据可返回,会保持连接不断开,直到有数据才返回并结束连接,客户端再立即发起下一次请求。
1、客户端:通过JavaScript设置一个Ajax请求,当请求成功返回数据后,在回调函数中再次发起新的Ajax请求,形成不间断的请求循环,可以设置超时时间,当请求超时未返回时,也再次发起请求。
2、服务端:接收到客户端的请求后,查询数据库是否有新的数据,如果有数据,则将数据返回给客户端并结束请求;如果没有数据,则保持连接不断开,继续等待新数据的到来,直到有数据或超过一定的等待时间后再返回响应。
比较项目 | 轮询 | 长轮询 |
资源消耗 | 较高,因为不管是否有数据更新,都会定期发送请求 | 较低,只有在有数据更新时才会返回响应,减少了不必要的请求和数据传输 |
实时性 | 较差,存在一定时间的延迟,取决于轮询的时间间隔 | 较好,一旦有数据更新就能及时通知客户端 |
实现复杂度 | 简单,只需按照固定时间间隔发送请求即可 | 相对复杂,需要处理连接的保持和超时等问题 |
1、实时聊天:可以实现类似即时通讯的功能,让用户能够及时收到对方发送的消息。
2、实时数据推送:如股票行情、物流信息等的实时更新。
3、在线游戏:用于同步游戏中的实时状态和数据。
1、前端代码(HTML + JavaScript)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Ajax 长轮询示例</title> </head> <body> <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script> <script type="text/javascript"> var getting = { url: 'server.php', dataType: 'json', success: function (res) { console.log(res); $.ajax(getting); // 关键在这里,回调函数内再次请求Ajax }, // 当请求时间过长(默认为60秒),就再次调用ajax长轮询 error: function (res) { $.ajax(getting); } }; $.ajax(getting); </script> </body> </html>
2、后端代码(PHP)
<?php // 这段AJAX请求时间永不过期 set_time_limit(0); $pdo = new PDO('mysql:dbname=test;host=127.0.0.1', 'root', 'root'); $resource = $pdo->query('select from t1'); $result = $resource->fetchall(); while (true) { if ($result) { // exits data print_r(json_encode(array('success' => '存在数据,返回'))); exit(); // 输出数据,退出,然后客户端不间断继续发起请求 } // 数据不存在,继续循环。 } ?>
1、问题:Ajax长轮询和WebSocket有什么区别?
解答:Ajax长轮询是通过不断地发送Ajax请求来模拟实时通信,每次请求都需要经历建立连接、发送请求、接收响应、断开连接的过程,相对来说效率较低且资源占用较大,而WebSocket是一种特殊的网络协议,它基于TCP协议,建立了一种持久化的连接,服务器可以直接主动地向客户端推送消息,无需客户端发送请求,因此在实时性和性能方面更优,不过WebSocket的兼容性相对较差,部分低版本浏览器可能不支持。
2、问题:如何优化Ajax长轮询的性能?
解答:可以从以下几个方面优化Ajax长轮询的性能,一是合理设置请求的时间间隔和超时时间,避免过于频繁的请求和过长的等待时间;二是在服务端进行优化,如优化数据库查询语句、使用缓存等,减少数据处理时间;三是采用负载均衡等技术,分散请求压力,提高系统的并发处理能力。