加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

PHP-Socket-swoole实现异步非阻塞的socket连接

(2013-09-02 17:30:57)
标签:

swoole实现php异步非

的socket

it

分类: php那些事
一 什么是swoole

Swoole是一个独特的PHP框架,内置PHP应用服务器来运行PHP应用程序。

与其他PHP框架,如Yii,ThinkPHP等,完全不同。Swoole的QPS(每秒完成请求数)轻松可达9000以上。

LAMP搭配PHP框架,仅能达到数百。Swoole可以帮您的PHP程序节省大量服务器资源开销。

 

 

项目迁移至 GitHub: https://github.com/matyhtf/swoole_web_framework

Swoole使用纯C编写,以PHP扩展的方式提供了一个强大的异步并行Server框架,特性如下:

 

  • 基于linux epoll+eventfd,不依赖libevent等第三方库,在Linux下可直接编译。
  • 支持3种模式Call、Writer和Worker。
  • 网络模块是完全异步非阻塞的,而且实现了读写分离,无锁设计。

运行模式

  • Call模式是在Reactor线程中直接回调,适用于IO很轻,逻辑简单的网络服务器
  • Writer模式是将数据投递给Writer线程,由Writer线程处理请求,Reactor线程继续处理新的网络请求。是call模式的加强版。这里使用了共享内存队列的设计,性能很好。
  • Worker模式是用类似Nginx的方式,采用了proxy+worker多进程的模式,将请求投递给Worker进程去处理,Worker进程处理完后再交由Writer线程写回客户端。这种方式比较适合业务比较重的场景。Swoole扩展提供了进程管理的功能,当worker进程异常结束时,父进程会fork出新的worker进程。
二 安装和编译

Swoole类似于node.js,但swoole内部是多线程的,只需要修改配置参数,即可调节线程、进程数量。Swoole使用简单方便,用户无须关心内部实现,只需要设置启动参数、编写PHP回调函数即可。

 

swoole扩展安装的方法和其他PHP扩展相同,使用phpize来进行编译配置。只需要phpize、./configure、make && make install 三步即可完成编译安装。可以使用dl动态加载,也可修改php.ini配置自动加载。


