为了账号安全,请及时绑定邮箱和手机立即绑定

Yii 2.0进阶版 高级组件 ES/Redis/ Sentry 优化京东平台

标签:
PHP MySQL Yii

知识点

这是李捷老师的第二篇实战课程的介绍,是关于上一篇Yii2.0实战的优化

  • Yi2框架的Assets前端资源发布的使用
  • Yii2框架的用户认证体系
  • Yi2框架的RBAC(基于角色的访问控制)权限管理
  • 基于Elasticsearch实现商品的全文检索
  • 编写基于Redis的邮件异步发送工具
  • Yi2缓存机制和URL美化处理
  • Yi2日志组件的使用和Sentry日志收集以及Kafka消息队列的使用
  • 搭建高性能的MySQL架构
  • 使用LVS负载均衡技术实现高可用、高性能的服务器集群架构

查看Yii版本

  1. controllers中加入echo \Yii::getVersion();
  2. 使用yii自带脚本yii.bat

Assets资源组件

  1. 资源文件按需加载
  2. 解决资源间依赖
  3. 一键安装前端插件
  4. 管理方便
class AppAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';
    public $css = [
        'css/site.css',
    ];
    public $js = [
    ];
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
    ];
}

AsseetsBundle attribute

  • basePath:资源文件并可Web访问的目录
  • baseUrl:Web访问资源文件的URL
  • css、js:资源包文件的数组
  • depends:该资源包依赖的其他资源包
  • jsOptions:加载JS文件时使用到的选项。
  • cssOptions:加载CSS文件时使用到的选项。

按需加载

  • registerJsFile:加载JS文件
  • registerCssFile:加载CSS文件
  • registerJs:加载JS代码
  • registerCss:加载CSS代码

NavBar和Nav的使用

首页顶部的view书写
<?php
        NavBar::begin([
            'options' => [
                "class" => "top-bar animate-dropdown",
            ],
        ]);
        echo Nav::widget([
            'options' => ['class' => 'navbar-nav navbar-left'],
            'items' => [
                ['label' => '首页', 'url' => ['/index/index']],
                !\Yii::$app->user->isGuest ? (
                    ['label' => '我的购物车', 'url' => ['/cart/index']]
                ) : '',
                !\Yii::$app->user->isGuest ? (
                    ['label' => '我的订单', 'url' => ['/order/index']]
                ) : '',
            ],
        ]);
        echo Nav::widget([
            'options' => ['class' => 'navbar-nav navbar-right'],
            'items' => [
                \Yii::$app->user->isGuest ? (
                    ['label' => '注册', 'url' => ['/member/auth']]
                ) : '',
                \Yii::$app->user->isGuest ? (
                    ['label' => '登录', 'url' => ['/member/auth']]
                ) : '',
                !\Yii::$app->user->isGuest ? (
                    '欢迎您回来,'. \Yii::$app->user->identity->username .' , '. 
                    Html::a('退出', ['/member/logout'])
                ) : '',
            ],
        ]);
        NavBar::end();
    ?>

###面包屑的复用

<?php 
        echo Breadcrumbs::widget([
            'homeLink' => ['label' => '首页', 'url' => '/admin/default/index'],
            'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
        ]);
        ?>
比如我们引用的时候
$this->params['breadcrumbs'][] = ['label' => '分类管理', 'url' => ['/admin/category/list']];

分类插件使用 jstree(略)

线下资源包和线上资源包的区分

在配置中设置
'assetManager' => [
            'class' => 'yii\web\AssetManager',
            'bundles' => [
                'yii\web\JqueryAsset' => [
                    'js' => [
                        YII_ENV_DEV ? 'jquery.js' : 'jquery.min.js'
                    ],
                ],
                'yii\bootstrap\BootstrapAsset' => [
                    'css' => [
                        YII_ENV_DEV ? 'css/bootstrap.css' : 'css/bootstrap.min.css',
                    ]
                ],
                'yii\bootstrap\BootstrapPluginAsset' => [
                    'js' => [
                        YII_ENV_DEV ? 'js/bootstrap.js' : 'js/bootstrap.min.js',
                    ]
                ]
            ],
        ],

用户认证User组件

  • 用户组件 yii\web\User 用来管理用户的认证状态。
  • 需要指定一个含有实际认证逻辑的认证类继承实现yii\web\Identitylnterface接口
  • 实现后的实例作为yii\web\User组件的身份验证实例

认证接口

  • yii\web\IdentityInterface
    • yii\web\udentitylnterface:findldentity()
    • yii\web\udentitylnterface:findldentityByAccessToken()
    • yii\web\udentitylnterface:getld()
    • yii\web\udentitylnterface::getAuthKey()
    • yii\web\udentitylnterface:validateAuthKey()
  • 根据id查找用户模型的实例 findidentity

图片描述

图片描述

