-
Notifications
You must be signed in to change notification settings - Fork 24
3,appnet示例解析
如果已经装好了扩展,那就赶快来试试看吧,可能有的同学会问,扩展还没有配进php.ini呐,其实如果你很勤快的话,那就配下吧,如果没配,也可以用dl()函数加载的哦。先看代码吧。
1 <?php 2 function onConnect( $server , $fd ) 3 { 4 $pid = posix_getpid(); 5 echo "Client Connect:{$fd} pid={$pid} \n"; 6 } 7 8 function onRecv( $server , $fd , $buffer ) 9 { 10 echo "Client Recv:[{$buffer}][{$fd}] \n"; 11 $header = $server->getHeader(); 12 $server->send( $fd , $buffer ); 13 14 }; 15 function onClose( $server , $fd ) 16 { 17 echo "Client Close:$fd \n"; 18 }; 19 //on worker run start,you can init env. 20 function onStart( $server ) 21 { 22 $pid = posix_getpid(); 23 echo "On Worker Start!! pid={$pid} \n"; 24 //3000ms means 3second 25 $server->timerAdd( 3000 , "onTimerCallback" , "paramsxxx" ); 26 }; 27 //on worker shutdown,you must save data in last time. 28 function onFinal( $server ) 29 { 30 $pid = posix_getpid(); 31 echo "On Worker Final!! pid={$pid} \n"; 32 }; 33 function onTimerCallback( $server , $timer_id , $params ) 34 { 35 $pid = posix_getpid(); 36 echo "onTimerCallback ok,worker pid={$pid},timer_id={$timer_id}...\n"; 37 38 //if do not remove it, it will be call this function forever 39 $server->timerRemove( $timer_id ); 40 } 41 42 dl( "appnet.so"); 43 $server = new appnetServer( "0.0.0.0" , 3011 ); 44 $server->setOption( APPNET_OPT_WORKER_NUM , 1 ); 45 $server->setOption( APPNET_OPT_REACTOR_NUM, 1 ); 46 $server->setOption( APPNET_OPT_MAX_CONNECTION , 10000 ); 47 $server->setOption( APPNET_OPT_PROTO_TYPE , APPNET_PROTO_MIX ); 48 $info = $server->getInfo(); 49 50 $server->addEventListener( APPNET_EVENT_CONNECT , "onConnect"); 51 $server->addEventListener( APPNET_EVENT_RECV , "onRecv"); 52 $server->addEventListener( APPNET_EVENT_CLOSE , "onClose"); 53 $server->addEventListener( APPNET_EVENT_START , "onStart"); 54 $server->addEventListener( APPNET_EVENT_FINAL , "onFinal"); 55 56 $server->run(); 57 58 59 ?>
1,先从42行开始看吧。因为从这以下,才是appnet接口的核心。
dl( "appnet.so");加载扩展库appnet.so,如果在php.ini里已经配置extension = appnet.so的话,就不需要这行了。
2,43行是实例化一个appnetServer类,第一参数表示服务器监听IP,这里是0.0.0.0,表示可以接收所有网络段发来的连接。 比如内网ip是192.168.1.1, 则可以通过telnet 192.168.1.1 3011来访问,也可以通过127.0.0.1 3011来访问。如果将监听IP设为127.0.0.1的话,那么192.168.1.1则无法访问。 第二个参数是服务器要监听的端口。
3,44-47行,是设置一些选项的参数。
APPNET_OPT_WORKER_NUM 表示工作进程的数量,如果设置为N,意味着同时有几个进程在同时处理业务。其数量建议与CPU核数相同既可。如果太大,CPU在进程间切换的消耗会得不偿失。
APPNET_OPT_REACTOR_NUM 表示网络IO线程的数量,如果设置为M,意味着同时有M个线程与客户端接收和发送消息,每个线程都运行着一个epoll循环。理论上1G内存单线程可支持10万并发连接。所以这个值不需要开太多。最大不超过CPU核数。
APPNET_OPT_MAX_CONNECTION 最大连接数,如果连接数超过这个值,之后的请求都会被服务器拒绝。
APPNET_OPT_PROTO_TYPE 表示协议类型,目前分三种协议分别是TCP,HTTP,Websocket,此项属性的值有以下几个:
APPNET_PROTO_TCP_ONLY 仅支持TCP协议,是默认的协议类型。如果用不上Http或Websocket协议建议使用默认设置。
APPNET_PROTO_HTTP_ONLY 仅支持HTTP协议,如果其它协议发送的消息,将会被抛弃。
APPNET_PROTO_WEBSOCKET_ONLY 仅支持websocket协议。
APPNET_PROTO_HTTP_MIX 支持TCP与HTTP混合协议
APPNET_PROTO_MIX 同时支持三种混合协议
4,48行 是获取相关服务器信息,可以print_r出来看一下。目前只有上述设置的选项值,未来会增加更多信息。
5,50-54行是注册socket事件回调函数,addEventListener的第一个参数是事件类型
APPNET_EVENT_CONNECT 是有新连接到来事件
APPNET_EVENT_RECV 有新的客户端消息到来事件
APPNET_EVENT_CLOSE 有客户端主动断开事件
APPNET_EVENT_START 服务器启动成功后,当前进程回调事件。如果有N个worker进程,则会被回调N次,因为每个进程都会回调一次。此时可以做一些业务上的全局初始化操作,设置定时器等。
APPNET_EVENT_FINAL 关闭worker进程时回调,此时一定要将未保存的数据都保存下来,这是最后的机会。
第二个参数是回调函数名称。比如“onConnect”也就是第2行的onConnect函数,依次类推,
需要注意的是,回调函数中的参数 务必要上述示例中一样,参数名可以不一样,但数量一定要匹配。而且这5个回调函数一定要实现,即便函数体为空也要写上。
6,第2行中的$fd参数 文件描述符(file descriptor),是socket编程中的常用语。当然也可以改为其它名称。
7,第10行$server->getHeader();方法是获取http头的。
8,第25行中的timerAdd方法是在当前进程添加一个定时器,上例中表示每3000ms,回调一次onTimerCallback方法。如果你已经测试过示例了,会发现其时只回调了一次,那是因为在onTimerCallback中timerRemove方法将定时器移除了,可以注除这行试一下。
9,第12行,send方法表示向客户端发送消息。
10,如果想关闭连接可以使用$server->close( $fd );关闭对应的连接。
11,第56行,最重要的一步,就是开始运行服务器。千万不能忘了写这一行哦。以上就是appnet的全部内容,是不是很简单使用呢。