结合实际PHP面试,汇总自己遇到的问题,以及网上其他人遇到的问题,尝试提供简洁准确的答案
包含网络、数据结构与算法、PHP、Web、MySQL、Redis、Linux、安全、设计模式、架构、面试等部分
本仓库将持续更新,fork 无法看到最新内容,建议 Watch 或 Star ~~
温馨提示
- 
分享面试遇到的问题,通过提交 Issue
 - 
参与项目内容完善,通过提交 PR,提交内容请尽量保证
准确性和可读性 - 
本仓库需要什么内容:
实际经典面试题+靠谱简答+详细深入文章(必要的话) 
- 计算机网络体系结构
 - UDP 的主要特点
 - TCP 的主要特点
 - 简述三报文握手建立 TCP 连接
 - 建立 TCP 连接为什么最后还要发送确认
 - 简述 TCP 连接的释放
 - TIME-WAIT 是什么,为什么必须等待 2MLS
 - TCP 粘包问题
 - UDP、TCP 区别,适用场景
 - 建立 socket 需要哪些步骤
 - DNS 主要作用是什么
 - HTTP 报文组成
 - HTTP 状态码
 - 常见的 HTTP 方法
 - GET 与 POST 请求方式区别
 - HTTP 优缺点
 - HTTPS 通信原理
 - HTTP 2.0
 - WebSocket
 - IPv6 与 IPv4 有什么变化
 - 什么是心跳机制
 - 什么是长连接
 
- 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 配置选项
 - php-fpm.conf 配置
 - 502、504 错误产生原因及解决方式
 - 如何返回一个301重定向
 - PHP 与 MySQL 连接方式
 - MySQL、MySQLi、PDO 区别
 - MySQL 连接池
 - 代码执行过程
 - base64 编码原理
 - ip2long 实现
 - MVC 的理解
 - 主流 PHP 框架特点
 - 对象关系映射/ORM
 
- 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 双向绑定原理
 - 如何进行网站性能优化
 - 渐进增强
 
- 体系结构
 - 基础操作
 - 数据库设计范式
 - 数据库设计原则
 - CHAR 和 VARCHAR 数据类型区别
 - LEFT JOIN 、RIGHT JOIN、INNER JOIN
 - UNION、UNION ALL
 - 常用 MySQL 函数
 - 锁
 - 事务
 - 常见存储引擎
 - 常见索引
 - 聚族索引与非聚族索引的区别
 - BTree 与 BTree-/BTree+ 索引原理
 - 分表数量级
 - EXPLAIN 输出格式
 - my.cnf 配置
 - 慢查询
 
- Redis 介绍
 - Redis 特点
 - Redis 支持哪些数据结构
 - Redis 与 Memcache 区别
 - 发布订阅
 - 持久化策略
 - Redis 事务
 - 如何实现分布式锁
 - Redis 过期策略及内存淘汰机制
 - 为什么 Redis 是单线程的
 - 如何利用 CPU 多核心
 - 集合命令的实现方法
 - 有序集合命令的实现方法
 - redis.conf 配置
 - 慢查询
 
- Linux 目录结构
 - Linux 基础
 - 命令与文件查找
 - 数据流重定向
 - sed
 - awk
 - 计划任务
 - Vim
 - 负载查看
 - 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:[email protected]
链接:https://github.com/colinlet/PHP-Interview-QA
