• php面试总结


    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 函数

    1. function __autoload( $class ) {
    2. $file = $class . '.class.php';
    3. if ( is_file($file) ) {
    4. require_once($file);
    5. }
    6. }
    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

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

  • 相关阅读:
    TS学习笔记 类型标签 联合类型 枚举类型 泛型 类型别名
    【数据结构】链表OJ特别篇 —— 面试情景带你深度剖析 环形链表系列问题 && 复制带随机指针的链表
    毕业设计JSP 2384网上diy蛋糕店管理系统【程序源码+讲解视频+调试运行】
    [附源码]Python计算机毕业设计SSM健身俱乐部管理系统(程序+LW)
    【Qt】 FFmpeg+Qt windows 32位或者64位环境搭建
    【算法设计实验三】动态规划解决01背包问题
    【Webpack】打包资源的名称路径和清空打包资源
    uniapp 使用subNVue原生子窗体显示弹框或悬浮框
    UE 导入DataTable中文乱码问题
    java基于springboot课堂教学效果评价系统ssm
  • 原文地址:https://blog.csdn.net/yqh845451078/article/details/112011642