- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
php长连接,奏是这么简单
说到长链接大家肯定不陌生,就是复用一个链接持续不断的进行数据交互,它不像那些一夜情似的服务,需要频繁的打开和关闭链接,效率低的同时还增加了业务的复杂度。在裆下很多互联网业务场景都需要长连接的支持,比如:游戏、聊天、信息推送等等等,今天我们就一步一步来揭秘php长连接的玩法。我相信任何一项技术的实施都是因为业务场景的需要,所以这次我们还拿聊天室说事儿。
0x00 初试牛刀
记得以前用php写聊天室还是用polling的方式,毫无疑问,一提到polling,肯定会有人说long polling,没错!long polling也很不错,但在nginx+fpm上面玩这个多少有些费劲,毕竟一个请求需要占一个php进程(就算是用apache+php_mod,也需要一个请求一个线程),所以要是几个人随便玩玩还行,一旦放到线上人多起来,这基本就废了。所以还是采用polling的方式,这样不会阻塞进程,并且一个请求能立即得到响应,但是带来的新问题是需要不停的向服务器发送请求,而且随着间隔的时间越大导致消息延迟就越大。
0x01 华丽变身
在经历了上面那种一秒一小卡,三秒一大卡的场面!再也看不下去了,于是决定变身为真正的男人,哦不对,应该是真正的长连接。去他妈的polling, 去他妈的long polling,去他妈的webserver,统统靠边站,让flash socket(或者说websocket)来统治这个世界!开始了真正意义上的长连接之旅。要玩长连接总是少不了跟socket打交道吧,作为世界上最好的语言(没有之一),socket的封装自然是少不了滴。抄起socket_***就开干,于是就有了下面这一托代码,长连接是吧?延迟是吧?socket是吧?汤药费是吧?so easy....
$sfd?=?socket_create(AF_INET,?SOCK_STREAM,?0);?
?
socket_bind($sfd,?,?1234);?
?
socket_listen($sfd,?511);?
?
socket_set_option($sfd,?SOL_SOCKET,?SO_REUSEADDR,?1);?
?
socket_set_nonblock($sfd);?
?
$rfds?=?array($sfd);?
?
$wfds?=?array();?
?
do{?
?
????$rs?=?$rfds;?
?
????$ws?=?$wfds;?
?
????$es?=?array();?
?
????$ret?=?socket_select($rs,?$ws,?$es,?3);?
?
?????
?
????//read?event?
?
????foreach($rs?as?$fd){?
?
????????if($fd?==?$sfd){?
?
????????????$cfd?=?socket_accept($sfd);?
?
????????????socket_set_nonblock($cfd);?
?
????????????$rfds[]?=?$cfd;?
?
????????????echo?new?client?coming,?fd=$cfd\n;?
?
????????}else{?
?
????????????$msg?=?socket_read($fd,?1024);?
?
????????????if($msg?=?0){?
?
????????????????//close?
?
????????????}else{?
?
????????????????//recv?msg?
?
????????????????echo?on?message,?fd=$fd?data=$msg\n;?
?
????????????}?
?
????????}?
?
????}?
?
?????
?
????//write?event?
?
????foreach($ws?as?$fd){?
?
????????socket_write($fd,?........);?
?
????}?
?
?????
?
}while(true);?
0x02 登峰造极
从玩socket的那天起,google就轻言细语的跟我说,高并发下的select不要用啊,效率底啊,win要用iocp啊, linux要用epoll啊,blablablabla...哦!好吧,既然google都这么说了,我也不能跟他老人家较真不是,又一次决定(为什么要说又呢?)要听google话,把epoll搞起来,可总不能自己写啊?像我这么懒的人还是整个扩展好了,libevent走你!经过疯狂的编(co)码(py),神作终于出山,具体能有多高效,
您可能关注的文档
最近下载
- 江西农业大学2021-2022学年第1学期《高等数学(上)》期末考试试卷(B卷)及标准答案.pdf
- 施工组织设计-江城水泥混凝土土.doc VIP
- 山西农业大学2021-2022学年第1学期《高等数学(上)》期末考试试卷(A卷)及标准答案.pdf
- 八年级上语文 《红星照耀中国》纪实作品人教PPT课件优质课比赛公开课获奖.ppt
- B2C电子商务信任实证研究的现状与思考.doc
- 有理数乘方练习题.doc VIP
- 经典电动力学-北京大学物理学院.PDF
- 幂的乘方与积的乘方-练习题(含答案) .doc VIP
- 政府采购非招标方式概述 .ppt VIP
- 云南南博会会展服务中心招聘笔试真题2023.docx VIP
文档评论(0)