page contents

Laravel使用swoole来取代nginx作为http服务器

至此,大功告成,你可以像平常一样访问你的网站了。

attachments-2020-07-OoDCxjGi5f02b17dcf73b.png


1.是什么限制Laravel框架的速度?

Laravel框架启动的时候需要加载很多文件,再加上其出了名的生态环境好,所以在开发过程中我们就会发现有非常多的已经造好的轮子,这也就使得Laravel的一次启动的磁盘IO特别高(就是要加载很多文件),现在的问题就是:每次启动Laravel的时候不都重新加载这些文件就好了,所以用swoole就能很好的解决。


2.Swoole

Swoole号称重新定义了PHP,它是一个PHP扩展,使得PHP可以使用异步的方式执行,就像node一样,而且还能使用socket,为PHP提供了一系列异步IO、事件驱动、并行数据结构功能。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。它可以大大提升项目的性能。


3.使用Swoole提升Laravel的性能

在现有的轮子中,感觉下面这两个还是非常不错的,可以自行选择

  • swooletw/laravel-swoole
  • garveen/laravoole


这里小编选择了swooletw/laravel-swoole

使用composer安装:

composer require swooletw/laravel-swoole



如果你使用的是laravel,那么在 config/app.php 的 providers 数组中加上

SwooleTW\Http\LaravelServiceProvider::class,</pre>



如果你使用的是lumen,那么在 bootstrap/app.php 中加入如下代码

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



将配置文件导出到 config 目录下
php artisan vendor:publish --provider="SwooleTW\Http\HttpServiceProvider"



然后可以去 config/swoole_http.php 中配置信息
'server' => [
        'host' => env('SWOOLE_HTTP_HOST', '127.0.0.1'),
        'port' => env('SWOOLE_HTTP_PORT', '1215'),
        'options' => [
            'pid_file' => env('SWOOLE_HTTP_PID_FILE', base_path('storage/logs/swoole_http.pid')),
            'log_file' => env('SWOOLE_HTTP_LOG_FILE', base_path('storage/logs/swoole_http.log')),
            'daemonize' => env('SWOOLE_HTTP_DAEMONIZE', 1),
        ],
],



host和post不用多说,options里面的具体配置可以去swoole官网查看详细参数信息。

swoole_http.php 里还提供配置 providers 数组,

'providers' => [
    // App\Providers\AuthServiceProvider::class,
]

因为使用swoole作为http后,这些providers会被存到内存中,所以这里配置的是每次
请求都想要重新注册和重新启动的providers。


Artisan Commands

这个轮子完全使用artisan命令来操作。

php artisan swoole:http start|stop|restart|reload

依次是,启动/停止/重启/重载。

所以我们可以通过以下命令来启动swoole_http_server

php artisan swoole:http start

现在可以通过配置文件里的host和port去访问Laravel了,例如我的配置是: 127.0.0.1:1215

注意:该拓展是不支持热启动的,所以每次有代码更新都要重启服务 php artisan swoole:http restart 。当然你也可以在linux上写一个脚本,让 git pull 代码后自动重启服务。


4.性能测试

下面让我们来看两张图。

使用swoole前:

v2-5a1c9204250ed8969af7bcadc5be91e7_720w.jpg

使用swoole后:

v2-986150fa40d7a35e03ddfe6cf1173f8e_720w.jpg

这里是使用Apache的ab测试工具

ab -n1000 -c10 http://127.0.0.1:1215

我们可以惊奇的发现, Request per second 从原来的20多,提升到了600多。将近提升了30倍左右。啊,多么痛的领悟!!


5.使用Nginx代理

swoole在官网也提到过:swoole_http_server对Http协议的支持并不完整,建议仅作为应用服务器。并且在前端增加Nginx作为代理。

那么,我们就增加需要配置nginx.conf里的server:

server {
    listen 80;
    server_name your.domain.com;
    root /path/to/laravel/public;
    index index.php;

    location = /index.php {
        # Ensure that there is no such file named "not_exists"
        # in your "public" directory.
        try_files /not_exists @swoole;
    }

    location / {
        try_files $uri $uri/ @swoole;
    }

    location @swoole {
        set $suffix "";

        if ($uri = /index.php) {
            set $suffix "/";
        }

        proxy_set_header Host $host;
        proxy_set_header SERVER_PORT $server_port;
        proxy_set_header REMOTE_ADDR $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # IF https
        # proxy_set_header HTTPS "on";

        proxy_pass http://127.0.0.1:1215$suffix;
    }
}

至此,大功告成,你可以像平常一样访问你的网站了。


attachments-2020-07-QbVhNpem5f02b193e5139.jpg

  • 发表于 2020-07-06 13:08
  • 阅读 ( 691 )
  • 分类:PHP开发

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章