入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

PHPWeb开发框架Swoole的介绍

创建时间:2016-12-14 投稿人: 浏览次数:694

Swoole:重新定义PHP

PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。
Swoole可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品。


一、Swoole框架介绍

swoole是一套设计非常精巧,有效提高开发效率的PHP框架。Swoole有统一的唯一全局对象,类似于Java的注册树,挂载了常用的一些对象,如数据库、模板引擎、缓存系统、日志系统、事件处理系统等。可以很方便地调用功能,快速开发。使用swoole框架,仅需配置一个config.php文件,在其他PHP文件中只需要require config.php文件,即可调用框架的所有功能。

swoole通过配置文件可以实现在轻松更换模块驱动方式。比如数据库连接,可以很方便得在Pdo MySQL MySQLi之间更换。缓存可以用filecache,也可以用dbcache,还可以用memcache。日志可以用数据库日志,也可以用系统日志或文件日志。

代码:

Php代码 
  1. <?php  
  2. require "config.php";  
  3. //自动加载模块  
  4. $php->autoload("db","tpl","cache","log","event","upload");  
  5. //数据库查询  
  6. $res = $php->db->query("select * from test");  
  7. $one = $res->fetch();  
  8. $all = $res->fetchall();  
  9. //日志  
  10. $php->log->info("hello");  
  11. //缓存  
  12. $php->cache->get("cache_key");  
  13. $hello = $php->cache->set("cache_key","me",1800);  
  14. //模板  
  15. $php->tpl->assign("hello",$hello);  
  16. $php->tpl->display("index.html");  
 

 

Swoole提供了很多类库工具,表单生成、输入验证和过滤,登录验证处理,JS生成,Ajax支持,调试工具,客户端操作,URL合并拆分工具等。

另外也提供,网络类(Block、Select、Event的TCP、UDP Server & Client),也提供一些简单的服务器协议实现(HTTP,Chat,FTP,SMTP,POP3等)。还有2个js类库,UI库和表单验证。

二、高级应用

Swoole框架也提供了MVC的apps结构。通过contoller的继承,实现业务逻辑的封装,model的继承,实现数据操作的封装,view层使用smarty模板引擎实现页面显示的逻辑封装。

Swoole框架提供了强大的Model类,有get,gets,set,sets,del,dels,put可以非常方便的实现数据库的增删查改,gets接口还有自动分页的功能。

swoole的SQL封装很灵活,它的特色是,所有的SQL拼接都使用数组的方式,而不是对象方法,这样数据库查询参数可以和PHP的$_GET,$_POST,$_SESSION,Cache,Cookie无缝集成。

代码:

 

Php代码 
  1. <?php  
  2. $model = createModel("TestModel");  
  3. $gets["where"][] = "id>1";  
  4. $gets["order"] = "id desc";  
  5. $gets["limit"] = 10;  
  6. $gets["where"][] = "category=10";  
  7. $gets["select"] = "id,title,name"];  
  8. $gets["leftjoin"] ….  
  9.   
  10. $data = $model->gets($gets);  
 

Swoole中也有ORM的数据库操作方式,可以参考开发手册。

Swoole MVC URL路由方式,是通过用户提供的函数完成的,用户函数只需要返回具体调用哪个Controller的哪个Method。配合使用url rewrite,可以定制出任意的URL方案,比如/controller/action/ , controller_action.do,controller/action.do等。或者像Django一样完全使用正则来规定URL。

Event

Swoole提供了一个事件触发系统。

$php->event->raise("sendsms",$mobile,$sms_content);

这是一个很酷的设计,如果在本地测试环境中,你可是配置为同步,那么raise引发一个时间后,去执行事件对应的handle函数。如果是服务器环境,可以设置为异步,那么raise只会向Queue服务器投递一个事件。在后台启动一个守护进程,从Queue服务器取得事件,然后再用handle函数去处理。

Upload

swoole可以对上传文件统一处理,限制上传大小。上传图片的话,可以自动压缩图片尺寸,产生缩略图。

