它常常涌如今很多软件与外部交互的网络部分,如:
redis利用reactor单线程网络IO模型。
kafka利用reactor多线程网络IO模型。

为什么须要利用网络IO模型
关于为什么要利用网络IO模型:大家须要理解一下用户态、内核态、壅塞、非壅塞、同步、异步、IO多路复用等知识。
大略来讲
在这里大略地讲,便是用户态程序没法直接操作网络IO设备,它须要发起系统调用,将掌握权交给操作系统内核,内核将数据从网卡中读取数据,返回给用户态程序。在这个过程中用户态程序是等待还是不等待,内核处理的结果是若何关照给用户程序,这便是网络IO模型可以作优化的地方。
根本缘故原由
说到底便是优化CPU的实行韶光片,不能让CPU闲着。
很主要
补充一点网络数据的 copy 操作不是CPU实行的,CPU只是初始化这个传输动作,详细数据的 copy 是由 DMA 设备来完成的。
PHP实现Reactor单线程网络模型
reactor单线程网络模型,利用到了IO多路复用的epoll模型,事宜机制。操作系统须要安装libevent扩展,php须要安装event、sockets扩展。
测试例子
<?php$addr = "0.0.0.0";$port = 8888;// 创建做事端 socket$listenFd = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);// 绑定$bindRe = socket_bind($listenFd, $addr, $port);if (!$bindRe) { die("socket bind error");}// 监听$listenRe = socket_listen($listenFd, 100);if (!$listenRe) { die("socket listen error");}global $eventArr, $eventBase;// 实例化根本事宜句柄,相称与 epoll_create 操作$eventBase = new EventBase();// 绑定监听句柄,到根本事宜句柄, 相称于 epoll_ctl 操作$event = new Event($eventBase, $listenFd, Event::PERSIST | Event::READ, "ep_accept");$event->add();// 等待句柄就绪, 相称于 epoll_wait 操作$eventBase->loop();function ep_accept($listener) { global $eventBase, $eventArr; if (($client = socket_accept($listener)) !== false){ $tmp = "连接成功\n"; socket_write($client, $tmp, strlen($tmp)); // 绑定端socket,到根本事宜句柄, 相称于 epoll_ctl 操作 $clientEvent = new Event($eventBase, $client, Event::PERSIST | Event::READ, "ep_read", $client); $clientEvent->add(); // event实例一定要存放在一个全局数组里面。如果去掉该行,客户端逼迫断开再连接,做事端无法正常收到 // 这里这一步我也不知道缘故原由,注目掉确实会导致客户端断开 // 希望能看到这里的大佬,评论区奉告不才缘故原由。 // 欢迎互换 $eventArr[intval($client)] = $clientEvent; }}function ep_read($fd) { $buffer = socket_read( $fd, 250 ); $msg = "你说:{$buffer}"; socket_write( $fd, $msg, strlen( $msg ) );}
启动做事
php ceshi.php
结果截图
reactor单线程网络模型
我实现的功能是客户端发什么,做事端将重新返回给客户端。
这里我开了两个客户端作测试。符合实验的预期。
我个人以为学习是个人的事,我的文章侧重于抛出一些不雅观点,然后用大略的例子去论证,从而引发大家的兴趣,文章之中很多都是我参考了很多资料之后最简要的解释。大家该当关注文章之中引发个人困惑的东西,然后去思考学习。