手机版

解析PHP中实现无阻塞模式的方法

时间:2021-08-30 来源:互联网 编辑:宝哥软件园 浏览:

本文阐述了用PHP实现无阻塞模式的方法。分享给大家参考,如下:

程序非阻塞模式在这里也可以理解为并发。并发可以分为网络请求并发和本地并发。

我们先来谈谈网络请求并发

理论描述

假设有一个客户端,程序逻辑是请求三个不同的服务器处理自己的响应。传统的模型当然是按顺序执行的,首先发送第一个请求,在发送第二个请求之前等待响应数据,以此类推。就像单核CPU一样,一次只能处理一件事情,其他的事情暂时被屏蔽。并发模式允许三个服务器同时处理自己的请求,可以重用很多时间。

画一幅图来更好地说明这个问题:

前者为阻塞模式,忽略请求响应时间,总耗时700ms;在后一种非阻塞模式下,由于可以同时处理三个请求,因此总时间消耗仅为300 ms。

代码实现

?项目开始于。日期(' h:i:s ')。/n ';$ time out=3;$ sockets=array();//套接字句柄数组//一次发起多个请求$ delay=0;while($ delay 3){ $ sh=STREAM _ socket _ CLIENT(' localhost :80 ',$errno,$errstr,$timeout,STREAM _ CLIENT _ ASYNC _ CONNECT | STREAM _ CLIENT _ CONNECT);/*这里需要有一点延迟,否则下面fwrite中的套接字句柄可能不会被真正使用。应该是PHP中的一个bug。经查,官方bug早在2008年就在我的5.2.8中提交了,至今未解决。不知道在最新的5.3 */usleep(10)中有没有修改;if($ sh){ $ sockets[]=$ sh;$http_header='GET /test.php?n={ $ delay } HTTP/1.0/r/n ';$http_header。=' Host : localhost/r/n ';$http_header。=' accept : */*/r/n ';$http_header。=' Accept-charset : */r/n ';$http_header。='/r/n ';fwrite($sh,$ http _ header);}否则{ echo 'Stream无法正确打开。/n ';} }//非阻塞模式接收响应$ result=array();$ read _ block _ size=8192while(count($ sockets)){ $ read=$ sockets;$n=stream_select($read,$w=null,$e=null,$ time out);//if ($n 0) //据说stream_select的返回值并不总是可信的if(count($ read)){/* stream _ select通常会打乱$ read,所以我们需要计算我们从哪个套接字读取。*/foreach($读取为$r) { $id=array_search($r,$ sockets);$data=fread($r,$ read _ block _ size);if(strlen($ data)=0){ echo ' Stream { $ id }在关闭。日期(' h:i:s ')。/n ';fc lose(r);unset($ sockets[$ id]);} else { if(!isset($ result[$ id])$ result[$ id]=' ';$result[$id]。=$ data} } } else { echo '超时!/n ';打破;} }//print _ r($ result);一些注意事项:

1.使用stream_socket_client函数链接请求服务器和端口(为简单起见,这里使用相同的地址localhost)。它不限于http协议,而是可以广泛应用于所有的TCP/IP协议中。详情请参考手册。

2.这里,在链接成功之后,通过发送相应的http头信息获得不同的响应(这里,网站根目录下的test.php被用作服务器)。

3.发送头之前有一点点延迟,代码中已经有注释。

命令行界面模式运行结果:

如果您多次运行它,您会发现三个请求的结束顺序是无序的。这个演示太简单了,导致整个过程在一秒钟内完成,但是可以延迟三个不同的请求,看看时间重用在非阻塞中的效果。

让我们再来谈谈本地并发

局部并发只能通过语言自身的特点在程序本身实现多任务效果。一般来说,当前的语言可以实现多线程或多进程。由于PHP不支持多线程,目前只能采用多进程模式,让操作系统帮助实现本地并发。

至于代码实现,方法不止一个,比如pcntl扩展(封装fork等进程控制函数,与C语言中使用的非常相似,但windows中没有)、proc_open、popen等。所以这里就不详细描述了。详情可以搜索“php多进程”了解:)

更多对PHP相关内容感兴趣的读者可以查看本网站的话题:《php socket用法总结》、《php字符串(string)用法总结》、《PHP数学运算技巧总结》、《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP网络编程技巧总结》、0103010。

希望本文对PHP编程有所帮助。

版权声明:解析PHP中实现无阻塞模式的方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。