阅读更多

21顶
3踩

编程语言

原创新闻 Swoole-真正的PHP Web开发框架

2011-05-13 16:13 by 正式记者 matyhtf 评论(28) 有62024人浏览

一、Swoole框架介绍

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

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

代码:

<?php
require 'config.php';
//自动加载模块
$php->autoload('db','tpl','cache','log','event','upload');
//数据库查询
$res = $php->db->query('select * from test');
$one = $res->fetch();
$all = $res->fetchall();
//日志
$php->log->info('hello');
//缓存
$php->cache->get('cache_key');
$hello = $php->cache->set('cache_key','me',1800);
//模板
$php->tpl->assign('hello',$hello);
$php->tpl->display('index.html');
 

 

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

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

二、高级应用

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

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

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

代码:

 

<?php
$model = createModel('TestModel');
$gets['where'][] = 'id>1';
$gets['order'] = 'id desc';
$gets['limit'] = 10;
$gets['where'][] = 'category=10';
$gets['select'] = 'id,title,name'];
$gets['leftjoin'] ….

$data = $model->gets($gets);
 

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

Swoole MVC URL路由方式,是通过用户提供的函数完成的,用户函数只需要返回具体调用哪个Controller的哪个Method。配合使用url rewrite,可以定制出任意的URL方案,比如/controller/action/ controller_action.docontroller/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文件较多,最好安装APCOPCode缓存。压力测试,同样的代码,运行效率略低于thinkphp,但远超CodeIgniter,差不多是2倍以上。

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

代码:

<?php
require('config.php');
define('SESSION_CACHE','file://localhost#sess');
require(LIBPATH.'/function/cli.php');
//Mime格式
require(LIBPATH.'/data/mimes.php');
$mime_types = array_flip($mimes);
//静态文件许可
$static_files = array_flip(array('static','templates','swoole_plugin','favicon.ico','robot.txt'));
$static_access = array_flip(array('html','htm','jpg','gif','png','js','css'));
//加载全部controller
import_all_controller();

$_SERVER['run_mode'] = 'server';
$_SERVER['server_driver'] = 'SelectTCP'; //BlockTCP,EventTCP,SelectTCP
$_SERVER['server_host'] = '0.0.0.0';
$_SERVER['server_port'] = 8888;
$_SERVER['server_processor_num'] = 4;   //启用的进程数目
$_SERVER['session_cookie_life'] = 86400; //保存SESSION_ID的cookie存活时间
$_SERVER['session_life'] = 1800;

$php->runServer();
 

 

测试代码:

<?php
class page extends Controller
{
    function index()
    {
        $data = createModel('UserInfo')->get(12)->get();
        $this->swoole->tpl->assign('data',$data);
        $html = $this->swoole->tpl->fetch('test.html');
        $time = $this->showTime();
        return $html.$time;
    }
}
 

 

ab -c 100 -n 1000 -k http://127.0.0.1:8888/page/index/

Requests per second
Time per request (mean)
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只跑到了 80RPS4进程的Swoole Server竟然跑到了惊人的1153RPS

 

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

四、源代码

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

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

期待大家一起参与研究!

 

21
3
评论 共 28 条 请登录后发表评论
28 楼 ycdyx 2015-08-27 23:05
web端比不过现有的框架,
server端如果会写shell的,谁还用php来写
27 楼 luolonghao 2011-05-24 12:48
如果能支持数据水平分割和垂直分割就很理想,现在的PHP框架基本上只能支持到master-slave架构,不考虑数据更大的情况,无法直接应用于数据量很大的项目上。

部署方面我觉得稳定性还是第一,性能稍微差加服务器能解决,稳定性差就没辙了。LAMP架构性能和稳定性方面已经满足大部分需求,自己搞http server感觉浪费时间,不如多花时间完善框架本身。

写法方面ThinkPHP的M('modelName')->where($where)->select();感觉很不错,可惜其它方面还是比较啰嗦,比如,文件名命名和目录结构等。
26 楼 achun 2011-05-23 23:24
matyhtf 写道
catoc 写道
server 模式是使用 libevent 来实现的,这不是很新的东西,已经比较稳定了。
我关注过一个托管在 github 上的的项目

