首页 » SEO优化 » phpsocket非堵塞技巧_浅谈非堵塞轨范的理解

phpsocket非堵塞技巧_浅谈非堵塞轨范的理解

访客 2024-12-18 0

扫一扫用手机浏览

文章目录 [+]

这篇文章,紧张讲讲非堵塞编程带给程序的意义。
在我们谈到本日的主题之前,先来做一点根本知识的补充。

什么是I/O

phpsocket非堵塞技巧_浅谈非堵塞轨范的理解

我们的打算机系统架构大略单纯可算作如下,I/O接口连接其他硬件如:网卡、键盘鼠标、磁盘等。
I代表Input,输入数据。
O代表Output,输出数据。

phpsocket非堵塞技巧_浅谈非堵塞轨范的理解
(图片来自网络侵删)

当程序须要发送网络要求或者从磁盘中读取文件等IO操作时 CPU发出指令,然后旗子暗记经由总线到达网卡或者磁盘 然后拿到数据,再经由总线到达主存中,CPU连续对主存中的数据进行操作。

CPU的实行速率:主频 比如3GHz = 一秒钟有30亿个时钟脉冲,实行一条指令一样平常只须要几个时钟脉冲。
也便是一秒可以实行的指令常常因此亿打算的。

以网络要求为例(磁盘IO也是一样的事理),当CPU发出指令之后,想要得到结果须要经由很长的等待(比如网络延迟常常是几十ms韶光,CPU都过了多少千万个时钟脉冲了)

同步、异步、堵塞、非堵塞的观点

相信看这篇文章的你也不是第一次看到这种观点,在很多文章中常常会以购物等场景做例子。
这里只做一个大略的先容: 同步、异步分为一组观点; 堵塞、非堵塞分为一组观点; (同步、异步):关注的是:数据的吸收办法 (堵塞、非堵塞):关注的是:是否等待结果返回 这是两个分组(由于它们的关注点不同) 但是每每同步跟堵塞是一起的,异步跟非堵塞是一起的。
如果我们须要同步吸收数据,肯定要让当出路序停息,等待数据返回再做处理。

如果我们选择了异步吸收数据,程序还堵塞的话那就没什么意义了,以是非堵塞模式,一样平常会返回发送调用要求的结果,然后程序连续实行,直到结果准备好了,再通过回调函数等办法触发程序做处理。

堵塞IO存在的不敷

如果是堵塞IO的话,那么当前的进程会停息实行,直到拿到数据才会连续实行。
文件锁堵塞 以PHP中自带的Session为例的文件锁 Session以天生文件储存的,如果同一个用户同时发起多个要求,先获取文件锁的要求可以实行,后面的拿不到文件锁,以是一贯堵塞等待,假设前面的要求过了10s才实行完,后续的要求是要10s后才开始实行。
socket堵塞 写过tcp做事器的该当都会碰着这个问题 我们可以监听机器的某个端口,当有要求连接进来的时候,我们可以accept这个连接,然后读取客户端发过来的数据、发送数据回客户端等处理。

<?php$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);if (!$socket) { echo "$errstr ($errno)<br />\n";} else { // 循环吸收客户真个连接 while ($conn = stream_socket_accept($socket)) { $data = fread($conn, 8192); // 读取客户端发送过来的数据 读不到就一贯堵塞着 fwrite($conn, "hello world\n"); // 发送hello world fclose($conn); } fclose($socket);}

以上代码实现了一个建议的TCP做事器,但是由于没有办理堵塞IO的问题,以是只能处理一个客户真个要求。

当A连接进来,accept到,然后开始fread从缓冲区读取数据。
堵塞住了,进程实行停息,等待数据结果。
此时B连接进来,由于进程已经被堵塞住,以是无法被accept,更无法读取、发送数据。
A客户端发送了数据,进程规复实行,开始读取,然后输出。
然后才能accept B客户端(哪怕在此之前B已经发了很多数据,也只能从这个时候开始处理)。

非堵塞IO

为了让我们的网络做事器可以做事多个客户端,我们须要将程序改造为非堵塞的。
我们可以大略实现为:

当A连接进来了,accept起来,存到一个列表中。
连续等待监听,B连接进来了,accpet起来,存到一个列表中。
多开一个线程,不断轮询连接列表,判断连接是否有发送数据过来,有的话就实行操作(比如发送数据、关闭连接)在PHP中默认没有线程操作,并且accept操作是堵塞的,但是可以设置超时时间

点击查看原文,获取更多福利!

https://developer.aliyun.com/article/1111156?utm_content=g_1000366196

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开拓者社区不拥有其著作权,亦不承担相应法律任务。
详细规则请查看《阿里云开拓者社区用户做事协议》和《阿里云开拓者社区知识产权保护指引》。
如果您创造本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将急速删除涉嫌侵权内容。

标签:

相关文章