2022.11.25 因某些原因又离职了。工作一直很忙,没有太多时间更新博客。新学的很多知识,也只是简单的写在了笔记本上。后续有空,还是要腾到博客上来。
以前面试前,都不会去看这些知识点,工作这么久之后,发现工作上的问题自己也能解决,但是就是当初面试时没有回答好,没有要到更高的工资,所以今天下定决心要看一下面试的这些东西。
因为我也没当过面试官,所以要看哪些内容,也是网上找的。此文章是根据下面的视频来的。
程序员php常见面试题,面试汇总。会这些基本初步应聘没问题。_哔哩哔哩_bilibili
注:以下对于问题的回答,都是我自己用语言润色了的,以增加记忆,以增强理解,所以理解不同的地方,或者有错误的地方,可以友好的提出来。
正文:
一. 基本能力
问: isset 与 empty 区别
答:isset,是否设置,只要设置了,不管是啥,都返回true,除了NULL类型。
(其他知识点:NULL 类型只有一个值,就是不区分大小写的常量 NULL)
比如:整数0,布尔值false,浮点数0.0,字符串"0",空字符串"",空数组array(),用isset判断都返回true,只有NULL 返回false。
empty():是否为空。不存在,即为空。动态编程语言认为的空,也为空。
比如:未声明的变量$a,整数0,布尔值false,浮点数0.0,字符串"0",空字符串"",空数组arraye(),null,都返回false
问:error_repoting 有什么作用
答:error_reporting() 函数规定报告哪个错误。
该函数设置当前脚本的错误报告级别,该函数返回旧的错误报告级别。
作用 :
1. 禁用报错报告;error_reporting(0);
2. 报告运行时错误 error_reporting(E_ERROR | E_WARNING | E_PARSE);
3. 报告所有错误 error_reporting(E_ALL);
问: include 和 requset 区别
答:require一个文件存在错误的话,那么程序就会中断执行了,并显示致命错误。一般放在文件的最前面。include一个文件存在错误的话,那么程序不会中端,而是继续执行,并显示一个警告错误。一般放在中间部分。include有返回值,而require没有。
实际工作中,一般就直接在文件开头就用require引入就行,清晰明了。
问:转义用户输入的特殊宇符有哪些函数
答:
1、addslashes() 函数返回在预定义的字符前添加反斜杠的字符串。预定义字符是:
- 单引号(')
- 双引号(")
- 反斜杠(\)
- NULL
2、mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符
3、htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。 预定义的字符是:
- & (和号)成为 &
- " (双引号)成为 "
- ' (单引号)成为 '
- < (小于)成为
- > (大于)成为 >
其他:通过表单或 URL 传递值时需要哪种类型的操作?
通过表单或 URL 传递值,则需要使用 htmlspecialchars() 和 urlencode() 对它们进行编码和解码。
问:什么是面向对象,主要特征是什么?
答:面向对象就是要搞清楚自己有什么,以及自己改做什么。有什么,就是对象的属性,做什么,就是对象的行为。面向对象编程就是将分析和设计的的结果翻译成代码的过程。
主要特征:封装、继承、多态
目的:面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。
问:静态调用和实例调用区别
答:静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。
问:什么是类?有哪些特征
答:具有相同的属性(数据元素)和行为(功能)的对象的抽象就是类
二. 框架
问:框架的生命周期
答:自己理解:进入index.php->自动加载机制->读取全局配置->检查路由->执行->输出->记录日志
正确的答案在框架的文档上是有的,指路:
请求周期 | 核心架构 |《Laravel 8 中文文档 8.5》| Laravel China 社区
问:类的自动加载怎么实现?
答:使用 __autoload()方法和spl_autoload_register 函数
function __autoload( $class ) {
$file = $class . '.class.php';
if ( is_file($file) ) {
require_once($file);
}
}
- 根据类名确定类文件名;
- 确定类文件所在的磁盘路径;
- 将类从磁盘文件中加载到系统中。
问:composer的功能和实现
功能:管理php依赖
composer的自动加载实现:执行copmoser命令,生成json和lock文件。每个类写好一个 autoload 函数,并且注册到 spl_autoload_register()里。(很粗略,强烈建议看这篇文章:解析composer的自动加载原理-composer-PHP中文网)
问:路由实现
答:使用rote类,根据文档定义就行
问:框架的优点、特性
答:tp 使用起来方便、上手难度低,tp6把自己的内核封装成依赖包,更像面向对象。
laravel比较优雅。有些地方比较苛刻,注重代码的质量、性能。有一定的上手难度。
个人更喜欢tp,因为资料文档更多一点。把laravel的编程思维用在tp框架里面,就是最好的方法。
问:包含文件怎么去实现?
答:require,include?
问: 什么是mvc
答:模型-视图-控制器
问:依赖注入
答:就是使用一个类,但是这个类需要另外一个类才能实现。依赖关系,注入操作。
PHP的依赖注入(DI)和控制反转(IoC),控制反转(IOC)是一种思想,依赖注入(DI)是实施这种思想的方法。
目的:使用依赖注入,最重要的一点好处就是有效的分离了对象和它所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
在使用的地方,才建立两个类的关系。如果是内部new,就强行绑定了类与类的关系了。
问:模板引擎的原理:
答:替换,把规定的格式的符号,替换为php代码。现在都是前后端分离了,都是通过接口通信了,模板引擎将会成为过去式。
三 mysql 问题
问:myisam和innodb
答:innodb 有事务,有行锁。myisam,无事务,运行更快,表锁
问:mysql行锁和表锁,区别
答:myisam表锁:不会出现死锁,发生锁冲突几率高,并发低。
innodb 行锁:会出现死锁,发生锁冲突几率低,并发高。
问:mysql的优化手段(重点,问mysql必问此问题,建议观看,看着比较简介舒服:MySQL查询常见优化方式_GodOfCode_的博客-CSDN博客_mysql查询优化的几种方法)
加索引、避免select *,小表驱动大表,limit,批量操作-避免循环单词操作,join不已太多-有时候如果只是需要使用到另一张表里面的某一两个字段,则可以通过在表里面增加冗余字段来降低表的关联。避免索引失效,尽量少使用函数计算。最左原则
问:平时排查优化
答:Trace调试,查看SQL日志,调试执行的SQL语句
问:哪些情况索引失效。MySQL查询常见优化方式_GodOfCode_的博客-CSDN博客_mysql查询优化的几种方法
最左原则,like左边有%,select*,索引列上有计算,索引列上有函数,字符类型没加上引号。索引是数字字符串,需要加上引号,才会走。反过来,索引是数字,加上引号也会走。or查询。
问:binlog日志
答:事务回滚,从表同步。备份
问:怎么搭建主从复制数据库
答:开启日志,修改唯一标识。主表:加全局锁,备份,导出备份,查看binlog日志的位置,记下此位置,解除全局锁。从表:直接加载备份数据,设置同步参数,开启同步,查看是否成功。over。
建议观看并实际跟着操作一遍:mysql- 主从复制的搭建过程_hgswnsa的博客-CSDN博客_mysql主从复制搭建流程
问:数据库同步延迟的分析
答:
造成延迟的原因:
1、Master负载 主库负载 2、Slave负载 从库负载 3、网络延迟 4、机器配置 (cpu、内存、硬盘)
解决方案
- 半同步复制,主库执行完事务,先同步给从库,再返回给客户端。
- 主库配置sync_binlog=1,innodb_flush_log_at_trx_commit=1 修改配置
sync_binlog的默认值是0,MySQL不会将binlog同步到磁盘,其值表示每写多少binlog同步一次磁盘。
innodb_flush_log_at_trx_commit为1表示每一次事务提交或事务外的指令都需要把日志flush到磁盘。
注意:将以上两个值同时设置为1时,写入性能会受到一定限制,只有对数据安全性要求很高的场景才建议使用,比如涉及到钱的订单支付业务,而且系统I/O能力必须可以支撑!
3、直接禁用slave端的binlog
问:主从复制怎么同步?推还是拉?不同步的情况怎么处理?
答:推,主表有变化,就推,拉的话消耗资源更多。
会,具体问题就具体分析了。查看下服务器的io,查看mysql 配置: save-net-timeout 链接超时,重连时间,重连次数
问:数据库恢复分钟级别
答:备份,使用备份工具备份,设置备份中间间隔
四 nosql
问: 有哪些nosql,以及使用场景
redis,MongoDB,MemcacheDB
使用场景:搜索,直播热度,点赞,投票,埋点统计,广告推荐,
问:Memcache和redis区别
memcache还可用于缓存其他东西,例片、视频等等。reids只有key-value
memcache 只支持简单数据类型,reids有5种
多线程:memcache支持多线程,Redis支持单线程
持久化:Redis支持持久化,memcache不支持持久化
分布式:Redis做主从结构,memcache服务器需要通过hash一致化来支撑主从结构
问: redis持久化哪些方式 - 网上一大堆资料,随便搜,都有此问题的答案。
一种是RDB持久化(原理是将Reids在内存中的数据库记录,定时dump到磁盘上的RDB持久化)。另外一种是AOF持久化(原理是将Reids的操作日志以追加的方式写入文件)
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
rdb优势:
备份,恢复简单,性能最大化,不影响redis正常性能,数据大的话,效率更高。
rdb劣势:
不准确,在时间间隔内,未写入文件的数据将丢失
数据过大,执行备份时,性能不佳
aof优势:
数据更可靠,保证了数据库的持续性。异步执行,数据丢失,基本不超过一秒。所以影响性能
写入是append模式,添加模式,不是上面的覆盖。所以已存在的数据没有影响
rewrite机制,新建文件写入。太大文件直接存在磁盘中。
格式清晰、易于理解的日志,知道整个数据的来龙去脉。可以进行数据的重建。
aof劣势:
文件会更大,
回复更慢
影响性能
问:缓存穿透、缓存击穿、缓存雪崩,是什么?又怎么处理?
建议观看此文章:缓存穿透、缓存击穿和缓存雪崩!(保姆级) - 哔哩哔哩
五 系统问题
问:数据加密,数据接口的加密原理、实现方式、和理解
原理就是:把明文通过一定算法,变成密文,在数据的传输中起到保密作用。
实现方式:对称加密,非对称加密,md5加密
对称式加密:对加密和解密使用的是同一个密钥 例: aes、base64
非对称式加密:非对称式加密需要两个密钥(双钥),分别叫公钥和秘钥,这两把秘钥可以互相加解密,公钥公开的,不需要保密,私钥是保密的 例: rsa
加密目的 1、防伪装攻击 2、防篡改攻击 3、防存放攻击 4、防数据泄漏
问: jwt 加密 rsa 加密: 建议观看:PHP使用jwt验证_end for time的博客-CSDN博客_php jwt
jwt加密:php一个包。composer引入, 调用方法,根据uid生成一个token。并存入redis中。
在app/Http/Middleware/下定义中间件JwtMiddleware.php :使用中间件进行token验证。方法,validate、verify。decode解析。
app\Http\Kernel.php中注册中间件
路由使用中间件
rsa 加密 :
生成公钥和私钥。
定义公钥,生成密文
定义私钥,解密
公钥加密,私钥解密。
问:nginx 与 Apache 区别
前端Nginx抗并发,后端apache集群 - 已经不分前后端啦。
Nginx轻量级,抗并发
Apache性能稳定,支持模块多,功能多
apache是同步多进程模型,一个连接对应一个进程;Nginx是异步的,多个连接(万级别)可以对应一个进程;
- 异步能力:Apache中也有异步模块,支持异步功能,不过是阻塞性异步,而Nginx是非阻塞性异步。
- 多并发:Nginx因为软件体积小,异步功能,所以消耗主机资源少,抗并发能力是Apache的3倍以上。
- 稳定性:Apache算是一款老牌的WEB服务软件,发展时间长,BUG少,比Nginx更值得信赖。
问:nginx 实现一个高并发 原理进行分析
- Nginx是异步,非阻塞master - 多个worker
负载均衡:配置
upstream
设置权重
反向代理:
location /msi/ {
client_max_body_size 1000m;
proxy_pass http://msi_main_c7.cn/;
}
proxy_pass
仅供参考答案不一定正确。最好还是自己动手搜索一下答案。