三 使用实例

  • <?php  
  • $serv swoole_server_create("yourServerIp"9500, 1);  
  • swoole_server_set($servarray 
  •     'timeout'=>2.5,  
  •     'poll_thread_num'=>1,  
  •     'writer_num'=>2,  
  •     'worker_num'=>2,  
  •     'backlog'=>128,  
  •     'max_request' => 1000,  
  • ));  
  • function my_onStart($serv 
  •  
  •     echo "Server:start\n" 
  •  
  •   
  • function my_onShutdown($serv 
  •  
  •     echo "Server:onShutdown(\n" 
  •  
  •   
  • function my_onClose($serv,$fd,$from_id 
  •  
  •   echo "Client:Close. fd=$fd|from_id=$from_id\n" 
  •  
  •   
  • function my_onConnect($serv,$fd,$from_id 
  •  
  •     echo "Client:Connect. fd=$fd|from_id=$from_id\n" 
  •  
  •   
  • function my_onReceive($serv,$fd,$from_id,$data 
  •  
  •     echo "Client:Data. fd=$fd|from_id=$from_id|data=$data\n" 
  •     swoole_server_send($serv$fd"Server:$data");  
  •  
  •   
  • swoole_server_handler($serv'onStart''my_onStart');  
  • swoole_server_handler($serv'onConnect''my_onConnect');  
  • swoole_server_handler($serv'onReceive''my_onReceive');  
  • swoole_server_handler($serv'onClose''my_onClose');  
  • swoole_server_handler($serv'onShutdown''my_onShutdown');  
  •   
  • swoole_server_start($serv);  
  • ?>  

四 客户端请求连接的时候的输出 


[/root/softInstalltion/swoole/swoole.c:269@zif_swoole_server_create]Create host=121.199.16.233,port=10009,mode=1

Server:start
[/root/softInstalltion/swoole/src/reactor/ReactorSelect.c:144@swReactorSelect_wait]Event:Handle=0x7f2d319f8220|fd=6|from_id=0|type=6

[/root/softInstalltion/swoole/src/network/Server.c:90@swServer_onAccept][Main]accept start

[/root/softInstalltion/swoole/src/network/Server.c:130@swServer_onAccept][Main]connect from 61.48.153.1, by process 3341

[/root/softInstalltion/swoole/src/reactor/ReactorEpoll.c:83@swReactorEpoll_add][THREAD #139832298858464]EP=5|FD=7

Client:Connect. fd=7|from_id=0
[/root/softInstalltion/swoole/src/core/Base.c:274@swAccept][Main]accept fail Errno=11|SockFD=-1|

[/root/softInstalltion/swoole/src/reactor/ReactorEpoll.c:143@swReactorEpoll_wait]event coming.Ep=5|fd=7

[/root/softInstalltion/swoole/src/network/Server.c:900@swServer_poll_onReceive_no_buffer]recv: [{id:1}]|fd=7|len=8

[/root/softInstalltion/swoole/src/factory/Factory.c:31@swFactory_dispatch]New Task:[{id:1}]

Client:Data. fd=7|from_id=0|data=[{id:1}]
[/root/softInstalltion/swoole/src/reactor/ReactorEpoll.c:167@swReactorEpoll_wait][THREAD #139832082728704]event finish.Ep=5|ret=0

[/root/softInstalltion/swoole/src/reactor/ReactorSelect.c:144@swReactorSelect_wait]Event:Handle=0x7f2d319f8220|fd=6|from_id=0|type=6

[/root/softInstalltion/swoole/src/network/Server.c:90@swServer_onAccept][Main]accept start

[/root/softInstalltion/swoole/src/network/Server.c:130@swServer_onAccept][Main]connect from 61.48.153.1, by process 3341

[/root/softInstalltion/swoole/src/reactor/ReactorEpoll.c:83@swReactorEpoll_add][THREAD #139832298858464]EP=5|FD=8

Client:Connect. fd=8|from_id=0
[/root/softInstalltion/swoole/src/core/Base.c:274@swAccept][Main]accept fail Errno=11|SockFD=-1|

[/root/softInstalltion/swoole/src/reactor/ReactorEpoll.c:143@swReactorEpoll_wait]event coming.Ep=5|fd=8

[/root/softInstalltion/swoole/src/network/Server.c:900@swServer_poll_onReceive_no_buffer]recv: [{id:1}]|fd=8|len=8

[/root/softInstalltion/swoole/src/factory/Factory.c:31@swFactory_dispatch]New Task:[{id:1}]

Client:Data. fd=8|from_id=0|data=[{id:1}]
[/root/softInstalltion/swoole/src/reactor/ReactorEpoll.c:167@swReactorEpoll_wait][THREAD #139832082728704]event finish.Ep=5|ret=0

[/root/softInstalltion/swoole/src/reactor/ReactorEpoll.c:143@swReactorEpoll_wait]event coming.Ep=5|fd=7

[/root/softInstalltion/swoole/src/reactor/ReactorEpoll.c:167@swReactorEpoll_wait][THREAD #139832082728704]event finish.Ep=5|ret=8

[/root/softInstalltion/swoole/src/reactor/ReactorSelect.c:144@swReactorSelect_wait]Event:Handle=0x7f2d319f8680|fd=3|from_id=0|type=5

[/root/softInstalltion/swoole/src/network/Server.c:32@swServer_onClose]Close Event.fd=7|from=0

Client:Close. fd=3|from_id=0
[/root/softInstalltion/swoole/src/reactor/ReactorEpoll.c:143@swReactorEpoll_wait]event coming.Ep=5|fd=8

[/root/softInstalltion/swoole/src/reactor/ReactorEpoll.c:167@swReactorEpoll_wait][THREAD #139832082728704]event finish.Ep=5|ret=8

[/root/softInstalltion/swoole/src/reactor/ReactorSelect.c:144@swReactorSelect_wait]Event:Handle=0x7f2d319f8680|fd=3|from_id=0|type=5

[/root/softInstalltion/swoole/src/network/Server.c:32@swServer_onClose]Close Event.fd=8|from=0

Client:Close. fd=3|from_id=0

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有