2019年面试题总结

一、session和cookie区别

1. 存放位置:Session 保存在服务器,Cookie 保存在客户端。

2. 存放的形式:Session 是以对象的形式保存在服务器,Cookie 以字符串的形式保存在客户端。

3. 用途:Cookies 适合做保存用户的个人设置,爱好等,Session 适合做客户的身份验证

4. 路径:Session 不能区分路径,同一个用户在访问一个网站期间,所有的 Session 在任何一个地方都可以访问到。而 Cookie 中如果设置了路径参数,那么同一个网站中不同路径下的 Cookie 互相是访问不到的。

5. 安全性:Cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session

6. 大小以及数量限制:每个域名所包含的 cookie 数:IE7/8,FireFox:50 个,Opera30 个; Cookie 总大小:Firefox 和 Safari 允许 cookie 多达 4097 个字节,Opera 允许 cookie 多达 4096 个字 节,InternetExplorer 允许 cookie 多达 4095 个字节;一般认为 Session 没有大小和数量限制。

 

二、并发量

qps:每秒请求或查询数量

pv:综合浏览量

qps=(总pv数*80%)/(6小时秒数*20%)

 

三、spl函数

spl_autoload、spl_autoload_register、spl_autoload_extensions 、spl_autoload_functions 

 

四、同步请求和异步请求的区别

1、同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;

2、异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。

 

五、oop特性

封装、继承、多态

 

六、git和svn的区别

1、Git是分布式的,而SVN不是分布式的

2、Git把内容按元数据方式存储,而SVN是按文件

3、Git没有一个全局版本号,SVN有,目前为止这是SVN相比Git缺少的最大的一个特征

 

七、rabbitmq的队列执行过程或通讯过程

假设P1和C1注册了相同的Broker,Exchange和Queue。P1发送的消息最终会被C1消费。基本的通信流程大概如下所示:

  1. P1生产消息,发送给服务器端的Exchange
  2. Exchange收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1
  3. Queue1收到消息,将消息发送给订阅者C1
  4. C1收到消息,发送ACK给队列确认收到消息
  5. Queue1收到ACK,删除队列中缓存的此条消息

Consumer收到消息时需要显式的向rabbit broker发送basic.ack消息或者consumer订阅消息时设置auto_ack参数为true。在通信过程中,队列对ACK的处理有以下几种情况:

  1. 如果consumer接收了消息,发送ack,rabbitmq会删除队列中这个消息,发送另一条消息给consumer。
  2. 如果cosumer接受了消息, 但在发送ack之前断开连接,rabbitmq会认为这条消息没有被deliver,在consumer在次连接的时候,这条消息会被redeliver。
  3. 如果consumer接受了消息,但是程序中有bug,忘记了ack,rabbitmq不会重复发送消息。
  4. rabbitmq2.0.0和之后的版本支持consumer reject某条(类)消息,可以通过设置requeue参数中的reject为true达到目地,那么rabbitmq将会把消息发送给下一个注册的consumer。

 

大致流程:

消息的生产者(Producer)与rabbitmq server建立连接,并创建通道(channel);然后把消息传送至rabbitmq server上指定的Exchange中的queue里存放着;当有消息的消费者(Consumer)监听了这个queue时,就会接收该消息。

https://www.cnblogs.com/ysocean/p/9240877.html

 

八、rabbitmq处理异常的情况,比如邮件发送失败

1.自动重发

2.系统预警人工处理

 

九、如何防sql注入

1、pdo预处理

2、自定义方法,关键字过滤

select|insert|and|or|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile

 

https://blog.csdn.net/weixin_38281213/article/details/84315451

 

十、mysql锁机制及应用场景

https://www.cnblogs.com/Essaycode/p/10162010.html

 

十一、接口安全和防刷机制

用redis计数器防刷

INCR key

将 key 中储存的数字值增一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。

https://www.cnblogs.com/yaozhengqi/p/7825343.html

 

十二、索引失效情况

1、条件包含or ,新版mysql支持命中

