PHP反向推送

反向推送技术今后非常的火, 而长轮询是贯彻反向推送的关键技术之一.

//如若要轉載本文請表明出處,免的出現版權紛爭,小编不喜歡看到这種轉載了本身的小说卻不表明出處的人
Seven{See7di#Gmail.com}
HTTP 协议的打响不必置疑。它是
Internet上绝超越5玖%消息调换的功底。可是,它也有局地局限性。越发是,它是无状态、单向的说道。请求被发送到
Web 服务器,服务器处理请求并发回一个响应
—仅此而已。请求必须由客户机发出,而服务器则只幸亏对请求的响应中发送数据。那足足会潜移默化很多门类的
Web应用程序的实用性。典型的例证正是绘声绘色程序。其余还有壹部分事例,例如竞技的比分或电子邮件程序。

HTTP的这一个局限性也是它得到一定成功的由来。请求/响应周期使它成为了经典的模子,即每种连接使用二个线程。只要能够快捷为呼吁提供服务,那种艺术就
有英豪的可伸缩性。每分钟能够拍卖大批量的伸手,只需选拔少量的服务器就足以处理不小数量的用户。对于广大经文的
Web应用程序,例如内容管理体系、搜索应用程序和电子商务站
点等等而言,那相当适合。在以上任何壹种
Web应用程序中,服务器提供用户请求的多少,然后倒闭连接,并释放那1个线程,使之能够为此外请求服务。借使提供开始数据未来仍恐怕存在交互,那么将连接
保持为打开状态,由此线程就不能够释放出来,服务器也就无法为许多用户服务。

而是,假使想在对请求做出响应并发送初阶数据以往,照旧保持与用户的互相呢?在
Web 早期,那点常动用
meta刷新完成。那将活动提醒浏览器在钦定秒数之后再也装载页面,从而协助简陋的轮询(polling)。那不只是1种不佳的用户体验,而且平常效能非常的低下。假如未有新的数据要来得在页面上啊?那时不得不再一次显现同样的页面。假使对页面包车型客车改动很少,并且页面包车型客车多数并未有变化吗?同样,不管是还是不是有需求,
都得重复请求和获得页面上的整套情节。

Ajax
的申明和流行改变了上述情景。未来,服务器能够异步通讯,由此不必再一次请求整个页面。今后得以开始展览增量式的立异。只需选择XMLHttpRequest
轮询服务器。那项技艺一般被称作Comet。那项技艺存在一些变体,每一个变体具有分化的性质和可伸缩性。大家来看望那一个不相同风格的
Comet。

Comet 风格

Ajax 的出现使 Comet
成为恐怕。HTTP的单向性质能够使得地加以规避。实际上有局部差异的秘诀能够绕过这点。您大概曾经猜到,帮忙Comet 的最简单的措施是轮询(poll)。使用XMLHttpRequest
向服务器发出调用,重返后,等待1段固定的年月(经常采纳 JavaScript 的
setTimeout函数),然后再一次调用。那是一项十一分广阔的技能。例如,超越四分之一webmail 应用程序正是透过那种技术在电子邮件到达时显得电子邮件的。

那项技能有亮点也有通病。在那种情形下,您愿意神速回到响应,仿佛其余其余Ajax请求一样。在呼吁之间必须有一段间歇。不然,一而再不停的央浼会冲垮服务器,并且那种场地下显明不持有可伸缩性。这段间歇使应用程序发生三个延时。
暂停的时光越长,服务器上的新数据就须要更加多的年华才能到达客户机。固然收缩暂停时间,又将重新面临冲垮服务器的高风险。可是另1方面,那鲜明是最简便易行的达成Comet 的格局。

后天应该提议,很五个人认为轮询并不属于 Comet。相反,他们以为 Comet
是对轮询的局限性的二个缓解方 案。最普遍的 “真正的”Comet
技术是轮询的一种变体,即长轮询(longpolling)。轮询与长轮询之间的首要差距在于服务器花多长的时日作出响应。长轮询平时将接连保持1段较长
的日子
—经常是数分钟,不过也或然是1分钟甚至越来越长。当服务器上发出有个别事件时,响应被发送并进而关闭,轮询立时重新初始。

长轮询相对于1般轮询的长处在于,数据假诺可用,便立刻从服务器发送到客户机。请求大概等待较长的年华,时期未有此外数据再次回到,不过只要有了新的数码,它
将马上被发送到客户机。因而尚未延时。倘使您使用过基于 Web
的闲话程序,也许声称 “实时”
的其余程序,那么它很或者就是采用了那种技能。

上面小编就Flex和PHP来举例说Bellamy下,常轮询如何实现.

首先将瞬间PHP端的代码,很不难 

<?php
//timeout in seconds
$timeout = 60;

// log start time
$start_time = time();

// get messge from local file
function get_msg(){
    return file_get_contents(‘msg.txt’);
}

// get message
$last_msg = get_msg();

// start the loop
while (true){
    // get current time
    $current_time = time();
    
    // check if we are timed out
    if ($current_time – $start_time > $timeout){
        echo ‘timeout! no new message!’;
        break;
    }
    
    // get latest message
    $current_msg = get_msg();
    
    // check if the message has been changed
    if ($last_msg != $current_msg){
        echo $current_msg;
        break;
    }
    // sleep 1 sec
    sleep(1);
}

浅析上边包车型客车代码, 其实原理正是在php中实践三个循环,
每趟循环的时候去访问服务器上的数量,
能够是数据库也足以是3个文本文件,那里运用文本文件,
然后判断文本文件的剧情是不是更新过,要是更新过则将数据再次回到给客户端.
在循环其中大家放入了
sleep(一)函数让代码每趟循环的时候抛锚一分钟,这样不至于过度消耗服务器CPU的财富.

下边是flex端的代码

<?xml version=”1.0″ encoding=”utf-8″?>
        <![CDATA[
            // request object
            private var req:URLRequest;
            
            // loader object
            private var loader:URLLoader;
            
            // timer
            private var timer:Timer;
            
            [Bindable]
            private var count:Number = 0;            
            
            // do some initializing
            private function init():void{
                req = new
URLRequest(‘http://127.0.0.1:8080/long\_polling.php‘);
                loader = new URLLoader();
                
                loader.addEventListener(HTTPStatusEvent.HTTP_STATUS,
onStatusChange);
                loader.addEventListener(Event.COMPLETE, onComplete);
                loader.addEventListener(IOErrorEvent.IO_ERROR,
onIOError);
                
                timer = new Timer(1000);
                timer.addEventListener(TimerEvent.TIMER, onTimer, false,
0, true);
                
            }
            
            // update the second count
            private function onTimer(event:TimerEvent):void{
                count ++;
皇冠直营现金网官方网,            }
            
            // start the request
            private function startRequest():void{
                count = 0;
                loader.load(req);
                timer.start();
                this.txtLogs.text += ‘Request started!\n’;
            }
            
            // status changed
            private function
onStatusChange(event:HTTPStatusEvent):void{
                this.txtLogs.text += ‘Status changed to ‘+
String(event.status)+’\n’;
            }            
            
            // result returned
            private function onComplete(event:Event):void{
                this.txtLogs.text += ‘Completed! Result is
‘+String(event.currentTarget.data)+’\n’;
                this.txtLogs.text += ‘Start another request!\n’;
                this.startRequest();
            }
            
            // error handler
            private function onIOError(event:IOErrorEvent):void{
                this.txtLogs.text += ‘IO Error: ‘+String(event)+’\n’;
                this.stopRequest();
            }
            
            // stop the request
            private function stopRequest():void{
                count = 0;
                this.txtLogs.text += ‘Request stopped!\n’;
                this.txtLogs.text +=
‘<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>\n’
                this.timer.stop();
                this.loader.close();
                
            }
        ]]>

笔者们新建一个flex项目, 然后在界面上放置多少个空中, 五个按钮, 八个是发端请求,
二个是停止请求, 还有一个label用来展现当前恳请所花的时间,
最终再放3个TextArea来体现log.

恳请的原理也1如既往不难, 通过U奥迪Q7LLoader和U库罗德LRequest来促成,
和常见的http请求并无两样.可是在三次呼吁获取到结果的时候(走到onComplete()函数),
大家须求再一次先导此外2回查询,通过那种艺术大家就足以模拟出叁个类似与C/S架构的网络连接,
而服务端上的其余更新则会自动推送到客户端了.

相关文章