• 售前

  • 售后

热门帖子
入门百科

LaravelS通过Swoole加速Laravel/Lumen详解

[复制链接]
看不清从bm 显示全部楼层 发表于 2021-10-25 19:17:22 |阅读模式 打印 上一主题 下一主题
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 )
  1. # 在你的Laravel/Lumen项目的根目录下执行
  2. composer require "hhxsv5/laravel-s:~1.0" -vvv
  3. # 确保你的composer.lock文件是在版本控制中
复制代码
2.添加service provider
Laravel : 修改文件 config/app.php
  1. 'providers' => [
  2. //...
  3. Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class,
  4. ],
复制代码
Lumen : 修改文件 bootstrap/app.php
  1. $app->register(Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class);
复制代码
3.发布配置文件
  1. php artisan laravels publish
复制代码
特殊环境 : 你不需要手动加载配置 laravels.php ,LaravelS底层已主动加载。
  1. // 不必手动加载,但加载了也不会有问题
  2. $app->configure('laravels');
复制代码
4.修改配置 config/laravels.php :监听的IP、端口等,请参考 配置项 。
运行
  1. 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共同使用
  1. upstream laravels {
  2. server 192.168.0.1:5200 weight=5 max_fails=3 fail_timeout=30s;
  3. #server 192.168.0.2:5200 weight=3 max_fails=3 fail_timeout=30s;
  4. #server 192.168.0.3:5200 backup;
  5. }
  6. server {
  7. listen 80;
  8. server_name laravels.com;
  9. root /xxxpath/laravel-s-test/public;
  10. access_log /yyypath/log/nginx/$server_name.access.log main;
  11. autoindex off;
  12. index index.html index.htm;
  13. # Nginx处理静态资源,LaravelS处理动态资源。
  14. location / {
  15.   try_files $uri @laravels;
  16. }
  17. location @laravels {
  18.   proxy_http_version 1.1;
  19.   # proxy_connect_timeout 60s;
  20.   # proxy_send_timeout 60s;
  21.   # proxy_read_timeout 120s;
  22.   proxy_set_header Connection "keep-alive";
  23.   proxy_set_header X-Real-IP $remote_addr;
  24.   proxy_set_header Host $host;
  25.   proxy_pass http://laravels;
  26. }
  27. }
复制代码
监听事件

通常,你可以在这些事件中重置或烧毁一些全局或静态的变量,也可以修改当前的哀求和相应。
laravels.received_request 将 swoole_http_request 转成 Illuminate\Http\Request 后,在Laravel内核处理哀求前。
  1. // 修改`app/Providers/EventServiceProvider.php`, 添加下面监听代码到boot方法中
  2. // 如果变量$exents不存在,你也可以调用\Event::listen()。
  3. $events->listen('laravels.received_request', function (\Illuminate\Http\Request $req) {
  4. $req->query->set('get_key', 'hhxsv5');// 修改querystring
  5. $req->request->set('post_key', 'hhxsv5'); // 修改post body
  6. });
复制代码
laravels.generated_response 在Laravel内核处理完哀求后,将 Illuminate\Http\Response 转成 swoole_http_response 之前(下一步将相应给客户端)。
  1. $events->listen('laravels.generated_response', function (\Illuminate\Http\Request $req, \Symfony\Component\HttpFoundation\Response $rsp) {
  2. $rsp->headers->set('header-key', 'hhxsv5');// 修改header
  3. });
复制代码
在你的项目中使用 swoole_http_server 实例
  1. /**
  2. * @var \swoole_http_server
  3. */
  4. $swoole = app('swoole');// Singleton
  5. var_dump($swoole->stats());
复制代码
注意事项

推荐通过 Illuminate\Http\Request 对象来获取哀求信息,兼容$_SERVER、$_GET、$_POST、$_FILES、$_COOKIE、$_REQUEST, 不能使用 $_SESSION、$_ENV。
  1. public function form(\Illuminate\Http\Request $request)
  2. {
  3. $name = $request->input('name');
  4. $all = $request->all();
  5. $sessionId = $request->cookie('sessionId');
  6. $photo = $request->file('photo');
  7. $rawContent = $request->getContent();
  8. //...
  9. }
复制代码
推荐通过返回 Illuminate\Http\Response 对象来相应哀求,兼容echo、vardump()、print_r(), 不能使用 函数像exit()、
  1. die()、header()、setcookie()、http_response_code()。
  2. public function json()
  3. {
  4. return response()->json(['time' => time()])->header('header1', 'value1')->withCookie('c1', 'v1');
  5. }
复制代码
你声明的全局、静态变量必须手动清理或重置。

无穷追加元素到静态或全局变量中,将导致内存爆满。
  1. // 某类
  2. class Test
  3. {
  4. public static $array = [];
  5. public static $string = '';
  6. }
  7. // 某控制器
  8. public function test(Request $req)
  9. {
  10. // 内存爆满
  11. Test::$array[] = $req->input('param1');
  12. Test::$string .= $req->input('param2');
  13. }
复制代码
待办事项

      
  • 针对MySQL/Redis的毗连池。  
  • 包装MySQL/Redis/Http的协程客户端。  
  • 针对Swoole 2.1+ 主动的协程支持。
总结
以上就是这篇文章的全部内容了,盼望本文的内容对各人的学习或者工作具有一定的参考学习代价,如果有疑问各人可以留言交换,谢谢各人对草根技术分享的支持。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作