社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NGINX

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

唤之 • 6 年前 • 603 次点击  

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

Laravel框架启动的时候需要加载很多文件,再加上其出了名的生态环境好,所以在开发过程中我们就会发现有非常多的已经造好的轮子,这也就使得Laravel的一次启动的磁盘IO特别高(就是要加载很多文件嘛),博主之前的一遍博客Laravel5框架性能优化技巧中也提到过一些优化,但是并没有实质的解决磁盘IO高的问题。

既然已经知道了问题所在,那就很容易解决了,只要每次启动Laravel的时候不都重新加载这些文件就好了,这时候大名鼎鼎的swoole就登场了。

 

2.Swoole

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

 

3.使用Swoole提升Laravel的性能

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

博主选择了第一个,不要问我为什么,任性!然后我们就开始吧!

使用composer安装:

composer require swooletw/laravel-swoole

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

SwooleTW\Http\LaravelServiceProvider::class,

如果你使用的是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前:

使用swoole后:

 

这里是使用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;
    }
}

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

 


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/Q7kdVGQt00
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/4839
 
603 次点击