Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

PHP实现短连接

  假如你去蛋糕店定做一个蛋糕,你会呆着看糕点师傅做完吗?正常都是先预订,然后去做别的事情,过一段时间再去取吧?或者蛋糕店有送货上门的服务,你定了蛋糕后留下地址它会给你送到。总之,正常人是不会呆着等的。那么我们给服务器发送一个数据让它“做蛋糕”为什么要等呢?糕点师被别人看着做事情当然会比平时自己完成的时候更有压力。服务器也一样,把请求留在服务器等服务器等待服务器也一样会感觉到压力。而且请求本身可以做别的事情,为什么非要吃饱撑着看别人做蛋糕呢?

  为了不让客户端请求在服务器瞎等,我们就在程序中引入了短连接的概念。说到短连接,那和它相对的就是长连接,这在之前的文章中有说过,这是一种Web通信技术。短连接也一样,通常是用做Web通信的。除了长连接和短连接之外,我们平时用的连接是不长不短的普通连接,在这里做下区分别搞混了。
  通常PHP会把所有的代码都执行完才断开HTTP连接,这当然不行。如果PHP页面处理数据需要很长时间,我们当然要先把请求断开再处理数据。现在有一个PHP代码,执行需要5秒,5秒后会把用户发送过来的数据写入一个文件中。我们要在客户端的数据发送成功时马上断开,别让它等这5秒。 //突破PHP运行时限
set_time_limit(0);
//无视请求断开
ignore_user_abort();
//发送HTTP成功状态码
header('HTTP/1.1 200 OK');
//欺骗请求说“返回的数据是0字节”
header('Content-Length:0');
//威胁请求说“返回完成就自觉点断开”
header('Connection:Close');
//假装输出数据,让请求觉得数据已经输出了
flush();

//接下来是蛋糕师傅的工作了
sleep(5);//反正客户走了,先睡一觉
//醒来再做蛋糕
file_put_contents('Cake.txt',$_GET['data']);
  看吧,我们使用了各种手段,软硬兼施才让请求自己断开的。不过这已经够了,这就是我们要的结果。但是这样的短连接也带来了一个问题,我想大家都感受到了,就是数据返回的问题。现在是不去傻傻的等糕点师做蛋糕了,但是蛋糕做完了总得拿吧?拿蛋糕又是一件麻烦的事情,不过现在都流行送货上门不是吗?为了避免悲剧的发生,我们要来创造戏剧。看看20世纪的美国搞笑喜剧片吧,喜剧演员总是一胖一瘦一高一矮成对出现的。这样的组合总是让人忍俊不禁。所以短连接最好的搭档就是长连接了,长连接的特长就是“送外卖”。由于它一直和客户端保持通信,所以只要服务器做完“蛋糕”就可以委托长连接给短连接留下的地址(就是回调函数或者业务ID什么的)送去。这样,就可以构造一个很不错的“蛋糕式Web通信系统”。
  这篇文章要说的就是这么多,上面提到的长连接其实换成其它Comet方法也可以,比如长轮询什么的。反正Comet方法基本都是“长”的,和这个短连接一起使用必定是喜剧啊。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^