PHP socket开发框架:Swoole,如何编写服务器端
时间:2011-06-03 来源:matyhtf
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没有实现多线程,目前没有提供多线程驱动。
- <?php
- require '../../config.php';
- import('#net.driver.SelectTCP');
- //协议对象,Swoole自带了一些协议如ChatServer,HttpServer等
- $protocol = new ChatServer;
- //这里可以替换成其他的驱动模式
- $server = new SelectTCP('localhost',$protocol->default_port);
- $server->setProtocol($protocol);
- $server->run();
- //协议类必须实现Swoole_TCP_Server_Protocol接口
- class ChatServer implements Swoole_TCP_Server_Protocol
- {
- public $default_port = 8080;
- //接收到数据时调用此函数
- function onRecive($client_id,$data)
- {
- $this->server->send($client_id,"hello"); //向某个客户端发送信息
- $this->server->sendAll("$client_id login"); //向全体客户端发送信息,BlockTCP不支持此方法
- }
- //服务器启动
- function onStart()
- {
- }
- //服务器关闭
- function onShutdown()
- {
- }
- //客户端关闭
- function onClose($client_id)
- {
- }
- //有客户端连接到服务器
- function onConnect($client_id)
- {
- }
- }