https://github.com/kakserpom/phpdaemon

也是使用 libevent 的。

国内在生产环境上使用 php libevent 的也有,有跑过几个月的。

看了这个项目,很了不起。Dynamic spawning workers和Chroot & Chdir for workers.还有bundled async.老外研究得很深入,感谢catoc的分享。
目前实现的这个server,主要目标是取代mod_php和fastcgi。执行请求响应是同步堵塞的,所以IO的时间越短越好。
comet显然是不行的,并且之前如果有即时输出的代码,也是不支持的,必须是程序结束在方法中return。comet可以用另外的方式实现,实现起来不是很困难,在后续的版本中可以提供。
swoole项目有点是框架与server天然集成。目前这个版本的server实现只能算得上是0.1版本,只是实现了基本的功能。在后续的版本中,功能会更加强大,代码会更稳定健壮

不对吧,作者源代码里面明明写着
stream_set_blocking($client_socket,0);

non-blocking 非阻塞啊
25 楼 matyhtf 2011-05-15 20:49
catoc 写道
server 模式是使用 libevent 来实现的,这不是很新的东西,已经比较稳定了。
我关注过一个托管在 github 上的的项目

https://github.com/kakserpom/phpdaemon

也是使用 libevent 的。

国内在生产环境上使用 php libevent 的也有,有跑过几个月的。

看了这个项目,很了不起。Dynamic spawning workers和Chroot & Chdir for workers.还有bundled async.老外研究得很深入,感谢catoc的分享。
目前实现的这个server,主要目标是取代mod_php和fastcgi。执行请求响应是同步堵塞的,所以IO的时间越短越好。
comet显然是不行的,并且之前如果有即时输出的代码,也是不支持的,必须是程序结束在方法中return。comet可以用另外的方式实现,实现起来不是很困难,在后续的版本中可以提供。
swoole项目有点是框架与server天然集成。目前这个版本的server实现只能算得上是0.1版本,只是实现了基本的功能。在后续的版本中,功能会更加强大,代码会更稳定健壮
24 楼 sleets 2011-05-15 19:38
压力测试的环境,代码能在详细点吗?
23 楼 nakupanda 2011-05-15 15:33
以前那些不是真正的..?
22 楼 dempire 2011-05-15 14:27
内存泄露的问题已经考虑过,已经过多次试验,目前的server模式内存占用还是很稳定的,实际的项目不排除会有内存泄露的可能。
正在考虑增加如MaxRequestPerChild,子进程在响应完一定数量的请求后销毁。当然目前还在研究中,大家可以一起参与完善这个项目,相信一定会帮助到所有使用PHP的程序员们。
Leon.Wood 写道
aninfeel 写道
netstu 写道
一看标题就知道是中国人开发的,要不然不会有这样的标题


+1

+1
21 楼 renzhen 2011-05-15 10:54
如果PHP有像V8那样的神一般的实现,再配合这个框架的Server模式,那就perfect了。
可惜了,最好能在Server模式支持Comet技术,貌似python和ruby都有相关的服务器和框架支持的,如果PHP不支持始终是缺陷。
20 楼 catoc 2011-05-15 08:48
server 模式是使用 libevent 来实现的,这不是很新的东西,已经比较稳定了。
我关注过一个托管在 github 上的的项目

https://github.com/kakserpom/phpdaemon

也是使用 libevent 的。

国内在生产环境上使用 php libevent 的也有,有跑过几个月的。
19 楼 dhgdmw 2011-05-14 21:14
没说的,先用用
18 楼 smartfish9 2011-05-14 21:11
必须说用PHP来实现SERVER模式非常有创意。
但恐怕大家都担心稳定性,php不是为长期运行准备的,好像php5.3对一些内存泄露做出了一定的改进,但仍然感觉不放心。希望能提供一些实际运行的例子。
17 楼 matyhtf 2011-05-14 19:58
Julien 写道
server模式是创举,ruby这么慢的语言就是靠类似模式才能得以支持重型框架的
但没有一个上规模的案例是问题。