2、like查询是以%开头,索引不会命中

3、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

4、没有查询条件,或者查询条件没有建立索引

5、查询条件中,在索引列上使用函数

6、采用 not in, not exist

7、联合索引遵循最左原则,不满足的不会命中

8、负向条件查询不能使用索引,可以优化为 in 查询。负向条件有:!=、<>、not in、not exists、not like 等

 

十三、缓存雪崩、缓存击穿和缓存穿透

缓存雪崩:同一批过期时间的缓存数据突然过期,且高并发的访问这批数据,会导致DB崩溃

缓存击穿:某个缓存到了过期时,出现高并发的访问时,db崩溃

缓存穿透:通过不存在的key去查缓存,缓存查找不存在,则去db查找,db返回null,实际就是DB承受了没有必要的查询流量

 

十四、水平分表查询问题

1、Mysql MERGE 引擎

2、Mysql 表分区,5.1 版本后才支持

3、union

4、按 搜索字段 建简单的冗余表/缓存进行查询

 

十五、tp3和tp5的区别

https://blog.csdn.net/qq_41846563/article/details/81234036

 

十六、top的替代命令

htop、vtop

 

十七、php7和php5的区别

1、性能提升:PHP7比PHP5.0性能提升了两倍。

2、全面一致的64位支持。

3、以前的许多致命错误,现在改成抛出异常。

4、PHP 7.0比PHP5.0移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展。

5、PHP 7.0比PHP5.0新增了空接合操作符。

6、PHP 7.0比PHP5.0新增加了结合比较运算符。

7、PHP 7.0比PHP5.0新增加了函数的返回类型声明。

8、PHP 7.0比PHP5.0新增加了标量类型声明。

9、PHP 7.0比PHP5.0新增加匿名类。

 

十八、rdb和aof的区别

aof是持续的用日志记录写操作,crash后利用日志恢复;

rdb是平时写操作的时候不触发写,只有手动提交save命令,或者是关闭命令时,才触发备份操作。

 

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

 

AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

 

十九、如何设置错误级别

error_reporting 

 

二十、如何捕捉错误

set_error_handler('errorHandler');

/**  * @param int    $err_no      错误代码  * @param string $err_msg  错误信息  * @param string $err_file    错误文件  * @param int    $err_line     错误行号  * @return string  */ function errorHandler($err_no = 0, $err_msg = '', $err_file = '', $err_line = 0) {     $log = [         '['.date('Y-m-d h-i-s').']',         '|',         $err_no,         '|',         $err_msg,         '|',         $err_file,         '|',         $err_line     ];     $log_path = './test.txt';     error_log(implode(' ',$log)."\r\n",3, $log_path); }

 

二十一、为什么 PHP7 比 PHP5 性能提升了?

1、变量存储字节减小,减少内存占用,提升变量操作速度

2、改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率

3、改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率

 

二十二、http错误代码

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

1xx:指示信息 -- 表示请求已接收,继续处理

2xx:成功 -- 表示请求已被成功接收、理解、接受

3xx:重定向 -- 要完成请求必须进行更进一步的操作

4xx:客户端错误 -- 请求有语法错误或请求无法实现

5xx:服务器端错误 -- 服务器未能实现合法的请求

常见状态代码、状态描述、说明:

200 OK // 客户端请求成功

400 Bad Request // 客户端请求有语法错误,不能被服务器所理解

401 Unauthorized // 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用

403 Forbidden // 服务器收到请求,但是拒绝提供服务

404 Not Found // 请求资源不存在,eg:输入了错误的 URL

500 Internal Server Error // 服务器发生不可预期的错误

503 Server Unavailable // 服务器超时 // 可能恢复正常

304 Not Modifed // 自从上次请求后,请求的网页未修改过

 

二十三、int10和int11的区别

这里是显示长度,跟存储长度无关

 

二十四、文件锁

flock、排他锁

 

二十六、高并发,大流量处理及解决方法

1、确认服务器硬件是否足够支持当前的流量。

