Skip to content

3,appnet示例解析

lchb369 edited this page Feb 23, 2016 · 4 revisions

如果已经装好了扩展,那就赶快来试试看吧,可能有的同学会问,扩展还没有配进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的全部内容,是不是很简单使用呢。

 

Clone this wiki locally