关键词搜索

源码搜索 ×
×

2022最新:5千字有答案的后端面试题

发布2022-03-27浏览1792次

详情内容

上一篇文章介绍了我的上岸之旅:【求职复盘】我为什么又能面试一次就拿到offer,受到了大家的关注,也有不少小伙伴希望分享面试题。

今天这篇文章除了汇总后端通用的面试题外,还汇总了PHP岗位相关的面试题,Go和Java的小伙伴们不要着急,下一篇文章整理Go、Java相关的面试题。

关于金三银四跳槽想成功上岸,我再多唠叨一句,一定要科学的做好准备工作:

做好准备

关键点就是:

  1. 明确就业方向:要去什么样的公司,不要去什么样的公司;要做什么岗位,不要做什么岗位。
  2. 准备简历:不超过3页,第一页展示清楚自己的优势;什么是优势:傲人的学历,能解决别人解决不了问题的超能力,不需要别人督促的自驱力…
  3. 刷题:面试题、算法题、职业规划题、套路题等等
  4. 为面试时自己能够控场,提前做好准备,了解意向公司;预演面试:站在面试官的角度向自己提问

因为 [【求职复盘】我为什么又能面试一次就拿到offer] 这篇文章已经讲清楚了指导思想,强烈建议大家先看求职复盘,在刷下面的面试题,这样对大家帮助会更大。

4ac26cfa4624beb9622e4e04238a9cd1.jpeg

下面和我一起开始刷题,祝你早日上岸中意的工作。

PHP 8 新特性

PHP 8.0.0 已经正式发布了,这个对于 PHPer 无疑是一个令人振奋的消息。它包含了很多新功能与优化项, 包括命名参数、联合类型、注解、构造器属性提升、match 表达式、nullsafe 运算符、JIT,并改进了类型系统、错误处理、语法一致性。

最人性化的特性:命名参数、联合类型、mixed 类型

这几个新特性让 PHP 在强类型方面进一步完善,而且对 PHPDoc 的注释依赖越来越弱,代码即文档的好处是开发者最头疼的事情终于有办法可以偷懒了。

Laravel 9 新特性

  • 使用 PHP v8.0
  • 控制器路由组
  • 新的默认 Ignition 错误页面
  • Laravel Scout 数据库引擎
  • 集成 Symfony Mailer、
  • Flysystem 3.x
  • 改进的 Eloquent 访问器/修改器

TCP协议和UDP协议的对比?

TCP协议的优点:

  1. 可靠稳定
  2. TCP在传输数据之前,会有三次握手来建立连接
  3. TCP在传输数据时,有确认、窗口、重传、拥塞控制机制
  4. TCP在传输数据完成后,会断开连接用来节省系统资源

TCP协议的缺点:

  1. 慢,传输效率低
  2. 占用系统资源高
  3. 容易被攻击(DOS/DDOS/CC攻击)

UDP协议的优点:

  1. 无连接的方式,占用系统资源少
  2. 比TCP安全

UDP协议的缺点:

  1. 不可靠,不稳定
  2. 没有可靠的机制,当网络条件不好时,容易丢包

各种攻击的名词解释

  1. DOS攻击:Denial of Service,即拒绝服务攻击,其目的是使计算机或网络无法提供正常的服务。
  • 常见的DOS攻击有
  • 计算机网络带宽攻击:以极大的通信量冲击网络,是所有可用的网络资源消耗殆尽,最终导致合法的用户请求也无法通过。
  • 连通性攻击:用大量的连接请求冲击计算机,使得所有可用的操作系统资源消耗殆尽,最终计算机无法处理正常用户的请求。
  1. DDOS攻击:Distributed Denial of Service,即分布式拒绝服务攻击,是在DOS攻击上发展而来的。因为个人黑客攻击者很难使用高带宽的资源,为了克服这个缺点,黑客们开发了分布式的攻击。
  • 攻击者简单工具,集合许多网络带宽同时对一个目标发动大量的攻击请求,这就是DDOS攻击。
  1. CC攻击:Challenge Collapsar Attack,挑战黑洞攻击,是DDoS攻击的一种类型
  • 使用代理服务器向受害服务器发送大量貌似合法的请求