2、优化数据库访问

3、禁止外部的盗链

4、控制大文件的下载

5、使用不同主机分流主要流量 

6、使用流量分析统计软件

 

二十七、事务隔离

https://www.cnblogs.com/huanongying/p/7021555.html

 

二十八、建表原则

3NF,第三范式原则

https://blog.csdn.net/CharlesYooSky/article/details/89204229

 

二十九、索引的数据结构

https://blog.csdn.net/wufuhuai/article/details/79631466

 

三十、最优无限分类

https://blog.csdn.net/sunnyxuebuhui/article/details/53538716

 

三十一、主从数据库延迟

 

三十二、设计表时要注意:

1、表字段避免null值出现,null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null。

2、尽量使用INT而非BIGINT,如果非负则加上UNSIGNED(这样数值容量会扩大一倍),当然能使用TINYINT、SMALLINT、MEDIUM_INT更好。

3、使用枚举或整数代替字符串类型

4、尽量使用TIMESTAMP而非DATETIME

5、单表不要有太多字段,建议在20以内

6、用整型来存IP

 

三十三、MySQL单表数据量过千万,采坑优化记录,完美解决方案

https://blog.csdn.net/yongtaoli/article/details/88687527

 

三十四、禁用cookie后session是否还能用?

参考链接 :https://blog.csdn.net/baochao95/article/details/72884803

禁用cookie后,session还是可以使用的。禁用cookie后,服务器每次session_start的时候都会创建一个单独的session文件,后果就是无法让多个页面共享同一份session。

可以url重定向方法解决这个问题,在session_start();前设置session_id

 

三十五、php-fpm工作原理

FPM是一个PHP进程管理器,包含master和worker两种进程

master进程只有一个,负责监听端口,接收来自服务器的请求,而worker进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个PHP解释器,是PHP代码真正执行的地方。

从FPM接收到请求,到处理完毕,其具体的流程如下

1).FPM的master进程接收到请求。

2).master进程根据配置指派特定的worker进程进行请求处理,如果没有可用进程,返回错误,这也是我们配合Nginx遇到502错误比较多的原因。

3).worker进程处理请求,如果超时,返回504错误。

4).请求处理结束,返回结果。

 

三十六、导致502错误的原因有哪些,怎么解决

原因:php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉

解决方案:

1、查看当前的PHP FastCGI进程数是否够用

2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间。

 

三十七、http请求报文格式和响应报文格式

https://www.cnblogs.com/CodingUniversal/p/7524088.html

HTTP 请求报文

HTTP 请求报文由请求行、请求头部、空行 和 请求包体 4 个部分组成

典型的请求头有:

  ● User-Agent:产生请求的浏览器类型;

  ● Accept:客户端可识别的响应内容类型列表;星号 “ * ” 用于按范围将类型分组,用 “ */* ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型;

  ● Accept-Language:客户端可接受的自然语言;

  ● Accept-Encoding:客户端可接受的编码压缩格式;

  ● Accept-Charset:可接受的应答的字符集;

  ● Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机;

  ● connection:连接方式(close 或 keepalive);

  ● Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie;

HTTP 响应报文

HTTP 响应报文由状态行、响应头部、空行 和 响应包体 4 个部分组成

 

支付异常情况

 

socket的了解

https://www.jianshu.com/p/850da820357c

 

解决高并发的方案

https://www.cnblogs.com/walblog/articles/8476579.html

 

mysql 索引原理

https://blog.csdn.net/u013967628/article/details/84305511

 

sql case when用法

select count(id), (case

when Req.id <= 100 then 100

when Req.id > 100 and Req.id < 200 then 200

when Req.id > 100 then 300

end

) 级别 from ocs_reqs Req group by 级别 limit 10

 

快速排序

https://www.cnblogs.com/chenhaoyu/p/9093483.html

冒泡排序

 

// 2019年小米春季上海 PHP 实习生招聘面试题

https://learnku.com/articles/21993

 

// 基础面试题

https://learnku.com/articles/24140

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值