$r_connection_socket
前两天老孟跟我说:
毫不要脸地说,我写的这些文章都不属于快餐消耗品,你不动手亲自实践是压根搞不定的,哪儿有那么容易就能得到的认知啊!况且我讲的并不全,有很多资料常识是需要你本身搜索增补的。而且老李自认为很少在公家号里瞎TM发没用的文章,几乎篇篇都是干货、水很少、很紧致,老铁们啊,听我一句劝:
春宵一刻值千金,绝知此事要躬行
我看了一下《PHP网络编程》整本书的整体进度,由于比来我周六日火力超频全开的缘故,已经将近完成三分之二了。作为作者,这本书是我对PHP语言的一份孝敬和热情,是多年从业的一个厚积薄发的总结,是对《UNIX网络编程》的致敬;作为读者,如果你能紧紧跟从着这本书的脚本,你将能翻开高性能处事器基石的面纱,以后无论你是使用Swoole还是Workerman甚至NodeJS,只要是基于事件的高性能处事器,无论是什么编程语言,你都能很快入手学习掌握。我再次强调一遍:这种xue微偏底层一丢丢的根本常识,绝非类似于《XXX框架实战小措施》、《YYY框架实战电商》,这种根本常识看了后不会有立竿见影的效果,甚至你在事情里CURD都用不到。
颠末了我精心设计铺垫的好几个章节后,让我们继续测验考试研究PHP-Libevent(epoll),在这里我再次提醒:PHP中对Libevent的实现是一个叫做event的扩展,我们文章将依该扩展为准进行演示,请自行安置(我假装你们都知道如何安置PHP扩展)。
在前面的章节里,老李给大伙儿演出了一波儿Select IO复用实现的聊天室还有HTTP处事器,在HTTP处事器阿谁章节里还免费送了一波儿HTTP协议学习要领。真是隔着胸前两坨弹跳的白肉球子都无法否决老李迸发出来的良心光芒,在常识付费市场镰刀碰镰刀的现如今,这种行为就犹如韩红老师直接送口罩到病院门口、犹如陈光标现场送现金、犹如你瑞幸账号躺着的0折拉新优惠券...
之前我用两个章节来铺垫PHP中如何搞epoll操纵:
PHP网络编程之epoll开启篇(十二节)
初识PHP版的Libevent(十四节)
今天继续搞一波儿epoll,先来使用event扩展来实现最根本的网络IO,下面的demo代码非常简单,概略就是把客户端飞过来的数据echo出来:
<?php
$s_host = ‘0.0.0.0‘;
$i_port = 6666;
$r_listen_socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
socket_set_option( $r_listen_socket, SOL_SOCKET, SO_REUSEADDR, 1 );
socket_set_option( $r_listen_socket, SOL_SOCKET, SO_REUSEPORT, 1 );
socket_bind( $r_listen_socket, $s_host, $i_port );
socket_listen( $r_listen_socket );
// 将$listen_socket设置为非梗阻IO
socket_set_nonblock( $r_listen_socket );
// 这两个数组级另外变量非常有意思
// 一个用于生存event东西
// 一个用于生存client的连接socket
$a_event_array = array();
$a_client_array = array();
// 创建event-base
$o_event_base = new EventBase();
$s_method_name = $o_event_base->getMethod();
// 确保本身用的是epoll
if ( ‘epoll‘ != $s_method_name ) {
exit( "not epoll" );
}
// 在$listen_socket上添加一个 长期的读事件
// 为啥是读事件?
// 因为$listen_socket上产生事件就是:客户端成立连接
// 所以,应该是读事件
// 而且,我们应该用上 PERSIST 将事件设置为长期事件
$o_event = new Event( $o_event_base, $r_listen_socket, Event::READ | Event::PERSIST, function( $r_listen_socket, $i_event_flag, $o_event_base ) {
global $a_event_array;
global $a_client_array;
// socket_accept接受连接,生成一个新的socket,一个客户端连接socket
$r_connection_socket = socket_accept( $r_listen_socket );
// 注意这个操纵:将客户端连接生存到数组...
// 如果没有这行,客户端连接上后自动断开...
$a_client_array[] = $r_connection_socket;
// 在这个客户端连接socket上添加 长期的读事件
// 也就说 要从客户端连接上读打动静
$o_event = new Event( $o_event_base, $r_connection_socket, Event::READ | Event::PERSIST, function( $r_connection_socket ) {
$s_content = socket_read( $r_connection_socket, 1024 );
echo $s_content;
} );
$o_event->add();
// 注意这个操纵:将事件生存到事件数组...
// 如果没有这行,那么事件会丢掉,客户端发送的动静毛都收不到
$a_event_array[] = $o_event;
},$o_event_base );
$o_event->add();
// 注意这个操纵:将事件生存到事件数组...
$a_event_array[] = $o_event;
// loop起来...
$o_event_base->loop();
首先关于EventBase、Event不再赘述,前面入门epoll那篇里我几乎说过了所有Event扩展供给的类的简要成果说明。上述代码的主要流程非常简单:
一创建好一个非梗阻的$listen_socket
二在这个$listen_socket上创建一个长期的读事件
三是当在$listen_socket发明可读事件后就执行socket_accept()操纵
四是socket_accept()会生成新的客户端连接socket然后给这个socket添加长期读取事件
五是当在客户端连接socket上发明可读事件后就从上面读取内容并使用echo显示出来
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30231.html