阻塞调用和同步调用的区别?

  1. 首先说明一下,阻塞调用和同步调用是不同的
  2. 从底层来讲,同步调用的当前线程还是激活的,只是从逻辑上来讲没有返回而已。当前线程还可以处理其他各种各样的信息。
  3. 但是阻塞调用则不然,阻塞调用是说当前线程是阻塞不可用的状态,不仅没有返回。而且当前线程不可以处理其他信息。

关于同步异步I/O 和 阻塞非阻塞I/O 更深刻的理解

  1. 首先说明一下针对网络IO的操作,可以分为两个阶段,准备阶段和操作阶段
  • 准备阶段:判断能否进入准备阶段,即等待数据是否可用,这一阶段在内核进程中完成
  • 操作阶段:执行实际的IO调用,数据从内核缓冲区拷贝到用户进程缓冲区。
  1. 同步或者异步IO
  • 是指访问数据的机制,也就是实际IO操作的完成方式
  • 同步一般指主动发送请求并等待IO操作完毕的方式,IO操作未完成前,会导致应用程序挂起
  • 异步是指用户触发IO操作后就开始做自己的事情,当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知),这样可以使进程在数据读写时不阻塞。
  1. 阻塞或者不阻塞IO
  • 主要是指IO操作第一阶段的完成方式(内核缓冲区的数据未就绪),数据还没有准备好的时候,应用程序的表现,如果这里进程挂起,就是阻塞IO,否则是非阻塞IO。
  • 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取不同的方式。
  • 更简单点说:阻塞和非阻塞是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待;非阻塞方式下,读取或者写入函数会立即返回一个状态值。

http与https的区别?

  1. https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。 http的连接很简单,是无状态的;
  4. HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

session与cookie的对比?

  1. session数据存储在服务器,cookie数据存储在客户端浏览器上
  2. cookie不是很安全,我们可以查询伪造存储再客户端的cookie进行欺骗请求,考虑到安全应该使用session
  3. session会在一定时间内保存在服务器,当访问量增多时,会比较占用服务器性能,考虑到性能时可以使用cookie
  4. 单个cookie保存的数据不能超过4kb,很多浏览器会限制一个站点最多保存的cookie数
  5. cookie具有不可跨域名性
  6. 会话cookie和持久cookie:
  7. 会话cookie即不设置过期时间,会随着浏览器关闭就消失的cookie,一般存储在内存中;
  8. 持久cookie即设置了过期时间,即使关闭了浏览器也不会消失的cookie,一般存在硬盘中;再次打开浏览器仍然有效,直到达到过期时间。
  9. session共享:
  10. 对于多网站单服务器(同一父域名不同子域名)如何解决不同网站之间的SessionId共享问题?由于域名不同(a.test.com,b.test.com),而sessionId又分别存储再不同的cookie中,我们的思路就是改变cookie的存储范围到父域名,达到共享cookie的目的,从而实现SessionId的共享。
  11. 由此带来的弊端是子站之间的cookie信息也被共享了
  12. 比较好的实践是:把登录信息等敏感数据保存到session中,其他非敏感数据保存在cookie中

输入一个网址到浏览器渲染出页面的流程是什么?

  1. 在客户端浏览器中输入网址URL。
  2. 发送到DNS(域名服务器)获得域名对应的WEB服务器的IP地址。
  3. 客户端浏览器与WEB服务器建立TCP(传输控制协议)连接。
  4. 客户端浏览器向对应IP地址的WEB服务器发送相应的HTTP或HTTPS请求。
  5. WEB服务器响应请求,返回指定的URL数据或错误信息;如果设定重定向,则重定向到新的URL地址。
  6. 客户端浏览器下载数据,解析HTML源文件,解析的过程中实现对页面的排版,解析完成后,在浏览器中显示基础的页面。
  7. 分析页面中的超链接,显示在当前页面,重复以上过程直至没有超链接需要发送,完成页面的全部显示。

面向对象的特点?

OOP(面向对象)具有三大特点:

  1. 封装性:也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。于是开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,实现代码模块间松藕合。

  2. 继承性:就是子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。PHP只支持单继承,也就是说一个子类只能有一个父类。

  3. 多态性:子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。

合并两个数组有几种方式,试比较它们的异同

方式:

array_merge()

’+’