使用 PHP 来开发 PHP 的应用服务器,让 PHP 的代码加载到内存后,拥有更长的生命周期,这样建立的数据库连接和其他大的对象,不被释放。每次请求只需要处理很少的代码,而这些代码只在第一次运行时,被 PHP 解析器编译,驻留内存。以后都是直接载入 OPCODE ,让 Zend 引擎直接运行,系统的运行效率会大大提高。另外,之前 PHP 不能实现的,数据库连接池,缓存连接池都可以实现,而且PHP也能够像Java那样写更重量级的代码。
任重道远,有清晰的目标坚持去做,所有难题都能被攻克。

16 楼 matyhtf 2011-05-14 19:48
renzhen 写道
Server模式真的很有创意,解决了PHP运行框架导致性能严重下降的问题,不过PHP始终不是为long running的程序准备,内存泄露,进程稳定性在这个模式下马上就会凸显,而且没有人会去解决这些问题。
不过这种模式为PHP支持Comet技术提供的可能性,异步IO+长连接在HTML 5 websocket成熟后慢慢成为主流的。而目前的PHP cgi模式下是不支持的。
虽然这个框架未必会被很多人使用,但它的思想和作品,的确可以说是PHP里‘真正’的框架。


内存泄露的问题已经考虑过,已经过多次试验,目前的server模式内存占用还是很稳定的,实际的项目不排除会有内存泄露的可能。
正在考虑增加如MaxRequestPerChild,子进程在响应完一定数量的请求后销毁。当然目前还在研究中,大家可以一起参与完善这个项目,相信一定会帮助到所有使用PHP的程序员们。
15 楼 pizigou 2011-05-14 17:14
专门登录来评论下啊,感谢作者的尝试和努力。
14 楼 Julien 2011-05-14 16:35
要说内存泄漏,PHP有垃圾回收,内存泄漏的风险不会比JAVA更大
13 楼 Julien 2011-05-14 13:50
server模式是创举,ruby这么慢的语言就是靠类似模式才能得以支持重型框架的
但没有一个上规模的案例是问题。
12 楼 Leon.Wood 2011-05-14 12:30
aninfeel 写道
netstu 写道
一看标题就知道是中国人开发的,要不然不会有这样的标题


+1
11 楼 aninfeel 2011-05-14 11:44
netstu 写道
一看标题就知道是中国人开发的,要不然不会有这样的标题

10 楼 asterman 2011-05-14 11:29
赞9楼兄弟
9 楼 wearyoudog 2011-05-14 11:17
paramore 写道
靠 国产的吧