Swoole框架可以像正常的PHP一样方式部署于典型的LAMP环境。也可以采用Swoole本身提供的Http Server方式运行。

普通LAMP方式,由于每次请求包含的php文件较多,最好安装APC等OPCode缓存。压力测试,同样的代码,运行效率略低于thinkphp,但远超CodeIgniter,差不多是2倍以上。

值得一提的是以Server方式运行的Swoole,性能极为强悍。是同样代码Apache部署环境下的将近8-14倍。而且内存占用很少。

代码:

Php代码 
  1. <?php  
  2. require("config.php");  
  3. define("SESSION_CACHE","file://localhost#sess");  
  4. require(LIBPATH."/function/cli.php");  
  5. //Mime格式  
  6. require(LIBPATH."/data/mimes.php");  
  7. $mime_types = array_flip($mimes);  
  8. //静态文件许可  
  9. $static_files = array_flip(array("static","templates","swoole_plugin","favicon.ico","robot.txt"));  
  10. $static_access = array_flip(array("html","htm","jpg","gif","png","js","css"));  
  11. //加载全部controller  
  12. import_all_controller();  
  13.   
  14. $_SERVER["run_mode"] = "server";  
  15. $_SERVER["server_driver"] = "SelectTCP"; //BlockTCP,EventTCP,SelectTCP  
  16. $_SERVER["server_host"] = "0.0.0.0";  
  17. $_SERVER["server_port"] = 8888;  
  18. $_SERVER["server_processor_num"] = 4;   //启用的进程数目  
  19. $_SERVER["session_cookie_life"] = 86400; //保存SESSION_ID的cookie存活时间  
  20. $_SERVER["session_life"] = 1800;  
  21.   
  22. $php->runServer();  
 

 

测试代码:

Php代码 
  1. <?php  
  2. class page extends Controller  
  3. {  
  4.     function index()  
  5.     {  
  6.         $data = createModel("UserInfo")->get(12)->get();  
  7.         $this->swoole->tpl->assign("data",$data);  
  8.         $html = $this->swoole->tpl->fetch("test.html");  
  9.         $time = $this->showTime();  
  10.         return $html.$time;  
  11.     }  
  12. }  
 

 

Shell代码 
  1. ab -c 100 -n 1000 -k http://127.0.0.1:8888/page/index/  
  2.   
  3. Requests per second  
  4. Time per request (mean)  
  5. Time per request (mean, across all concurrent requests)  
 

 

 

运行方式

Swoole EventTCP

Swoole SelectTCP

Swoole BlockTCP

Apache/Prefork

单进程

571.70 [#/sec]

174.916 [ms]

1.749 [ms]

659.01 [#/sec]

151.743 [ms]

1.517 [ms]

561.24 [#/sec]

178.178 [ms]

1.782

80.57

1241.083 [ms]

12.411 [ms]

4进程

1153.63 [#/sec]

86.683 [ms]

0.867 [ms]

1010.08 [#/sec]

99.002 [ms]

0.990 [ms]

1094.58 [#/sec]

91.359 [ms]

0.914 [ms]

 

 

在我的Ubuntu下进行测试(Inter core E5300+2G内存,同时有其他软件运行ecilpse,firefox,chrom)。Apache只跑到了 80多RPS。4进程的Swoole Server竟然跑到了惊人的1153RPS。

 

可以用apache ProxyPass方式,或者是Nginx upstream进行代理分发和负载均衡。

四、源代码

Swoole框架已经有3年的历史,从08年开始,到现在经历了多个版本的升级。目前也不少成功运用的案例。但参与的PHP程序员不是很多,并没有广为人知。

源代码托管于:http://code.google.com/p/swoole/

期待大家一起参与研究! 官方QQ群:193772828 开发组邮件列表: team@swoole.com


【官方网站】Swoole: PHP的异步、并行、高性能网络通信引擎 http://www.swoole.com/

【项目实践】使用PHP+Swoole实现的网页即时聊天工具:PHPWebIM - OPEN 开发经验库 http://www.open-open.com/lib/view/open1416465136852.html

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。