/首页
/开源
/关于
PHP socket初探 --- 含着泪也要磕完libevent
发表@2018-09-13 09:15:22
更新@2023-01-21 22:47:40
这段时间相比大家也看到了,本人离职了,一是在家偷懒实在懒得动手,二是好不容易想写点儿时间全部砸到数据结构和算法那里了。 今儿回过头来,继续这里的文章。那句话是怎么说的: “**自己选择的课题,含着泪也得磕完!**”(图文无关,[详情点击这里](https://tieba.baidu.com/p/3504775033?red_tag=1379561293 "详情点击这里"))。 ![](https://ti-node.com/static/upload/6402086624192102400) 其实在上一篇libevent文章中([《PHP socket初探 --- 硬着头皮继续libevent(二)》](https://blog.ti-node.com/blog/6396317917192912897 "《PHP socket初探 --- 硬着头皮继续libevent(二)》")),如果你总结能力很好的话,可以观察出来我们尝试利用libevent做了至少两件事情: - 毫秒级别定时器 - 信号监听工具 大家都是码php的,也喜欢把自己说的洋气点儿:“ 我是写服务器的 ”。所以,今天的第一个案例就是拿libevent来构建一个简单粗暴的http服务器: ```php 样做 if( ( $connect_socket = socket_accept( $listen_socket ) ) != false){ echo "有新的客户端:".intval( $connect_socket ).PHP_EOL; $msg = "HTTP/1.0 200 OK\r\nContent-Length: 2\r\n\r\nHi"; socket_write( $connect_socket, $msg, strlen( $msg ) ); socket_close( $connect_socket ); } }, $listen_socket ); $event->add(); $event_base->loop(); ``` 将代码保存为test.php,然后php http.php运行起来。再开一个终端,使用curl的GET方式去请求服务器,效果如下: ![](https://ti-node.com/static/upload/6402443744179650560) 这是一个非常非常简单地不能再简单的http demo了,对于一个完整的http服务器而言,他还差比较完整的http协议的实现、多核CPU的利用等等。这些,我们会放到后面继续深入的文章中开始细化丰富。 还记得我们使用select系统调用实现了一个粗暴的在线聊天室,select这种业余的都敢出来混个聊天室,专业的绝对不能怂。 无数个专业???????????????送给libevent! ![](https://ti-node.com/static/upload/6402446798421491713) ![](https://ti-node.com/static/upload/6402446847486459905) ![](https://ti-node.com/static/upload/6402446898828935169) 啦啦啦啦,开始码: ```php $conn_item ){ if( $conn != $conn_item ){ $msg = intval( $conn ).'说 : '.$buffer; socket_write( $conn_item, $msg, strlen( $msg ) ); } } }, $conn ); $event->add(); // 此处值得注意,我们需要将事件本身存储到全局数组中,如果不保存,连接会话会丢失,也就是说服务端和客户端将无法保持持久会话 $event_arr[ intval( $conn ) ] = $event; } }, $fd ); $event->add(); $event_base->loop(); ``` 将代码保存为server.php,然后php server.php运行,再打开其他三个终端使用telnet连接上聊天室,运行效果如下所示: ![](https://ti-node.com/static/upload/6402456852096876545) 尝试放一张动态图试试,看看行不行,自己制作的gif都特别大,不知道带宽够不够。 ![](https://ti-node.com/static/upload/6402456852096876545.gif) 截止到这篇为止,死磕Libevent系列的大体核心三把斧就算是抡完了,弄完这些,你在遇到这些代码的时候,就应该不会像下面这个样子了: ![](https://ti-node.com/static/upload/6402456852096876549.gif) ----