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语法(3)
Oct 09 PHP
PHP设计模式 注册表模式(多个类的注册)
Feb 05 PHP
PHP中常用的转义函数
Feb 28 PHP
PHP函数getenv简介和使用实例
May 12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
Jun 25 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
php多次include后导致全局变量global失效的解决方法
Feb 28 PHP
php中的常用魔术方法汇总
Feb 14 PHP
ZendFramework2连接数据库操作实例
Apr 18 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
Aug 13 PHP
laravel5.2表单验证,并显示错误信息的实例
Sep 29 PHP
laravel实现按月或天或小时统计mysql数据的方法
Oct 09 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
PHP分页效率终结版(推荐)
2013/07/01 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
JavaScript通过RegExp实现客户端验证处理程序
2013/05/07 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
jQuery的context属性用法实例
2014/12/27 Javascript
jQuery 选择器详解
2015/01/19 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
ReactNative中使用Redux架构总结
2017/12/15 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
vue中如何让子组件修改父组件数据
2018/06/14 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
复习Python中的字符串知识点
2015/04/14 Python
json跨域调用python的方法详解
2017/01/11 Python
Django中的forms组件实例详解
2018/11/08 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
keras之权重初始化方式
2020/05/21 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
乡镇办公室工作决心书
2014/03/11 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书