访问过滤器(验证用户是否登录)
public function behaviors()
    {
        return [
            'access' => [
                'class' => \yii\filters\AccessControl::className(),
                'only' => $this->actions,
                'except' => $this->except,
                'rules' => [
                    [
                        'allow' => false,
                        'actions' => empty($this->mustlogin) ? [] : $this->mustlogin,
                        'roles' => ['?'], // guest
                    ],
                    [
                        'allow' => true,
                        'actions' => empty($this->mustlogin) ? [] : $this->mustlogin,
                        'roles' => ['@'],
                    ],
                ],
            ],

yii密码加密

不再使用md5和sha1加密,转而使用更加安全的bcrypt

bcrypt

图片描述

RBAC(基于角色的权限访问)权限管理 Role Based Access Control

图片描述

图片描述

  • 权限认证流程:
    • 用户登录后认证用户的角色
    • 根据角色查询出角色该有的权限(操作)列表
    • 访问某一个权限(操作)时判断该用户是否拥有访问的能力
使用yii命令创建数据库
./yii migration --migrationPath=@yii/rbac/migrations
  • 实现方式
    • 数据库:
      • 存储角色或权限的表:auth_item
      • 角色权限关联表:auth_item_child
      • 用户角色(权限)表:auth_assignment
      • 规则表:auth_rule
    • 文件:
      • @app/rbac
'authManager' => [
            'class' => 'yii\rbac\DbManager',
            // auth_item (role permission)
            // auth_item_child (role->permission)
            // auth_assignment (user->role)
            // auth_rule (rule)
            'itemTable' => '{{%auth_item}}',
            'itemChildTable' => '{{%auth_item_child}}',
            'assignmentTable' => '{{%auth_assignment}}',
            'ruleTable' => '{{%auth_rule}}',
        ],
创建数据表
.yii migrate --migrationPath=@yii/rbac/miginations

全文检索

全文检索引擎是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。

  • 相关产品:Lucene,Sphinx,Xapian,Nutch,DataparkSearch,ElasticSearch

Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful APl来隐藏Lucene的复杂怕y从而让全文搜索变得简单。

  • 分布式的实时文件存储,每个字段都被索引可被搜索
  • 分布式的实时分析搜索引擎
  • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据

  • 优点
    • 所有功能集成在一个服务里面,可以通过RESTful API、各种语言的客户端甚至命令行与之交互
    • 上手容易,提供了很多合理的缺省值,开箱即用,学习成本低
    • 可免费下载、使用和修改
    • 配置灵活

结构化数据

  • 相关概念
    • 行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据
    • 能够用数据或统一的结构加以表示
    • 数字、符号

非结构化数据

  • 相关概念
    • 无法用数字或统一的结构表示
    • 文本、图像、声音、网页
    • 结构化数据属于非结构化数据
    • 非结构化数据即为全文数据

顺序扫描法

索引扫描法

全文检索的基本思路,也即将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。

创建索引

图片描述

图片描述

搜索索引

  • 如何搜索索引
    • 第一步:用户输入查询语句
    • 第二步:对查询语句进行词法分析,语法分析,及语言处理
    • 第三步:搜索索引,得到符合文档
下载ES文件
yum -y install elasticsearch
配置elasticsearch.yml
cluster.name: yii2-search
node.name: master-1
network.host: 192.168.199.112
http.port: 9200
启动ES
service elasticsearch start
不过中文如果想支持分词,需要安装一个analysis-ak插件
clone下载
git checkout tags/版本号
安装略,然后重启

图片描述

Redis优化QQ邮箱注册

  • 实现:
    • 用户点击注册>连接邮箱服务器>将注册信息发送给邮箱服务器,邮箱服务器返回结果>本地Web服务器

  • 网络因素
  • 网络慢导致发邮件响应慢
  • 用户体验差

解决方案

  • 用户注册>将注册信息存储在内存队列>通知用户发送成功
  • 服务端离线监听内存队列>将队列中的邮件数据依次发送
  • 用户感知不到
  • 用户体验好

  • 安装Redis服务
  • 编写YII2的插件
  • 重写SwiftMailer类的方法

MySQL主从复制

看我之前写过的一篇文章http://blog.csdn.net/qq_33936481/article/details/72956186

  • 解决问题
    • 数据分布
    • 负载均衡
    • 备份
    • 高可用性和容错性

  • 实现原理
    • MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器
    • MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)
    • 每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新。

  • 实现步骤
  • Master将改变记录到二进制日志(binary log)中
  • Slave将Master的binary log events拷贝到它的中继日志(relay log);
  • Slave重做中继日志中的事件,将改变反映它自己的数据

图片描述

大概步骤:

  1. vim /etc/my.cnf log-bin,server-id
  2. show master status ,reset master status 查看master数据库当前正在使用的二进制日志及当前执行二进制日志位置
  3. grant replication slave on *.* to slave@192.168.199.152 identified by ''123456"; 主服务器授权slave用户通过密码经过152服务器访问 master;
  4. 确定两台服务器是否相同 ping 从服务器启动复制(注意这个写的是主服务器的位置)
  5. start slave;启动复制链路。

MySQL双主热备(复制拓扑)

  • 解决问题
    • Master挂掉不会影响业务
    • 实现心跳

图片描述

大概步骤

  1. 从:log_slave_updates = 1 然后授权 grant
  2. 二主监听从,启动复制
  3. start slave

数据库中间件Mycat

图片描述

LVS

  • LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
  • 本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
  • 目的
    • 通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器集群,它具有良好可靠性、可扩展性和可操作性。
    • 低廉的成本实现最优的服务性能

  • 优点
    • 开源,免费
    • 技术资源较为丰富
    • 具有软件负载均衡的一些优点
  • 实现原理
    • 基于DNS域名轮流解析的方法
    • 基于客户端调度访问的方法
    • 基于应用层系统负载的调度方法
    • 基于IP地址的调度方法

图片描述

uname -r 查询linux内核版本
yum -y install ipvsadm
ipvsadm -h 

Nat模式

  • 实现原理
  • 地址转换技术
  • DR只需要将VIP配置到DR上
  • 将收到的集群服务请求报文目标地址转换成根据算法计算得出的后端主机IP地址
  • 然后后端主机将响应报文发送至DR
  • 再由DR将源地址转换成VIP的地址

图片描述

点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
PHP开发工程师
手记
粉丝
1.6万
获赞与收藏
1807

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消