后端知识整理

  • cookie和session的区别和联系

区别:cookie存在于浏览器中,可存放内容较少,易被篡改,用户可以禁用cookie;session存在于服务器中,可以文件,数据库,缓存的形式存在。联系:sessionId存放于cookie中,所以禁用cookie,session也不能使用了,但可以通过重写url的方式传递cookie

  •  clone的特性和表现

    protect $name = 'abc';    
    /**
     * clone的特性
     */
    public function clone(){
        $a = new self();
        $b = $a;//指向同一地址
        $c = &$a;//指向同一地址
        $d = clone $a;//创建新地址
        $b->name = '123 ';
        echo $a->name . $b->name . $c->name . $d->name;
        //输出123 123 123 abc
        //结论,赋值对象和引用一样,都指向同一地址,clone只能用于对象
    }
  • PHP的自动加载__autoload和spl_autoload_register

自动加载不是指实例化时,就把所有第三方扩展类都全部加载;而是按需加载,即当实例化一个类时,该类未引入,则执行__autoload()方法,所以我们要做的则是在autoload()方法写内引入类代码即可。

function __autoload($className){
    echo '自动加载了';
    require 'WxCrawler.php';
}
$obj = new WxCrawler();
$obj->test();//输出123

最终结果:

但__autoload有一个致命性问题,只能调用一次,因此PHP多了个新解决方案:spl_autoload_register

spl_autoload_register的特性是,会覆盖掉__autoload方法,并且可以多次注册

function __autoload($className){
    echo '自动加载了';
    require $className.'.php';
}
function autoload($className){
    echo ' 自动加载';
    $fileName = $className.'.php';
    if(file_exists($fileName)) {
        require $fileName;
        echo $className;
    }
    $fileName = $className.'.class.php';
    if(file_exists($fileName)){
        require $fileName;
        echo $className;
    }
}
spl_autoload_register('autoload');

$obj = new WxCrawler();
$obj = new Snoopy();

最终结果为:自动加载WxCrawler 自动加载Snoopy

  • self和static的区别

self会指向创建方法的类,而static则会指向实例化的类

        class A{
            function test1(){
                echo self::class;
            }
            function test2(){
                echo static::class;
            }
        }

        class B extends A{

        }

        $obj = new B();
        $obj->test1();//输出A
        $obj->test2();//输出B
  • 消息队列的使用场景

1、异步处理 ;2、应用解耦;3、流量削峰;4、日志处理;5、消息通讯

应用解耦中,假如分别有订单系统和库存系统,一般的流程是,用户下单后,订单系统调用库存系统接口,但如果库存系统故障,那么订单系统也会一起失败,两个应用之间是耦合的。但如果变成用户下单后,订单系统把消息写入消息队列,库存系统订阅消息,进行处理,订单系统就不需要关心后续的步骤,达到两个系统解耦。

流量削峰,用于抢购时候出现的并发,防止服务器宕机,可让服务器接收到请求后存到消息队列中,并且队列作长度的限制,超过队列长度则直接提示失败(可控制排队人数),之后按队列处理业务,具体流程如下

  • 正则知识

\w 小写w表示筛选的内容就是字母、数字、下划线范围中的任意一个;\W 与小写w相反。

\d表示数字(0-9)范围中的任意一个;\s ,表示一个空格

数量表达:

*:表示0个或多个     +:表示至少1个     ?:表示0个或1个

{2}表示2个  {1,}表示1个以上和'+'一样   {1,2}表示1个到2个

^表示开始的位置,$表示结束的位置,PHP中,要以 / 开头和结尾,不然会报错

邮箱正则   $guize = '/^\w+@\w+\.\w+$/';

  • 一条查询sql的执行过程

1.查询缓存,命中缓存则返回结果,未命中则下一步。

2.分析器,分析语句的语法,表明,字段是否正确。

3.优化器,会生成多个查询方案,会选择系统代价最小方案的进行查询。

4.执行器,按照查询方案进行数据的查询。

  • mysql联表,要用小表驱动大表

原因:join的查询过程,是先把驱动表(小表)数据全部加载到内存,再用被驱动表(大表)逐行对比,最终形成结果集。

所以,如果用大表连小表,则会把海量数据加载到内存,不仅性能差,内存占用也多。

IN和EXISTS的用法也一样,也是要用小表驱动大表

select * from order
where user_id in (select id from user where status=1)
select * from order
where exists (select 1 from user where order.user_id = user.id and status=1)

in是会优先执行子查询的,即右边的语句

而exists则会优先执行exists前的查询,即左边的语句

所以,当order表有10W数据,user表有100数据的时候,使用in的效率会更高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值