LaravelS通过Swoole加速Laravel/Lumen详解


Posted in PHP onMarch 02, 2018

LaravelS - 站在巨人的肩膀上

本文主要介绍了LaravelS通过Swoole加速Laravel/Lumen的相关内容,关于:rocket: 通过Swoole来加速 Laravel/Lumen,其中的S代表Swoole,速度,高性能。

特性

  • 高性能的Swoole
  • 内置Http服务器
  • 常驻内存
  • 平滑重启
  • 同时支持Laravel与Lumen,兼容主流版本
  • 简单,开箱即用

如果对你有帮助,Star Me LaravelS

要求

依赖 说明
PHP >= 5.5.9
Swoole >= 1.7.19 推荐最新的稳定版 从2.0.12开始不再支持PHP5
Laravel / Lumen >= 5.1
Gzip[可选的] zlib , 检查本机libz是否可用 ldconfig -p|grep libz

安装

1.通过 Composer 安装( packagist )

# 在你的Laravel/Lumen项目的根目录下执行
composer require "hhxsv5/laravel-s:~1.0" -vvv
# 确保你的composer.lock文件是在版本控制中

2.添加service provider

Laravel : 修改文件 config/app.php

'providers' => [
 //...
 Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class,
],

Lumen : 修改文件 bootstrap/app.php

$app->register(Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class);

3.发布配置文件

php artisan laravels publish

特别情况 : 你不需要手动加载配置 laravels.php ,LaravelS底层已自动加载。

// 不必手动加载,但加载了也不会有问题
$app->configure('laravels');

4.修改配置 config/laravels.php :监听的IP、端口等,请参考 配置项 。

运行

php artisan laravels {start|stop|restart|reload|publish}

命令 说明
start 启动LaravelS,展示已启动的进程列表 ps -ef|grep laravels
stop 停止LaravelS
restart 重启LaravelS
reload 平滑重启所有worker进程,这些worker进程内包含你的业务代码和框架(Laravel/Lumen)代码,不会重启master/manger进程
publish 发布配置文件到你的项目中 config/laravels.php

与Nginx配合使用

upstream laravels {
 server 192.168.0.1:5200 weight=5 max_fails=3 fail_timeout=30s;
 #server 192.168.0.2:5200 weight=3 max_fails=3 fail_timeout=30s;
 #server 192.168.0.3:5200 backup;
}
server {
 listen 80;
 server_name laravels.com;
 root /xxxpath/laravel-s-test/public;
 access_log /yyypath/log/nginx/$server_name.access.log main;
 autoindex off;
 index index.html index.htm;
 
 # Nginx处理静态资源,LaravelS处理动态资源。
 location / {
  try_files $uri @laravels;
 }

 location @laravels {
  proxy_http_version 1.1;
  # proxy_connect_timeout 60s;
  # proxy_send_timeout 60s;
  # proxy_read_timeout 120s;
  proxy_set_header Connection "keep-alive";
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $host;
  proxy_pass http://laravels;
 }
}

监听事件

通常,你可以在这些事件中重置或销毁一些全局或静态的变量,也可以修改当前的请求和响应。

laravels.received_request 将 swoole_http_request 转成 Illuminate\Http\Request 后,在Laravel内核处理请求前。

// 修改`app/Providers/EventServiceProvider.php`, 添加下面监听代码到boot方法中
// 如果变量$exents不存在,你也可以调用\Event::listen()。
$events->listen('laravels.received_request', function (\Illuminate\Http\Request $req) {
 $req->query->set('get_key', 'hhxsv5');// 修改querystring
 $req->request->set('post_key', 'hhxsv5'); // 修改post body
});

laravels.generated_response 在Laravel内核处理完请求后,将 Illuminate\Http\Response 转成 swoole_http_response 之前(下一步将响应给客户端)。

$events->listen('laravels.generated_response', function (\Illuminate\Http\Request $req, \Symfony\Component\HttpFoundation\Response $rsp) {
 $rsp->headers->set('header-key', 'hhxsv5');// 修改header
});

在你的项目中使用 swoole_http_server 实例

/**
* @var \swoole_http_server
*/
$swoole = app('swoole');// Singleton
var_dump($swoole->stats());

注意事项

推荐通过 Illuminate\Http\Request 对象来获取请求信息,兼容$_SERVER、$_GET、$_POST、$_FILES、$_COOKIE、$_REQUEST, 不能使用 $_SESSION、$_ENV。

public function form(\Illuminate\Http\Request $request)
{
 $name = $request->input('name');
 $all = $request->all();
 $sessionId = $request->cookie('sessionId');
 $photo = $request->file('photo');
 $rawContent = $request->getContent();
 //...
}

推荐通过返回 Illuminate\Http\Response 对象来响应请求,兼容echo、vardump()、print_r(), 不能使用 函数像exit()、

die()、header()、setcookie()、http_response_code()。
public function json()
{
 return response()->json(['time' => time()])->header('header1', 'value1')->withCookie('c1', 'v1');
}

你声明的全局、静态变量必须手动清理或重置。

无限追加元素到静态或全局变量中,将导致内存爆满。

// 某类
class Test
{
 public static $array = [];
 public static $string = '';
}

// 某控制器
public function test(Request $req)
{
 // 内存爆满
 Test::$array[] = $req->input('param1');
 Test::$string .= $req->input('param2');
}

待办事项

  • 针对MySQL/Redis的连接池。
  • 包装MySQL/Redis/Http的协程客户端。
  • 针对Swoole 2.1+ 自动的协程支持。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php csv操作类代码
Dec 14 PHP
codeigniter集成ucenter1.6双向通信的解决办法
Jun 12 PHP
PHP自毁程序(慎用)
Jul 09 PHP
WordPress中用于检索模版的相关PHP函数使用解析
Dec 15 PHP
PHP消息队列用法实例分析
Feb 12 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
Feb 15 PHP
php通过文件头判断格式的方法
May 28 PHP
PHP多种序列化/反序列化的方法详解
Jun 23 PHP
php nginx 实时输出的简单实现方法
Jan 21 PHP
php的优点总结 php有哪些优点
Jul 19 PHP
Laravel框架中集成MongoDB和使用详解
Oct 17 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
Oct 30 PHP
PHP生成随机数的方法总结
Mar 01 #PHP
PHP Post获取不到非表单数据的问题解决办法
Feb 27 #PHP
php实现生成带二维码图片并强制下载功能
Feb 24 #PHP
php递归函数怎么用才有效
Feb 24 #PHP
php格式文件打开的四种方法
Feb 24 #PHP
Docker搭建自己的PHP开发环境
Feb 24 #PHP
php爬取天猫和淘宝商品数据
Feb 23 #PHP
You might like
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
用php解析html的实现代码
2011/08/08 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
js函数返回多个返回值的示例代码
2013/11/05 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
用python制作游戏外挂
2018/01/04 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
python飞机大战pygame游戏背景设计详解
2019/12/17 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
介绍一下linux的文件系统
2012/03/20 面试题
介绍一下JMS编程步骤
2015/09/22 面试题
实习单位推荐信范文
2013/11/27 职场文书
浙江文明网签名寄语
2014/01/18 职场文书
《散步》教学反思
2014/03/02 职场文书
迎新晚会策划方案
2014/06/13 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技