laravel-swoole在linux下的安装与配置,以及与o
在传统的 PHP 生命周期中,像 Laravel 这样的框架, 浪费了大量的时间去创建和销毁资源
因此如果我们利用 Swoole 内置一个应用级别的 Server, 并且所有脚本文件在加载一次之后便可以保存在内存中。
Jemeter并发测试相比较opcache插件能提升3-5倍,比较原生php7的话可以提升5-10倍,文末贴出测试报告。
涉及到Mysql查询的话性能提升确实有限(双核4G配置2M带宽并发量在1000左右),非mysql查询,例如生成图形验证码,有大幅度的性能提升(上述配置可以并发量2400+)
1、安装swooletw/laravel-swoole
需要在Linux服务器下安装swoole扩展,宝塔面板的操作比较简单
image.pngcd到laravel程序根目录下
使用 Composer 安装laravel-swoole:
$ composer require swooletw/laravel-swoole
本人项目中使用的是laravel 5.8,可以跳过providers的配置,
运行以下命令,生成配置文件swoole_http.php和swoole_websocket.php
$ php artisan vendor:publish --tag=laravel-swoole
修改swoole_http.php配置文件(仅供参考)
'server' => [
……
'host' => env('SWOOLE_HTTP_HOST', '0.0.0.0'),
'port' => env('SWOOLE_HTTP_PORT', '9200'),
……
'reactor_num' => env('SWOOLE_HTTP_REACTOR_NUM', 2*swoole_cpu_num()),
'worker_num' => env('SWOOLE_HTTP_WORKER_NUM', 2*swoole_cpu_num()),
'task_worker_num' => env('SWOOLE_HTTP_TASK_WORKER_NUM', 2*swoole_cpu_num()),
]
可以试着运行下列命令
php artisan swoole:http start
看到以下信息表示运行成功
Starting swoole http server...
Swoole http server started: <http://0.0.0.0:9200>
2、配置守护进程(Supervisor)
运行目录是laravel的根目录
启动文件填写php程序
image.png
3、配置站点和反向代理
3.1、添加站点
填写域名和根目录,php版本处设置为纯静态
添加站点
3.2、配置反向代理
点击添加反向代理按钮
添加反向代理01
填写目标URL为 http://0.0.0.0:9200,发送域名 $host
添加反向代理02
配置反向代理的跨域,修改配置文件
image.png
image.png
添加的文件内容如下
add_header "Access-Control-Allow-Origin" "*"; #设置允许跨域
add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS"; #设置允许通过跨域方法
add_header "Access-Control-Allow-Headers" "Origin, X-Requested-With, Content-Type, Accept,x-access-token"; #设置允许跨域的header
重启一下Nginx,可以愉快的访问了
测试报告(垃圾服务器+小水管,大佬勿喷)
注意事项:
禁用函数
exit/die 相关
由于 Swoole 中禁用exit
/die
函数,所以在 Laravel 中也不能使用它们,以及与之相关的dd
函数。
请求相关
不要使>用$_GET
/$_POST
/$_FILES
/$_COOKIE
/$_REQUEST
/$_SESSION
/$GLOBALS
/$_ENV
之类的超全局变量,统一通过Illuminate\Http\Request
对象获取请求数据。
另外,Swoole 限制 GET 请求头长度不能超过 2KB,POST 请求数据长度也会通过 package_max_length 配置进行限制,默认是 2M。
响应相关
统一通过Illuminate\Http\Response
返回响应,不要使用header()
/setcookie()
/http_response_code()
之类的函数,以免引起异常问题。
flush 相关
swoole_http_response
不支持flush
函数,所以不要使用与之相关的flush
/ob_flush
/ob_end_flush
/ob_implicit_flush
等函数。
参考文章
使用 Swoole 来加速你的 Laravel 应用 | PHP 技术论坛 https://learnku.com/php/t/10939/use-swoole-to-speed-up-your-laravel-application
Swoole 驱动的 Laravel 应用优化原理及注意事项 | 学院君(原Laravel学院) https://xueyuanjun.com/post/19832.html