1.是什么限制Laravel框架的速度?php
Laravel框架启动的时候须要加载不少文件,再加上其出了名的生态环境好,因此在开发过程当中咱们就会发现有很是多的已经造好的轮子,这也就使得Laravel的一次启动的磁盘IO特别高(就是要加载不少文件嘛),博主以前的一遍博客Laravel5框架性能优化技巧中也提到过一些优化,可是并无实质的解决磁盘IO高的问题。html
既然已经知道了问题所在,那就很容易解决了,只要每次启动Laravel的时候不都从新加载这些文件就行了,这时候大名鼎鼎的swoole就登场了。前端
2.Swoolenode
Swoole号称从新定义了PHP,它是一个PHP扩展,使得PHP可使用异步的方式执行,就像node同样,并且还能使用socket,为PHP提供了一系列异步IO、事件驱动、并行数据结构功能。Swoole 能够普遍应用于互联网、移动通讯、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。它能够大大提高项目的性能。linux
3.使用Swoole提高Laravel的性能nginx
在现有的轮子中,感受下面这两个仍是很是不错的,能够自行选择
laravel
博主选择了第一个,不要问我为何,任性!而后咱们就开始吧!git
使用composer安装:github
composer require swooletw/laravel-swoole
若是你使用的是laravel,那么在 config/app.php 的 providers 数组中加上bootstrap
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; } }
至此,大功告成,你能够像日常同样访问你的网站了。