使用 Swoole 来加速你的 Laravel 应用

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

为何要在 Swoole 上运行 Laravel?

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

可是, 这样的生命周期须要在每次请求的时候都执行一遍。由于单个请求建立的环境在请求执行结束后会当即销毁。nginx

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

所以若是咱们利用 Swoole 内置一个应用级别的 Server, 而且全部脚本文件在加载一次以后即可以保存在内存中呢? 这就是为何咱们须要尝试在 Swoole 上运行 Laravel。 Swoole 能够提供强大性能而 Laravel 则能够提供优雅代码结构使用。这俩儿真是完美组合 !git

安装

如下是 swooletw/laravel-swoole 的主要特色:github

  • 在 Swoole 运行 Laravel/Lumen 应用
  • 出色的性能提高至 30x
  • 沙盒模式隔离应用程序容器
  • 支持在 Laravel 应用中运行 WebSocket 服务器
  • 支持 Socket.io 协议
  • 支持 Swoole 表跨进程共享

使用 Composer 安装:编程

$ composer require swooletw/laravel-swoole

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

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 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 应用。

基准测试

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

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

基于 FPM 的 Nginx

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 服务

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

更多信息

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

更多现代化 PHP 知识,请前往 Laravel / PHP 知识社区

相关文章
相关标签/搜索