首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

PHP socket开发框架:Swoole,如何编写服务器端

作者:  时间: 2011-06-03

Swoole提供了一套PHP网络类,可以方便地开发出一个网络程序。Swoole提供了底层TCP和UDP支持,用户无需关心底层socket,只需实现一个协议Protocol,就可以实现一个网络服务器端。现在WebGame如此盛行,很多游戏开发者都选择PHP,但是由于没有成型的网络开发框架,只能依赖Apache,Nginx等Web服务器,只能基于HTTP协议。

现在有了Swoole网络框架,PHP程序员们也可以很轻松写出高性能的网络服务器。Swoole提供了BlockTCP,SelectTCP,EventTCP3种TCP Server驱动和BlockUDP,SelectUDP,EventUDP3种UDP Server驱动。

BlockTCP:每次只能处理1个请求,完成后关闭client socket才可以accept新的客户端连接。HTTP协议可以使用此驱动。此驱动可以用在Windows系统下

SelectTCP:使用select实现多路复用,可同时维持多个客户端连接,因为select也是轮询的,并发如果很高效率会比较低。此驱动可以用在Windows系统下

EventTCP:使用基于libevent扩展的事件模型,使用epoll系统通知的方式,在高并发的情况下,效率也非常高。此驱动只能用于Linux系统下

使用Swoole开发服务器端,只需要编写Potocol类即可,Driver可以任意替换。首先生成一个驱动类,然后通过setProtocol方法,设置使用哪种协议。在协议中,编写回调函数的处理方法。在Protocol,通过条调用$this->server->send,$this->server->sendAll,$this->server->close实现网络操作。

 另外Swoole也提供了spawn函数,在Linux环境下,可以Fork出多个进程。可实现并行,充分利用多核,单进程阻塞不影响服务。因PHP没有实现多线程,目前没有提供多线程驱动。

  1. <?php  
  2. require '../../config.php';  
  3. import('#net.driver.SelectTCP');  
  4. //协议对象,Swoole自带了一些协议如ChatServer,HttpServer等  
  5. $protocol = new ChatServer;  
  6. //这里可以替换成其他的驱动模式  
  7. $server = new SelectTCP('localhost',$protocol->default_port);  
  8. $server->setProtocol($protocol);  
  9. $server->run();  
  10. //协议类必须实现Swoole_TCP_Server_Protocol接口  
  11. class ChatServer implements Swoole_TCP_Server_Protocol  
  12. {  
  13.     public $default_port = 8080;  
  14.     //接收到数据时调用此函数  
  15.     function onRecive($client_id,$data)  
  16.     {  
  17.          $this->server->send($client_id,"hello"); //向某个客户端发送信息  
  18.          $this->server->sendAll("$client_id login"); //向全体客户端发送信息,BlockTCP不支持此方法  
  19.     }  
  20.     //服务器启动  
  21.     function onStart()  
  22.     {  
  23.     }  
  24.     //服务器关闭  
  25.     function onShutdown()  
  26.     {  
  27.     }  
  28.     //客户端关闭  
  29.     function onClose($client_id)  
  30.     {  
  31.     }  
  32.     //有客户端连接到服务器  
  33.     function onConnect($client_id)  
  34.     {  
  35.     }  
  36. }