array_merge_recursive

异同:

array_merge 简单的合并数组

array_merge_recursive 合并两个数组,如果数组中有完全一样的数据,将它们递归合并

array_combine 和 ‘+’ :合并两个数组,前者的值作为新数组的键

提示

recursive递归的,循环的意思

PHP的垃圾收集机制

PHP可以自动进行内存管理,清除不再需要的对象。

PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。

每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

PHP传值与传引用的区别,什么时候传值什么时候传引用?

按值传递:函数范围内对值的任何改变在函数外部都会被忽略

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

MySQL数据库中的字段类型varchar和char的主要区别是什么?

Varchar是变长,节省存储空间,char是固定长度。

查找效率char更快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些。

静态化如何实现?伪静态如何实现?

静态化

  1. 静态化指的是页面静态化,也就是生成实实在在的静态文件,不需要查询数据库就可以直接从文件中获取数据,这就是静态化。静态化网站我们可以直接放到阿里云OSS这类云存储平台,不需要购买服务器部署。

  2. 静态化的实现方式主要有两种:一种是我们在添加信息入库的时候就生成的静态文件,也称为模板替换技术。一种是用户在访问我们的页面时先判断是否有对应的缓存文件存在,如果存在就读缓存,不存在就读数据库,同时生成缓存文件。

伪静态

伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。

伪静态的实现原理是基于Apache或Nginx的rewrite

主要有两种方式:

  1. 一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。
  2. 一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。

web项目如何处理负载,高并发?

  1. HTML静态化

效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。

静态文件直接放到OSS等云存储平台,同时配置CDN加速访问。

  1. 图片视频服务器分离

把图片、视频单独存储,尽量减少图片、视频等大流量的开销,可以放在一些相关的平台上,如七牛等

  1. 数据库集群和库表散列及缓存

数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。

  1. docker+k8s:

拥抱容器,拥抱K8S,目前云厂商都提供了K8S解决方案。我们可以站在巨人的肩膀上实现自己项目的弹性伸缩,动态扩缩容。 Kubernetes为什么会火?

说说对SQL语句优化有哪些方法

  1. Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。

  2. 用EXISTS替代IN、用NOT EXISTS替代NOT IN。

  3. 避免在索引列上使用计算

  4. 避免在索引列上使用IS NULL和IS NOT NULL

  5. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

  6. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

  7. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

Redis如何防止高并发

本质解析

本质上来说Redis是不会存在并发问题的,因为他是单进程的,再多的命令都是一个接一个地执行的。

但是我们在使用过程中确实会出现并发问题,这又是为什么呢?

原因

  1. Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对redis进行并发访问时会出现问题,比如发生:连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。

  2. 同时,单线程的天性决定,高并发对同一个键的操作会排队处理,如果并发量很大,可能造成后来的请求超时。在远程访问redis的时候,因为网络等原因造成高并发访问延迟返回的问题。

解决办法

  1. 在客户端将连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。

  2. 服务器角度,利用setnx变向实现锁机制。

华丽的分割线,技术题到此结束,下面是同样重要的套路题。

570f868b05f3d36ebd6073973b63369c.jpeg

职业技能规划、人事面试

  1. 未来准备往哪方面发展?
  • 精通/全干
  • 纯技术岗/管理岗
  1. 对于职业规划的个人见解
  • 入行的时候就有规划,目前基本也是按规划在迈进,巴拉巴拉xxx
  1. 为什么离职?
  • 个人职业规划原因
  • 公司原因
  • 通勤问题、一线城市买房问题、一线到二三线时的家乡情怀,巴拉巴拉xxx

其他

  1. 你未来一到三年的一个职业规划是什么?
  2. 你都是怎么去学习和关注新技术的?
  3. 你近几年工作中有哪些心得或总结?
  4. 你觉得你在工作中的优缺点是什么?
  5. 你过来我们公司,你的优势是什么?
  6. 有些过开源项目吗?
  7. 写过composer包吗,写过技术博客吗?有自己的GitHub吗?
  8. 看过哪些框架或者类库的源码,有什么收获?

下一篇

关注我,下一篇整理:Go求职面试经典面试题

最后

感谢阅读,欢迎大家三连:点赞、收藏、关注。
在这里插入图片描述

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载