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创建PDF中文文档
Oct 09 PHP
精通php的十大要点(上)
Feb 04 PHP
PHP 查找字符串常用函数介绍
Jun 07 PHP
分享一个php 的异常处理程序
Jun 22 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
Aug 05 PHP
PHP制作万年历
Jan 07 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
Mar 19 PHP
php实现处理输入转义字符的代码
Nov 08 PHP
yii添删改查实例
Nov 16 PHP
PHP Static延迟静态绑定用法分析
Mar 16 PHP
PHPCMS忘记后台密码的解决办法
Oct 30 PHP
Laravel5框架添加自定义辅助函数的方法
Aug 01 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
Protoss建筑一览
2020/03/14 星际争霸
队列在编程中的实际应用(php)
2010/09/04 PHP
两款万能的php分页类
2015/11/12 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
php面向对象重点知识分享
2019/09/27 PHP
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
2011/10/31 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
jQuery对val和atrr("value")赋值的区别介绍
2014/09/26 Javascript
JavaScript监听和禁用浏览器回车事件实例
2015/01/31 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
Nodejs实现短信验证码功能
2017/02/09 NodeJs
JS动画定时器知识总结
2018/03/23 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
跟老齐学Python之数据类型总结
2014/09/24 Python
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
python 实现朴素贝叶斯算法的示例
2020/09/30 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
Html5游戏开发之乒乓Ping Pong游戏示例(一)
2013/01/21 HTML / CSS
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
消防安全员岗位职责
2014/03/10 职场文书
投标承诺书范本
2014/03/27 职场文书
初中信息技术教学计划
2015/01/22 职场文书
员工旷工检讨书
2015/08/15 职场文书
卖车协议书范文
2016/03/23 职场文书
前端实现滑动按钮AJAX与后端交互的示例代码
2022/02/24 Javascript
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫
Tomcat弱口令复现及利用
2022/05/06 Servers
Python使用Web框架Flask开发项目
2022/06/01 Python