最新整理的PHP高级面试题来啦!【附答案】

mysql

一、谈谈你在写sql语句须要注意有哪些点?php

答:mysql

  1. select * 问题,客户端须要什么,就给什么,不要给多余的字段,这种状况可能还会致使原本能够走覆盖索引的语句不能走覆盖索引。laravel

  2. 不要在查询语句字段上作函数运算,这样会让索引失效。面试

  3. 必定要避免mysql自动类型转换,好比 where ‘9’ =9。redis

  4. 能不设置容许 null 的字段尽可能不要设置,由于 null 会致使 mysql 多一层判断。算法

  5. 使用 like 的时候若是是通配符 % 在最前面的话也会走的全表扫描。sql

欢迎补充。shell

二、你刚才一直在提索引,把你知道的关于索引的一些技巧说下数据库

答:设计模式

  1. 要在区分度高的字段上创建索引,不然索引意义不大。

  2. 字符串创建索引要注意大小,索引长度过长,占用的空间也就越大,适当的能够截取进行索引,缺点是不能使用到覆盖索引,具体根据业务合理安排。

  3. 创建联合索引要知道最左前缀原则,举个例子( name, email, phone ),最终能走这个联合索引的必定只会是 ( name ),( name, email ),( name, email, phone ),其余只能走全表,须要根据业务合理设置联合索引的顺序。

三、索引底层是什么数据结构?

答:B+树。

四、为何用的是B+树,不能使用红黑树或者其余的?

答:可使用红黑树。可是这样的话可能会形成树的高度太高,意味着相同查询下,会进行更多的磁盘I/O,影响性能,而 B+ 树能够保持树的高度不至于太高。这道题答得不是很好,不只仅是这样,欢迎补充。

五、你知道索引下推吗?

本质上是对普通索引须要回表的一种优化,也就是引擎层在对索引指针遍历的过程当中,先作一些优先的判断,过滤掉不符合条件的,能够减小磁盘IO。

六、假设如今有人操做数据库,不当心执行错了语句,误删除了不少数据,这时候能恢复吗?咋么恢复。

答:首先,必定要开启 bin-log ,若是没有开启的话,可能就恢复不了。要看具体的文件系统是否能恢复。开启了 bin-log ,类型设置要设置成 row 或者 mixed ,不能设置 statement 。而后,若是是误删行的话,就能够把里面对应的删除事件换成插入事件,在备用库上执行。若是是误删表的话,能够先获取最近的一次全量备份,放到备库,而后拿出 bin-log , 除了不执行删除的事件,其余事件依次重放。

7.为何不能设置成 statement ?

答:设置成 statement ,实际 bin-log 存储的是 sql 语句( 非具体删除的主键id ),这样若是是主从架构的话,主和从可能由于选择的索引不同而致使主从不一致。

8.你刚才说到主从,那你说说主从运行的机制吧

答:首先主库仍是要开启 bin-log , 从库先设置要链接的主库 change master…… 而后执行 start slave,这时候从库会建立两个线程,一个 io_thread ,主要负责链接主数据库。一个sql_thread 主要是负责执行中转日志语句。首先,主库接收到从库的同步请求,根据传递的 bin-log 文件名和开始同步的位置,发送二进制文件给从库,从库 io_thread 负责把接收到的数据放入到中转日志,而后 sql_thread 负责从中转日志读取解析执行,执行完成,更新同步的位置标志。

9.你知道主从延迟吗?有些时候延迟的时间还会很长。遇到这种状况咋么办?

答:这种问题,注意了。划重点。问你出现问题,寻找解决方案的时候,必定要对症下药,也就是说这个问题你能够这样考虑,什么状况下致使的主从延迟。

  1. 若是主库和从库服务器配置不同,从库的差点,那么就可能致使延迟时间加长。这时候,换成相同的服务器配置服务器便可。

  2. 从库压力太大了。通常主从了,从库基本用来查询,好比可能运营或者开发者本身都在从库上进行一系列的 sql 操做。那简单呗。多配几个从库,分摊压力,一主多从。

  3. 大事务。好比 delete 这种语句 不 limit 限制一下,若是数据量过大,致使主库运行时都花费了长时间,再同步到从库,这个时间间隔过长。

设计模式

你知道哪些设计模式,你日常有使用到吗?能够结合你的业务场景说下吗?

