PHP面试问答
结合实际PHP面试,汇总自己遇到的问题,以及网上其他人遇到的问题,尝试提供简洁准确的答案
网络、数据结构与算法、PHP、Web、MySQL、Redis、Linux、安全、设计模式、架构、面试等部分
本仓库将持续更新,fork 无法看到最新内容,建议 Watch 或 Star ~~
面试流程
微信群
扫码加微信,备注:PIQA
,有时候可能在忙,稍等片刻
问题列表
网络协议篇
- 计算机网络体系结构
- UDP 的主要特点
- TCP 的主要特点
- 简述三报文握手建立 TCP 连接
- 建立 TCP 连接为什么最后还要发送确认
- 简述 TCP 连接的释放
- TIME-WAIT 是什么,为什么必须等待 2MLS
- TCP 粘包问题
- UDP、TCP 区别,适用场景
- 建立 socket 需要哪些步骤
- DNS 主要作用是什么
- HTTP 报文组成
- HTTP 状态码
- 常见的 HTTP 方法
- HTTP 优缺点
- HTTPS 通信原理
- HTTP 2.0
- IPv6 与 IPv4 有什么变化
- 什么是心跳机制
- 什么是长连接
数据结构与算法篇
PHP 篇
- echo、print、print_r、var_dump 区别
- 单引号和双引号的区别
- isset 和 empty 的区别
- static、self、$this 的区别
- include、require、include_once、require_once 的区别
- 数组处理函数
- Cookie 和 Session
- 预定义变量
- 传值和传引用的区别
- 构造函数和析构函数
- 魔术方法
- public、protected、private、final 区别
- 客户端/服务端 IP 获取,了解代理透传 实际IP 的概念
- 类的静态调用和实例化调用
- PHP 不实例化调用方法
- php.ini 配置选项,ini_set 动态设置
- 如何返回一个301重定向
- PHP 与 MySQL 连接方式
- MySQL、MySQLi、PDO 区别
- MySQL 连接池
- 代码执行过程
- base64 编码原理
- ip2long 实现
- MVC 的理解
- 主流 PHP 框架特点
- 对象关系映射/ORM
Web 篇
- SEO 有哪些需要注意的
- img 标签的 title 和 alt 有什么区别
- CSS 选择器的分类
- CSS sprite 是什么,有什么优缺点
- display: none 与 visibility: hidden 的区别
- display: block 和 display: inline 的区别
- CSS 文件、style 标签、行内 style 属性优先级
- link 与 @import 的区别
- 盒子模型
- 容器包含若干浮动元素时如何清理(包含)浮动
- 如何水平居中一个元素
- 如何竖直居中一个元素
- flex 与 CSS 盒子模型有什么区别
- Position 属性
- PNG,GIF,JPG 的区别及如何选
- 为什么把 JavaScript 文件放在 Html 底部
- JavaScript 数据类型
- JavaScript 操作 DOM 的方法有哪些
- JavaScript 字符串方法有哪些
- JavaScript 字符串截取方法有哪些?有什么区别
- setTimeout 和 setInterval 的区别
- 使用 new 操作符实例化一个对象的具体步骤
- 如何实现 ajax 请求
- 同源策略是什么
- 如何解决跨域问题
- 引起内存泄漏的操作有哪些
- 闭包理解及应用
- 对 JavaScript 原型的理解
- 对 JavaScript 模块化的理解
- 如何判断网页中图片加载成功或者失败
- 如何实现懒加载
- JSONP 原理
- Cookie 读写
- 从浏览器地址栏输入 URL 到显示页面的步骤
- Vue.js 双向绑定原理
- 如何进行网站性能优化
- 渐进增强
MySQL 篇
- 体系结构
- 基础操作
- 数据库设计范式
- 数据库设计原则
- CHAR 和 VARCHAR 数据类型区别
- LEFT JOIN 、RIGHT JOIN、INNER JOIN
- UNION、UNION ALL
- 常用 MySQL 函数
- 锁
- 事务
- 常见存储引擎
- 常见索引
- 聚族索引与非聚族索引的区别
- BTree 与 BTree-/BTree+ 索引原理
- 分表数量级
- EXPLAIN 输出格式
- my.cnf 配置
- 慢查询
Redis 篇
- Redis 介绍
- Redis 特点
- Redis 支持哪些数据结构
- Redis 与 Memcache 区别
- 发布订阅
- 持久化策略
- Redis 事务
- 如何实现分布式锁
- Redis 过期策略及内存淘汰机制
- 为什么 Redis 是单线程的
- 如何利用 CPU 多核心
- 集合命令的实现方法
- 有序集合命令的实现方法
- redis.conf 配置
- 慢查询
Linux 篇
安全篇
设计模式篇
架构篇
- OAuth 2.0
- 单点登录
- REST
- API 版本兼容
- JWT
- 画出 PHP 业务架构图
- LVS
- Ngnix
- 服务化
- 微服务
- 服务注册发现
- 数据库读写分离
- 数据库拆分
- 分布式事务
- ID 生成器
- 一致性哈希
- Redis 集群
- 消息队列
- 穿透、雪崩
- 限流(木桶、令牌桶)
- 服务降级
- 语言对比
为何要写这个
从事软件开发,已经接近五个年头了,去年面试中,发现自己依然处于尴尬的位置。简单重复,缺乏挑战的工作,已经没有多大吸引力了,优秀的平台,面试缺屡次碰壁。人上年纪之后,思维敏感度、记忆力都明显有所下滑。
程序开发不要被限制在语言层面,这是大家都懂的道理。但是作为一个 PHP 开发者,很多时候都是缠绕在业务的沟壑,理想和现实总是相差甚大。去年由于部门重组,本来将近十余人负责的项目,之后只剩两三人负责,各种坑只能靠人肉解决,深感无力。
工作可能只是你的一部分,你必须有自己的能力定位。以前总觉得学什么,做什么都无所谓,需要学习的技术,花点时间快速学习就行,有新的技术出来,赶紧紧跟了解下。但这些年下来,发现自己却没有一样能够拿的出手的,甚至连一个像样的作品也没有。其实 PHP 的技术栈还是比较广的,在对整个技术栈有一定的掌握之后,可能还需要深挖几个自己喜欢的领域,否则在现今的就业市场里面,没有任何的竞争力。所以可以看到很多招聘者都在感慨,中高级工程师都去哪里了。
面试或者面试他人,无法逃避,那就选择面对。撰写《PHP 面试问答》,构建一个面试体系,而不必慌张的临时准备,时时刻刻都充分准备好,对自己负责,也对别人负责。
结合实际 PHP 面试,系统的汇总面试中的各种各样的问题,尝试提供简洁准确的答案。如果你在 PHP 面试中遇到问题,欢迎提 Issues 交流。包含网络、数据结构与算法、PHP、Web、MySQL、Redis、Linux、安全、设计模式、架构、自我介绍、离职原因、职业规划、准备问题等部分。
最后,祝愿大家在日后的求职中,都能拿到满意的 offer~~
参考
术语对照表:顾名思义,帮助联想知识点
参考资料:站在巨人的肩膀上,你将能看的更远
声明
本资料仅供参考,水平有限,难免存在纰漏错误之处
欢迎转载,转载请标明来源出处,谢谢~~
作者:凌枫 Email:colinlets@gmail.com