使用 Swoole 来加速你的 Laravel 应用

Posted 牛B程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Swoole 来加速你的 Laravel 应用相关的知识,希望对你有一定的参考价值。

     关注我,会辣眼睛    


2018/5/18

牛B程序猿

这种做法,我打个不太恰当的比喻:

你喜欢一个女生,高跟红唇,一颦一笑都让你的心酥酥的。

于是10号开工资那天,你把这个月3千块的工资都给她买了礼物。女孩手下礼物,依旧对你一笑,酥酥的走了。

你的心里像是开了一朵花,由衷的赞叹:优雅,真特么优雅!

接下来这个月,你靠着卡里剩下的200块,硬是泡面就着老干妈,坚强的活了下来。



Swoole 是为 php 开发的生产级异步编程框架。 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP, Unix socket, HTTP, WebSocket 服务, 而不需要拥有太多的非阻塞 I/O 编程和低级别的 Linux 内核知识。 你可以把 Swoole 想象成 NodeJS, 但对于 PHP 来说将有更高性能。


为什么要在 Swoole 上运行 Laravel?

使用 Swoole 来加速你的 Laravel 应用


下图展示了 PHP 的生命周期。正如你所看到的那样,当你每次运行 PHP 脚本的时候,PHP都需要初始化模块并为你的运行环境启动Zend引擎。并且将 PHP 脚本编译为 OpCodes 以便 Zend引擎执行。


但是, 这样的生命周期需要在每次请求的时候都执行一遍。因为单个请求创建的环境在请求执行结束后会立即销毁。


换句话说, 在传统的 PHP 生命周期中, 为了脚本执行而浪费了大量的时间去创建和销毁资源。想象一下像 Laravel 这样的框架, 在每次请求中需要加载多少文件? 同时也浪费了大量的 I/O 操作


使用 Swoole 来加速你的 Laravel 应用


因此如果我们利用 Swoole 内置一个应用级别的 Server, 并且所有脚本文件在加载一次之后便可以保存在内存中呢? 这就是为什么我们需要尝试在 Swoole 上运行 Laravel。 Swoole 可以提供强大性能而 Laravel 则可以提供优雅代码结构使用。这俩儿真是完美组合 !


安装

使用 Swoole 来加速你的 Laravel 应用

以下是 swooletw/laravel-swoole 的主要特点:


在 Swoole 运行 Laravel/Lumen 应用

出色的性能提升至 30x

沙盒模式隔离应用程序容器

支持在 Laravel 应用中运行 WebSocket 服务器

支持 Socket.io 协议

支持 Swoole 表跨进程共享


使用 Composer 安装:


$ composer require swooletw/laravel-swoole


这个包依赖于 Swoole 。在使用这个包之前,请确保你的机器安装了正确的 Swoole 。使用下面的命令快速安装(linux):


pecl install swoole


在安装这个扩展之后,你需要编辑 php.ini 添加  extension=swoole.so


php -i | grep php.ini                      # check the php.ini file location
sudo echo "extension=swoole.so" > php.ini  # add the extension=swoole.so to the end of php.ini
php -m | grep swoole                       # check if the swoole extension has been enabled



访问 官网 获取更多的信息。

注意:Swoole 现在只支持 Linux 和 OSX 。Windows 服务器现在还不支持。


然后,添加服务提供者:

如果你使用 Laravel ,在 config/app.php 服务提供者数组添加该服务提供者:

[
   'providers' => [
       SwooleTW\Http\LaravelServiceProvider::class,
   ],
]


如果你使用 Lumen ,请将下面的代码添加到 bootstrap/app.php


$app->register(SwooleTW\Http\LumenServiceProvider::class);


这个包支持包自动发现机制。如果你运行 Laravel 5.5 以上版本,你可以跳过这一步。


建立并运行起来

使用 Swoole 来加速你的 Laravel 应用


现在,你可以执行以下的命令来启动 Swoole HTTP 服务。

$ php artisan swoole:http start


然后你可以看到以下信息:

Starting swoole http server...
Swoole http server started:<http://127.0.0.1:1215>


现在可以通过访问 http://127.0.0.1:1215 来进入 Laravel 应用。


基准测试

使用 Swoole 来加速你的 Laravel 应用


使用 MacBook Air 13寸(2015年产)及干净的 Lumen 5.5 项目测试:
基准测试工具: wrk


wrk -t4 -c100 http://your.app


基于 FPM 的 Nginx

使用 Swoole 来加速你的 Laravel 应用


Running 10s test @ http://lumen.app:9999
 4 threads and 100 connections
 Thread Stats   Avg      Stdev     Max   +/- Stdev
   Latency     1.14s   191.03ms   1.40s    90.31%
   Req/Sec    22.65     10.65    50.00     65.31%
 815 requests in 10.07s, 223.65KB read
Requests/sec:     80.93
Transfer/sec:     22.21KB



Swoole HTTP 服务

使用 Swoole 来加速你的 Laravel 应用


Running 10s test @ http://127.0.0.1:1215
 4 threads and 100 connections
 Thread Stats   Avg      Stdev     Max   +/- Stdev
   Latency    11.58ms    4.74ms  68.73ms   81.63%
   Req/Sec     2.19k   357.43     2.90k    69.50%
 87879 requests in 10.08s, 15.67MB read
Requests/sec:   8717.00
Transfer/sec:      1.55MB




更多信息

使用 Swoole 来加速你的 Laravel 应用


Github Repo 查看官方包, 也可以参考 官方文档 获取更多信息。





一个始终向往着诗和远方的程序员

——   牛B程序猿   老七


以上是关于使用 Swoole 来加速你的 Laravel 应用的主要内容,如果未能解决你的问题,请参考以下文章

使用 swoole 加速你的 laravel

Laravel使用Swoole加速

使用 Swoole 加速你的 CMS 系统

laravel 怎么调用hash:make

基于Laravel+Swoole开发智能家居后端

实战在Laravel中使用swoole来取代nginx作为http服务器