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 Undefined index的问题
Jun 01 PHP
ThinkPHP缓存方法S()概述
Jun 13 PHP
PHP中防止SQL注入方法详解
Dec 25 PHP
php实现获取文件mime类型的方法
Feb 11 PHP
Ajax和PHP正则表达式验证表单及验证码
Sep 24 PHP
一个实用的php验证码类
Jul 06 PHP
PHP读取word文档的方法分析【基于COM组件】
Aug 01 PHP
php实现的后台表格分页功能示例
Oct 23 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
Nov 29 PHP
Laravel框架下载,安装及路由操作图文详解
Dec 04 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
PHP的重载使用魔术方法代码实例详解
Feb 26 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
smarty section简介与用法分析
2008/10/03 PHP
php数组编码转换示例详解
2014/03/11 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
php源码的安装方法和实例
2019/09/26 PHP
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
JavaScript中继承的一些示例方法与属性参考
2010/08/07 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
详解React+Koa实现服务端渲染(SSR)
2018/05/23 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
JsonProperty 的使用方法详解
2019/10/11 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
Python中Django 后台自定义表单控件
2017/03/28 Python
vscode 远程调试python的方法
2017/12/01 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
python 分离文件名和路径以及分离文件名和后缀的方法
2018/10/21 Python
python批量创建指定名称的文件夹
2019/03/21 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
机关财务管理制度
2014/01/17 职场文书
刊首寄语大全
2014/04/11 职场文书
服装发布会策划方案
2014/05/22 职场文书
服务标语大全
2014/06/18 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
2014年幼儿园德育工作总结
2014/12/17 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
在python中读取和写入CSV文件详情
2022/06/28 Python