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

Posted PHP开源社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实战在Laravel中使用swoole来取代nginx作为http服务器相关的知识,希望对你有一定的参考价值。


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

        

       不应当急于求成,应当去熟悉自己的研究对象,锲而不舍,时间会成全一切。凡事开始最难,然而更难的是何以善终。 ——莎士比亚 

                                                             

帮助你练脑子的逻辑思维题:

某城市发生了一起汽车撞人逃跑事件 
该城市只有两种颜色的车,蓝色15% 绿色85% 
事发时有一个人在现场看见了 
他指证是蓝车 
但是根据专家在现场分析,当时那种条件能看正确的可能性是80% 
那么,肇事的车是蓝车的概率到底是多少? 

答案将会公布在下一期的文章里 【实战】在Laravel中使用swoole来取代nginx作为http服务器 (听说长得帅气的都做出来了)

上一期的答案公布:

经过第一轮,说明任何两个数都是不同的。第二轮,前两个人没有猜出,说明任何一个数都不是其它数的两倍。现在有了以下几个条件:1.每个数大于02.两两不等3.任意一个数不是其他数的两倍。每个数字可能是另两个之和或之差,第三个人能猜出144,必然根据前面三个条件排除了其中的一种可能。假设:是两个数之差,即x-y=144。这时1(x,y>0)和2(x!=y)都满足,所以要否定x+y必然要使3不满足,即x+y=2y,解得x=y,不成立(不然第一轮就可猜出),所以不是两数之差。因此是两数之和,即x+y=144。同理,这时1,2都满足,必然要使3不满足,即x-y=2y,两方程联立,可得x=108,y=36。 
这两轮猜的顺序其实分别为这样:第一轮(一号,二号),第二轮(三号,一号,二号)。这样分大家在每轮结束时获得的信息是相同的(即前面的三个条件)。 
那么就假设我们是C,来看看C是怎么做出来的:C看到的是A的36和B的108,因为条件,两个数的和是第三个,那么自己要么是72要么是144(猜到这个是因为72的话,108就是36和72的和,144的话就是108和36的和。这样子这句话看不懂的举手): 
假设自己(C)是72的话,那么B在第二回合的时候就可以看出来,下面是如果C是72,B的思路:这种情况下,B看到的就是A的36和C的72,那么他就可以猜自己,是36或者是108(猜到这个是因为36的话,36加36等于72,108的话就是36和108的和): 
如果假设自己(B)头上是36,那么,C在第一回合的时候就可以看出来,下面是如果B是36,C的思路:这种情况下,C看到的就是A的36和B的36,那么他就可以猜自己,是72或者是0(这个不再解释了): 
如果假设自己(C)头上是0,那么,A在第一回合的时候就可以看出来,下面是如果C是0,A的思路:这种情况下,A看到的就是B的36和C的0,那么他就可以猜自己,是36或者是36(这个不再解释了),那他可以一口报出自己头上的36。(然后是逆推逆推逆推),现在A在第一回合没报出自己的36,C(在B的想象中)就可以知道自己头上不是0,如果其他和B的想法一样(指B头上是36),那么C在第一回合就可以报出自己的72。现在C在第一回合没报出自己的36,B(在C的想象中)就可以知道自己头上不是36,如果其他和C的想法一样(指C头上是72),那么B在第二回合就可以报出自己的108。现在B在第二回合没报出自己的108,C就可以知道自己头上不是72,那么C头上的唯一可能就是144了。 

(你猜对了吗?【实战】在Laravel中使用swoole来取代nginx作为http服务器


今天推送一首汪苏泷翻唱的歌,这首歌描述的暗恋的心情,旋律比较舒服,唱起来朗朗上口,希望年底有情人终成眷属,你也能找到自己的另一半【实战】在Laravel中使用swoole来取代nginx作为http服务器

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 【实战】在Laravel中使用swoole来取代nginx作为http服务器 【实战】在Laravel中使用swoole来取代nginx作为http服务器

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

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

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

 

2.Swoole

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

 

3.使用Swoole提升Laravel的性能

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

  • swooletw/laravel-swoole   链接:https://github.com/swooletw/laravel-swoole

  • garveen/laravoole   链接:https://github.com/garveen/laravoole

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

使用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 中配置信息

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

'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),
        ],
],

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

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前:

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

使用swoole后:

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

 

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

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

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;    }
}

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

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

 


今晚六星教育会联合腾讯课堂发出2018年货助学红包,现场发放,限时限量!


今晚课程预告:(参与途径点击阅读原文,登录QQ免费报名即可)

课题:

php+redis接口平台开发-高并发系统接口限流


知识点:

基于redis实现接口平台接口请求限制,解决请求高并发、流量修整限制


讲师:

六星PHP学院院长-Peter老师




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




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



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


今晚六星教育会联合腾讯课堂发出2018年货助学红包,现场发放,限时限量!

阅读原文登录自己的QQ号,点击立即报名,即可免费跟着我们学习从PHP基础到微信开发、支付接口、tp5、laravel项目实战、swoole扩展、redis高并发、队列任务等技术,周一到周六,晚上八点半不见不散! 





以上是关于实战在Laravel中使用swoole来取代nginx作为http服务器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swoole 来加速你的 Laravel 应用

Laravel使用Swoole加速

laravel下安装laravels以及websocket的使用

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

使用 swoole 加速你的 laravel

使用 Swoole 来加速你的 Laravel 应用