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切割页面div内容的实现代码分享
Jul 31 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
如何使用php绘制在图片上的正余弦曲线
Jun 08 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
Nov 19 PHP
php简单定时执行任务的实现方法
Feb 23 PHP
PHP多态代码实例
Jun 26 PHP
PHP实现简单搜歌的方法
Jul 28 PHP
php制作圆形用户头像的实例_自定义封装类源代码
Sep 18 PHP
laravel 实现划分admin和home 模块分组
Oct 15 PHP
浅析PHP中json_encode与json_decode的区别
Jul 15 PHP
php实现对短信验证码发送次数的限制实例讲解
Mar 04 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分页实例代码分享
2011/07/28 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
PHP错误机制知识汇总
2016/03/24 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
jQuery 表单验证扩展(四)
2010/10/20 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
详细解析Python当中的数据类型和变量
2015/04/25 Python
深入了解Python数据类型之列表
2016/06/24 Python
python发送邮件实例分享
2017/07/28 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
Python聊天室程序(基础版)
2018/04/01 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
自荐书范文范例
2014/02/13 职场文书
计算机科学系职业生涯规划书
2014/03/08 职场文书
销售类求职信
2014/06/13 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
2019各种承诺书范文
2019/06/24 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
python库sklearn常用操作
2021/08/23 Python