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的FTP学习(二)[转自奥索]
Oct 09 PHP
PHP的加密方式及原理
Jun 14 PHP
基于php在各种web服务器的运行模式详解
Jun 03 PHP
解决php接收shell返回的结果中文乱码问题
Jan 23 PHP
php使用json_encode对变量json编码
Apr 07 PHP
php读取flash文件高宽帧数背景颜色的方法
Jan 06 PHP
php生成zip文件类实例
Apr 07 PHP
PHP多态代码实例
Jun 26 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
Nov 19 PHP
CI操作cookie的方法分析(基于helper类库)
Mar 28 PHP
基于laravel belongsTo使用详解
Oct 18 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
Jan 23 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设计模式之单例模式定义与用法分析
2019/03/26 PHP
php session_decode函数用法讲解
2019/05/26 PHP
基于jquery的页面划词搜索JS
2010/09/14 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
Vue中的vue-resource示例详解
2018/11/02 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
node.js使用stream模块实现自定义流示例
2020/02/13 Javascript
微信小程序实现购物车小功能
2020/12/30 Javascript
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
python中的sort方法使用详解
2014/07/25 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Python正则表达式和元字符详解
2018/11/29 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
如何强制垃圾回收
2015/10/06 面试题
远程研修随笔感言
2014/02/10 职场文书
2014年小班元旦活动方案
2014/02/16 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
建筑结构施工求职信
2014/07/11 职场文书
学校关爱留守儿童活动方案
2014/08/27 职场文书
学校联谊协议书
2014/09/16 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