答:这里我先举例日常使用 Laravel,里面就用到大量设计模式,好比门面,组合,装饰,观察者…… 具体场景带入,而后根据以前业务上的场景说了下……., 最后也说了设计模式不是银弹,只有在合适的场景使用合适的模式才能体现它的价值。

手写算法

给定一个已排序的数组和一个指定值,返回指定值在数组中的下标位置,若是不存在,返回把给定值插入到数组以后的下标位置。注意时间复杂度。

好比给定有序数组 [1,3,5,6] 给定值5.那么返回下标2.

给定有序数组[1,3,5,6] 给定值 7,返回下标4.

答:

function searchInsert($nums, $target) {
    if (!count($nums))  return 0;
    $l=0;
    $r = count($nums)-1;
    while ($l <= $r){
        $middle = $l + (($r - $l) >> 1);
        if ($nums[$middle] == $target) return $middle;
        if ($nums[$middle] < $target){
            $l = $middle+1;
        }else{
            $r = $middle-1;
        }    
    }
    return $l;
}

典型的可使用二分,时间复杂度 O(log2n)。空间复杂度O(1)。

网络

一、传输层主要有哪些协议?

答:主要有 TCP 和 UDP 协议。他们的区别是 TCP 是须要链接的 会通过三次握手,并且能够保证消息的可靠性。UDP 是不须要链接的,不保证消息的可靠性。

二、你能大致说说 TCP 的三次握手吗?

答:首先服务器监听某个端口,客户端发起请求 携带syn数据包(第一次),服务端接收到这个数据包,返回 syn/ack 的数据包给客户端(第二次),最后客户端再次发送一个 ack 的数据包(第三次)。

三、为何须要三次握手?

答:主要是为了确认双方接收是否正常。

第一次:客户端什么都不能确认。服务端能确认客户端的发送正常,本身的接收正常

第二次:客户端能确认本身的发送和接收正常,服务端的发送和接收正常。服务端能确认本身接收正常,客户端的发送正常。

第三次:所有都能确认了。

并发

假设如今有多个入口能够同时使用一个帐户操做,这个帐户只有十块钱,有哪些方法可使得不超扣消费?开放性题目,只要能解决问题的就是好方案,没有惟一答案。

答:mysql:能够直接 where amount>=current_amount and amount>0 …… , 或者悲观锁 for update。redis:lua 脚本。php 层面能够利用文件锁,还可使用队列的特性,只有一个消费的出口。

设计

若是咱们公司有不少项目都有登陆的功能,咋么设计?

答:须要把这个登陆单独抽出来做为一个模块开发,相似于登陆中心,全部的其余子系统登陆都须要从这个系统中认证。

其余

一、看你项目里说到使用过swoole,也写点go,你能够说说他们协程上的区别吗?

答:设计上他们是同样的,主要区别在于,协程调度器模式。swoole 的协程调度器是单线程,go 的协程调度器是多线程。这就意味着,同一时刻 swoole 只有一个协程在运行,而 go 同一时刻能够多个协程在运行。因此在 swoole 协程中不须要对全局变量进行加锁。并且 swoole 本质是单线程多进程的,意味着它没有超全局的变量,仅仅是进程级别变量。而 go 多线程,多线程必然会存在临界变量锁的问题。固然,go 也提供了开箱即用的 sync 读写锁,或者你也能够直接使用通道来代替。

二、你能够说说 go 的 gmp 调度模型吗?

答:巴拉巴拉半天,本身都以为没说清楚,好吧,我不是很了解。此时猜想面试官内心,早说不知道不就完事了吗

三、说说大家这个项目最难的点是哪一个地方,你是咋么解决的?

那就要看你本身对项目的掌握程度以及这个项目的含金量了。

点关注,不迷路

好了各位,以上就是这篇文章的所有内容了,能看到这里的人呀,都是人才。以前说过,PHP方面的技术点不少,也是由于太多了,实在是写不过来,写过来了你们也不会看的太多,因此我这里把它整理成了PDF和文档,若是有须要的能够

点击进入暗号: PHP+「平台」

在这里插入图片描述

在这里插入图片描述


更多学习内容能够访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)

以上内容但愿帮助到你们,不少PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提高,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货须要的能够免费分享给你们,须要的能够加入个人 PHP技术交流群

相关文章
相关标签/搜索