靠,你这货也是国产的吧?不仅质量有点差,素质也不是一般的差啊

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • swoole分布式全栈框架web开发增强版基于SwooleDistributed

    swoole 分布式全栈框架 web开发增强版,基于SwooleDistributed

  • Flash 中 oop 的设计模式

    转自会飞的Blog ,但不知道出处和作者,也就没有转载到蓝色理想,先做收藏。有人问我flash的as应该怎么写,我可以很负责任地告诉他,想怎么写就怎么写,因为as以及flash内部的构成模式决定了它的高度自由化。理论上来说,用按钮的on事件,加上stop(),play(),gotoAndStop(),gotoAndPlay(),就可以实现一个flash里大部分的逻辑关系,而且源代码简单易懂。但是大

  • 基于swoole实现的自带httpserver的web开发框架

    基于swoole实现的自带http server的web开发框架,用于开发高性能的api应用,例如app接口服务端等

  • laravel-swoole-tutorial:Laravel + Swoole

    Laravel通过减轻许多Web项目中使用的常见任务来减轻开发工作的痛苦,例如: 。 。 用于和存储的多个后端。 富有表现力,直观的 。 数据库不可知。 。 。 Laravel易于访问,功能强大,并提供大型,强大的...

  • app-web:一个基于Swoole的php Web框架

    Kovey Web Framework 1.0 描述 这是一个基于swoole的php web框架 用法 composer create-project kovey/app-web

  • FastD是一个支持Swoole的轻量级Web开发框架

    FastD 是一个支持 Swoole 的轻量级 Web 开发框架,可适用于对性能有要求的 API 场景,并且灵活的扩展性可以让开发者们更容易地建造自己的服务 (基于Swoole)

  • FastSwoole基于swoole扩展开发的高性能web框架

    基于php swoole扩展,具有天生高性能优势的Web框架

  • Swoole介绍-真正的PHP Web开发框架

    swoole是一套设计非常精巧,有效提高开发效率的PHP框架。Swoole有统一的唯一全局对象,类似于Java的注册树,挂载了常用的一些对象,如数据库、模板引擎、缓存系统、日志系统、事件处理系统等。可以很方便地调用功能...

  • swoole php7 wrapper,Swoole-1.7.22 版本已发布,修复PHP7相关问题

    swoole-1.7.22 版本已发布,此版本是一个BUG修复版本,专门针对PHP7做了大量修改,可完美运行于PHP7环境swoole-1.7.22 版本已发布,此版本是一个BUG修复版本,专门针对PHP7做了大量修改,可完美运行于PHP7环境。...

  • PHP高级Web开发框架Swoole深入解读+实战案例

    PHP高级Web开发框架,Swoole深入解读+IM在线即时通讯案例视频教程下载。Swoole是一种PHP高级Web开发框架,框架不是为了提升网站的性能,是为了提升网站的开发效率。最少的性能损耗,换取最大的开发效率。利用Swoole...

  • php job框架,swoole-jobs

    加速后端耗时服无需像gearman一个worker配置一条crontab,swoole-jobs负责管理所有worker状态独立的swoole http api 入队列,api不依赖php-fpm1. 说明web中较慢的逻辑,比如统计/email/短信/图片处理等;支持redi...

  • php开源商城系统,基于swoole、easyswoole框架开发.zip

    软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发Node.js、C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...

  • swoole和php-fpm的区别,swoole为何比fpm快_PHP开发框架教程

    PHP-FPM初期版本的 PHP 并没有内置的 WEB 服务器,而是供应了 SAPI(Server API)给第三方做对接。... (引荐进修: swoole视频教程)比方 Nginx + php-fpm 的组合,这类体式格局运转的 fpm 是 Master/Worker 形式,启...

  • 使用Swoole代替Web服务器运行Laravel框架

    一个非常大的好处就是高性能,如果使用普通的web服务器,每次运行 PHP 脚本的时候,PHP都需要初始化模块并为你的运行环境启动Zend引擎。并且将 PHP 脚本编译为 OpCodes 交给 Zend引擎执行。这样就意味着每次HTTP请求...

  • php-swoole-安装环境 (一)

    目录  php-swoole-安装环境 (一) swoole是什么?:  swoole有什么功能?  swoole是什么?:  swoole有什么功能?  swoole如何使用? 验证swoole    ...

  • 真正的PHP Web开发框架之Swoole,你真的知道吗?!

    swoole是一套设计非常精巧,有效提高开发效率的PHP框架。Swoole有统一的唯一全局对象,类似于Java的注册树,挂载了常用的一些对象,如数据库、模板引擎、缓存系统、日志系统、事件处理系统等。可以很方便地调用功能...

  • 基于php的完整商城系统,采用swoole、easyswoole框架开发.zip

    基于PHP、MySQL等技术构建的web系统,框架,PHP学习,课程设计作业,可用于毕业设计,源码项目,可直接运行,实测! 基于PHP、MySQL等技术构建的web系统,框架,PHP学习,课程设计作业,可用于毕业设计,源码项目,...

  • swoole-加速laravel框架

    在swoole中可以为我们提供http服务,http服务既可以用于我们日常的web开发中,同时它也可以对thinkphp、laravel等框架进行加速,但要使用swoole对常规框架加速,该框架必须是IOC类型的才可以,这是因为swoole是常驻...

  • PHP-FPM vs Swoole - 学习/实践

    「实际上,还要处理一些超全局变量的问题,需要在每次接收新请求时,将这些超全局变量还原等, 具体可以参见:swoole 适配一些php-fpm web开发框架的适配,如thinkphp,laravel,yii 推荐看下:swoole (P1....

Global site tag (gtag.js) - Google Analytics