PHP+Socket中IO多路复用及实现web服务器的方法是什么


本篇内容介绍了“PHP+Socket中IO多路复用及实现web服务器的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 多路复用前文 通过原生 socket 实现了简单的服务端与客户端通信,但当有多个客户端连接时,服务端仅能处理第一个客户端的请求,而无法对后续客户端服务产生这种情况的原因是因为IO模型是阻塞的,同一时刻只能由一个客户端进行访问,解决此问题主要有两种解决方案:多进程,即在服务端启动多个进程监听IO多路复用机制,简单来说实现了 N 个客户端使用一根网线同时访问同时多路复用又分为两个不同的模型,即 selectepoll,常见的软件中,Apache 使用了 select 模型,nginx 则使用 epoll 模型。在 php 中内置了 select 模型,对应的函数为 socket_select,多路复用是实现 http 服务器的基础在前文中我们介绍了 php 原生 socket 内置了 socket_select 函数实现了 select 模型,其语法如下:

socket_select(
array&$read,
array&$write,
array&$except,
int$seconds[,
int$microseconds=0]):int|false

read服务端监听的套接字资源,当他有变化(即收到新的消息或有客户端连接、断开)时,socket_select 函数才会返回(否则继续阻塞),同时修改该变量为当前发生事件(收到消息或有客户端连接、断开)的套接字资源列表,并继续向下执行。write监听是否有客户端写数据,传入 null 则代表不关心是否有写变化except套接字内要排除的元素,传入 null 是 「监听」 全部seconds秒和微秒一起构成超时参数。如果传入 null 则会阻塞,为 0 非阻塞,如果是 >0 则为最大阻塞时间microseconds我们在 上篇文章 简单实现了 socket 服务端监听与客户端的连接,接下来我们在服务端监听代码的基础上通过多路复用优化代码:


在本示例中 socket_select 函数会阻塞当前进程,当 $tmp_sockets 数组内的 socket 资源有新的客户端连接或断开或收到新消息时,会将 $tmp_sockets 数组修改为当前活跃的 socket 资源,随后通过遍历该数组处理业务逻辑。使用socket实现简易http服务器http 协议是在 socket 的基础上规定了指定的数据格式,所以我们只需在 socket_write 时按照格式发送数据,浏览器就可正常响应请求

thisisphpworker';
$len=strlen($output);

$response="HTTP/1.1200OKrn";
$response.="content-type:text/htmlrn";
$response.="server:phpsocketrn";
$response.="Content-Length:{$len}rnrn";

$response.=$output;

socket_write($sock,$response);
}
}
}

在服务端运行此示例,随后在浏览器访问 ip:8888 ,可以看到如下:同时服务端会输出如下内容:

GET/HTTP/1.1
Host:124.222.**.**:8888
Connection:keep-alive
Cache-Control:max-age=0
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0(WindowsNT10.0;免费云主机域名Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/101.0.0.0Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding:gzip,deflate
Accept-Language:zh-CN,zh;q=0.9
Cookie:jenkins-timestamper-offset=-28800000;_ga=GA1.1.1403944751.1652010033;_ga_2GM6102E19=GS1.1.1652802985.7.1.1652803014.0

该内容即为用户端请求原始数据,可解析此数据并根据请求做出响应,比如使用 file_get_content 读取指定文件内容返回给浏览器。“PHP+Socket中IO多路复用及实现web服务器的方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!

相关推荐: Node.js中的npm与包怎么使用

本篇内容主要讲解“Node.js中的npm与包怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中的npm与包怎么使用”吧!什么是包Node.js中的第三方模块又叫做包,指的是同一种东西,知识叫法…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/09 17:32
下一篇 03/09 18:13

相关推荐