中级PHP开发面试经验及问题总结
标签 : 中级 PHP 面试
对于互联网的从业人员来说,每年的3,4月份可以说是一个跳槽的黄金时期,也因此业内有金三银四的说法。本人在上一家公司工作三年之后也渐渐按耐不住激动的心情选择了跳槽。在经过了半个多月的面试之后,对于目前市场上对于 3 年左右的程序员的的一个技能需求大概有了了解,对于个人的短板也有了一个更加全面的认识。今天我把最近一段时间面试中遇到的一些问题和考察的技能点总结下来,以供大家参考。也希望无论是否正在求职的程序员都能有个对照,如果你 3 年经验如果对于下面的问题大部分还不了解的话,那就需要有危机感了。
总的来说,3 年经验的程序员面试一般还是以技术考察为主,基础和架构都会涉及,问题也会相对深入。一般面试官会根据你在上一家工作的经历以及你上一家公司的技术情况(业务规模,PV,数据量、并发量)对你的技术有个大概的了解,然后结合你的实际项目进行考察。考察的主要有数据库、系统、网络、架构、前端、算法、面向对象和设计模式等这些方面,数据库索引优化、高并发场景、Redis的使用几乎是每家面试的,在 Linux 系统下操作日志、文件的方法大部分公司也会考察。
下面我将分门别类列出面试中遇到的一些问题,在每个问题后面并以 * 标识每个问题问到的频率和重要性(最高为 5 ),希望能给大家面试准备和技术学习提供一个方向
数据库
数据库基本是每家面试考察的重点,主要方向是 Mysql 索引及优化,基本每家面试都会问到
Mysql 索引及其优化
Mysql 索引及其优化几乎是每家面试都需要问的问题,重点考察的是 Mysql 联合索引的最左原则,这点必须要掌握
- Mysql 的索引有哪些 (* * * * *)
- Mysql 联合索引的数据结构,为什么要用这个数据结构,有什么优点(* * * *)
- Mysql 联合联合索引的最左原则,以及如何根据查询情况和字段数据分布确定联合索引的顺序 (* * * * *)
- 如何使用 Explain 语句分析 Sql 查询情况(如何看查询用了是否用了索引,用了哪些索引)(* * *)
- Sql 语句在 Mysql 里面执行过程(* * *)
参考资料
- 索引基础——B-Tree、B+Tree、红黑树、B*Tree数据结构
- Mysql索引优化
- 细说MySQL索引
- mysql性能优化之索引优化
- MySQL架构设计——MyISAM存储引擎与InnoDB存储引擎
- Mysql explain执行计划详解
- MySQL Explain详解
Mysql 存储引擎
Mysql 存储引擎也是面试官喜欢问的一个问题,主要问题如下
- 你只知道的 Mysql 的存储引擎有哪些(* * * *)
- MyIsam 和 InnDB 有什么区别(* * * *)
参考资料
Mysql 事务和锁
Mysql 事务和锁这类问题也有公司会问到,问到的不多,不过也会有
- Mysql 事务隔离的四个级别是什么(* *)
- 悲观锁和乐观锁、共享锁和独占锁有什么区别(* *)
参考资料
其他
也有不少公司会让你根据数据表写查询语句,知识点的话有 having 和 where 的区别以及 case when 的用法。还有就是一些实际的复杂业务场景了。
网络
网络的一些知识大部分公司也会考,由于这方面实在是短板,吃了不少亏,主要有如下问题。
- 301、302、304、305、307、401、403、404、408、500、501、502、503 等 http 状态码的含义 (* * *)
- http 协议和 https 协议的区别是什么 (* *)
- PHP 上传文件的原理和过程(* * * *)
- 用户在浏览网页时,主要经历的一个过程有哪些(* * *)
- Ngnix 如何和 PHP 进行通信,使用 php-fpm 和 Socket 有什么区别,哪个性能高(* *)
- tcp/ip协议的三次握手过程(*)
操作系统
操作系统方面主要考察在 Linux 系统下对日志文件的管理和如何查看系统的负载和运行状况。在日志文件管理方面主要是 awk、sort、grep 等命令的使用
- 有一个用户访问的日志文件,如果从中取出用户访问 ip 并排序(* * * *)
- 如何不打开文件查看文件的行数 (* * *)
- 如何查看系统的磁盘、网络等情况(* *)
架构
架构也是公司面试考察的一个重点方向,主要是提供一个业务场景,让你设计架构方案
- 分布式系统的 CAP 理论是什么,Paxos 协议解决的是什么问题,Zookeeper 是否使用过(*)
- 如果让你设计一个秒杀系统,你会怎么设计保证系统能够高并发的流量以及库存不超卖。(* * * * *)
- 针对你的秒杀系统,假设有 5000W 的 UV,你要如何分配你的 Web 服务器、数据库服务器、Redis 服务器。(*)
- 有一个系统响应比较慢,你要如何确定性能瓶颈并优化(* * *)
参考资料
Redis
Redis 也是面试官非常喜欢问的一个问题,主要是考察 Redis 的一些基本知识以及应用场景
- Redis 的五种数据类型有哪些(* * *)
- Redis 里面 list 的最大长度是多少(*)
- Redis 的事务和发布订阅相关知识(*)
- Redis 原子计数器的实现原理是什么(*)
- 如何使用 Redis 实现分布式锁(*)
- 你的项目中都哪些业务场景用到了Redis(* * * * *)
前端问题
一般面试 PHP 程序员并不会怎么问前端问题,不过也会有一些公司问到,这时候你如果完全懵逼当然是不太好的,下面是我再面试中遇到的一些前端问题。
- 什么是跨域问题,如何解决(* *)
- JSONP 的实现原理(*)
参考资料
面向对象和设计模式
面向对象方面的一些知识也会问到,不过问的不多,主要有一下问题
- 面向对象的三大特性有哪些(*)
- 多态和重载的区别是什么(* *)
设计模式方面考察的并不是特别多,主要是在笔试的时候实现一个单例模式,展开的话会问几个工厂模式的区别和用法,或者问你工作总用到的设计模式
PHP 的基本知识
面试 PHP 程序员通常也会有 PHP 相关知识的考察,主要有以下几个方面的问题
- 是否阅读过 PHP 源码,能否写 PHP 扩展,PHP 的架构是什么(*)
- PHP 的垃圾回收机制是什么(* * *)
- 对于字符串和数字的比较,PHP 的比较过程是什么(* *)
- empty,== 等一些语法细节(* *)
- PHP 都有哪些魔术方法(* * *)
算法
算法方面除了让你手写二分法查找多一些之外,很少会考察课本的基本算法了,但如果你作死把话题往这边引的话,面试官是不介意考你一下的,不过也主要是那几个常用的排序算法。不放心的话可以把二分法查找的排序算法复习一下。
不考课本上的算法,面试官一般会结合实际业务中的问题,让你设计算法解决并手写代码实现,主要考察你解决问题的思路和编码能力。
- 有一个日志文件,记录了用户访问的 ip 和时间,如何设计算法找出在 10 分钟内访问超过 500 次的 ip (* * *)
- 有一个 n 维的全是整数的数组,取值为 [0, n-1),设计算法取出数组里面的一个重复元素,要求时间复杂度 O(n),空间复杂度 O(1) (*)
- 设计一个类似 beyond compare 的字符串比较功能的算法(*)
其他
除了以上知识点外,还有以下相关的一些知识会问到
- Session 和 Cookie 的区别(* * *)
- Ngnix 的架构是什么,配置文件的载入过程是什么(*)
- 什么是对称加密和非对称加密,各有哪些算法(*)
- Unicode 什么,Utf-8 和 Utf-32 以及 GBK 编码的区别(*)
- 在支付过程中,有哪些策略保证数据安全性,防止数据被篡改(*)
- 设计一个权限管理系统,你要如设计表结构(*)
通过以上总结我们可以知道,对于中级 PHP 程序员的面试,数据库、系统、网络、架构是面试的一个重点方向,架构主要针对高并发、大量数据处理,系统主要是性能分析和日志操作。面试官在面试时也会主要根据你的工作经验及简历做相应的提问。希望这篇文章能大家以后的技术学习及面试准备提供一个参考。