php面试总结

2 篇文章 0 订阅
1 篇文章 0 订阅

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 社区

请求流程 · ThinkPHP6.0完全开发手册 · 看云

问:类的自动加载怎么实现?

答:使用 __autoload()方法和spl_autoload_register 函数

function __autoload( $class ) { 
    $file = $class . '.class.php'; 
    if ( is_file($file) ) { 
        require_once($file); 
    } 
}
  1. 根据类名确定类文件名;
  2. 确定类文件所在的磁盘路径;
  3. 将类从磁盘文件中加载到系统中。

问: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、内存、硬盘)

解决方案

  1. 半同步复制,主库执行完事务,先同步给从库,再返回给客户端。
  2. 主库配置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

仅供参考答案不一定正确。最好还是自己动手搜索一下答案。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值