php简单的“长轮询”的实例代码
我们可以在网上找到信息是如何长轮询的实例,但都比较复杂。这里提供一个简单的例子.前端用jquery,后台处理用php。
注:Apache是不适合担任长轮询请求,这会很快耗尽服务器上的线程(因此提的例子并不需要扩展),只是一个通用的,简单的,用于了解具体的实现过程。
这里是一个非常简单的例子,在2-10秒后发送一个简单的字符串。 有三分之一的机会返回错误404(错误返回给JavaScript示例显示并处理),其中将“长轮询”服务器的返回信息.
msgsrv.php
<?php
if(rand(1,3) == 1){
/* Fake an error */
header("HTTP/1.0 404 Not Found");
die();
}
/* Send a string after a random number of seconds (2-10) */
sleep(rand(2,10));
echo("Hi! Have a random number: " . rand(1,10));
?>
注意:对于一个真正的网站,一个普通的web服务器,比如Apache上运行,这将很快扳消耗所有的“工作线程”,让它无法响应其他请求。要解决这个问题,建议用python,它是不依赖于每个单一线程请求的“长轮询服务器”。 cometD是流行的一种(在几种语言中),以至Tornado专门为这样的任务做了一个新的框架(专为FriendFeed上的长轮询代码)......但作为一个简单的例子,Apache是绰绰有余!该脚本可以很容易地用任何语言编写(我选择的是Apache / PHP,因为他们是很常见的,碰巧我在本地能运行它们)
在Javascript中,您请求的上述文件(msg_srv.php),并等待响应。当你得到一个响应,对返回的数据进行处理,然后再请求,触发新的等待,如此重复这个过程.
下面是这样一个页面的一个例子。当页面加载时,它发送msgsrv.php文件的初始请求。如果成功,我们将消息附加到div上,然后在1秒钟后,我们再次调用该waitForMsg函数,这将触发等待。
如果返回错误(无法打到页面),它附加到显示错误信息的div上,等待15秒,然后重试(等同于我们等待1秒接收到的信息的处理).
long_poller.htm
近期文章
- 织梦5.7{dede:php}标签不起作用的解决办法
- php版本non-thread-safe和thread-safe的区别
- 什么是fatal flex scanner internal error--end of buffer missed
- php文件命名建议用小写
- php cookie字典
- seft和static在php中有什么不同
- 用php快速获取图片大小
- 用php的json_decode()检测json数据是否合法
- php三个等号
- unset和=null有什么不同
- php如何捕获一个警告信息
- 如何获得php数组中最后一个元素的键名?
- 在PHP中,你如何改变数组中某一元素的键名?
- php多维数组转xml
- php如何转化数组为SimpleXML对象
- php如何把数组定义为常量
- php根据数组中的值删除数组中的元素
- 计算两个日期相差多少天
- 如何捕获var_dump的输出结果保存到一个字符串中?
- 用php获取完整的URL