使用Swoole加速Laravel(正式环境中)

31

1 Laravel的速度瓶颈在哪?

1.1 已有的一些优化方法

1.1.1 laravel官方提供了一些优化laravel的优化方法

php artisan optimize
php artisan config:cache
php artisan route:cache

1.1.2 使用opcache加速,PHP是个解释型语言执行的时候先得把程序读进来,由Zend引擎编译成opcode。最后Zend虚拟机顺次执行这些opcode完成操作。opcache起到的作用就是缓存opcode,从而减少编译的时间,减少CPU密集。


1.1.3 使用PHP7.1,不要问我为什么

1.2 磁盘IO上的瓶颈

Laravel本身启动需要的文件就很多,外加其出了名的生态环境好,开发中我们会很多很多现有的轮子,使得一次启动的磁盘IO特别高(就是要加载很多文件嘛),虽然官方的php artisan optimize方法优化了文件的加载,但并没有实际解决IO上的问题。
知道了问题那就很容易解决了,只要不要每次启动都重新加载就好了,下面轮到Swoole上场啦。


2 Swoole

Swoole是一个PHP扩展,使得PHP使用异步的方式执行,就像node一样,而且还能使用socket,为PHP提供了一系列异步IO、事件驱动、并行数据结构功能。具体的安装方法这就不说了,自己谷歌吧。


3 现有的轮子

搜搜github上已有的swoole启动laravel的轮子,找了三个轮子

scil/LaravelFly
chongyi/swoole-laravel-framework
garveen/laravoole

用了LaravelFly,听名字感觉感觉挺酷,结果不如人意,实在不喜欢它那种强硬的启动方式。跟Laravel的风格-'优雅' 很不搭。于是又想自己写,结果写到一半发现laravoole这个项目有更新,然后启动方式(使用artisan命令,没更新前是用的bash脚本启动),代码风格都很酷,这不就是我想做的东西嘛!


chongyi/swoole-laravel-framework这个轮子是我在写轮子的时候,作者在微信群里分享的,有兴趣的朋友可以试试,我还没试过。


4 LARAVOOLE中的几个注意点

可以看看作者的文档,我就只总结下我在用的过程中遇到的几个点
1 你应该不再使用以下的超全局变量,因为它们是WEB服务器创建的,而一个非热启动的项目使用他们可能会造成变量污染,你可以从Laravel的Request类中拿到你要的数据。

$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION

2 因为我要开发微信相关的,所以使用了EASYWECHAT这个包,但是这个包的oauth方法使用的是原生的SESSION,所以这边也要改成redis等其它方式去存储session。具体代码如下。

 //在你的控制器或者中间件中
  public function handle(Request $request, Closure $next)
  //省略代码
  $redirect = config('app.url') . $request->getRequestUri();//这个地址要求带着token
                
  $options = [
                'app_id' => config('app.appid'),
                'secret' => config('app.secret'),
                'oauth' => [
                    'scopes' => ['snsapi_userinfo'],
                    'callback' => $redirect,
                ],
             ];

   $app = new Application($options);
   //使用laravel session替代原生session
   $app->oauth->setRequest($request);
   //省略下面代码
  }

3 不支持热启动了,所以每次更新代码后都需要重新启动Laravoole进程。

$ php artisan laravoole restart

如需要支持热启动,请自行谷歌 swoole + inotify,大概原理就是用inotify监控文件变更,如果更新了重启swoole,如果正式环境中还可以自己写个部署脚本,git pull后重启服务等,方法很多不一一列举。

5 愉快的准备测试啦

测试机子:
阿里云
centos6.5
双核
4G
无视带宽影响,向本机请求,测试结果如下,测了几次,平均在700RPS左右。原先的只有20多RPS。

clipboard.png

clipboard.png

你可能感兴趣的

33 条评论
呼吸二氧化碳 · 2017年01月11日

你网站才这么点qps也真是简直了...

+3 回复

ivanilla · 2017年01月10日

其实还有个轮子,这个我去年就写过了:https://segmentfault.com/a/11...

+2 回复

zp0419 · 2017年03月28日

好多问题不会,可以加你QQ向你请教嘛

+2 回复

kel 作者 · 2016年12月23日

原来的20RPS确实有点过分了,可能我的磁盘不是SSD的缘故?

+1 回复

kel 作者 · 2017年01月13日

?。。。

+1 回复

garveen · 2016年12月23日

我没想到能有30倍的性能提升,我自己测试裸框架都只有10倍rps,感觉有点神奇

回复

zshanjun · 2016年12月23日

厉害!!

回复

小恒恒思密达 · 2017年01月07日

厉害

回复

kel 作者 · 2017年01月10日

( ´▽` )轮子越多越好

回复

0

请问输入命令
php artisan laravoole start
抛错
Address 127.0.0.1:9050 already in use
然后查不到是什么在占用这个端口,这种情况你们发生过吗?

ANDREW · 2017年06月11日
0

请问这个问题解决了吗?

MonkeyBlog · 2017年09月12日
kel 作者 · 2017年01月11日

我也是有点醉,估计机子硬盘太差了

回复

goodspb · 2017年01月12日

然后呢?你的这个例子在线上跑过没有?

回复

kel 作者 · 2017年01月12日

一直在跑,目前没什么问题

回复

goodspb · 2017年01月12日

咦,公司的 L4.2 也是这么干,不过有一定的问题。特别是 DB reconnect 超时;静态变量状态未改变这类。

回复

kel 作者 · 2017年01月13日

我用的L5.1,我研究下你说的问题

回复

0

我lumen5.2 也出现了同样的问题。挺致命的。

破晓 · 2017年06月02日
缘莲度 · 2017年01月13日

厉害了~

回复

cxscode · 2017年08月20日

表示性能提升基本都是因为opcache,从20多到220多,而启动laravoole后rps只达到了230-240左右,可能是我配置错了什么吧

回复

MonkeyBlog · 2017年09月12日

请问输入命令
php artisan laravoole start
抛错
Address 127.0.0.1:9050 already in use
然后查不到是什么在占用这个端口,这种情况你们发生过吗?

回复

0

找下9050端口被哪个程序占用,直接kill就可以了

陈小楷 · 2017年10月23日
0

我也遇到这个问题,看了下源码,是stream_socket_server被禁用的原因,去php.ini把禁用的stream_socket_server方法去掉就可以了

Verstar · 1月12日
0

@Verstar 已经解决了??

MonkeyBlog · 1月23日
ANDREW · 1月5日

请问使用laravoole 0.5.1版本, 开启LARAVOOLE_MODE=SwooleFastCGI后,如何解决跨域问题?
:已经有CORS中间件, 在php-fpm模式下跨域正常, 切换到laravoole后就无法实现跨域.

回复

你没法不再使用一下的超全局变量 这句话啥意思 要表达啥?

回复

0

因为常驻进程,像$GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST, $_ENV这种超全局变量会一直存在于内存中(除非worker退出)。所以多个请求公用同一个超全局变量时,会引发冲突。

hhxsv5 · 1月29日
0

最好不要用静态变量和全局变量,除非你清楚地知道自己在干什么

hhxsv5 · 1月29日
keepeye · 1月24日

worker数量多少 swoole版本都少?

回复

载入中...