PHP技能树汇总(超全面)

该仓库主要真是国内 PHP 面试经常被问到的知识点做汇总。
仅是针对性指出知识点,相应还需自己查找相关资料系统学习。
我希望各位能不仅仅了解是什么,还要了解为什么,以及背后的原理。

如果您有对相应知识点非常系统的资料,欢迎 PR 增加链接。
不建议您使用 fork,资料会随时更新。

如果你现在处于以下几种状态,本资料非常适合你:

  • 准备换工作,不知道从哪开始准备
  • 技术遇到瓶颈,不知道该学什么
  • 准备学 PHP,但不知道领域有多深

基础篇

进阶篇

  • Autoload、Composer 原理 PSR-4原理
  • Session 共享、存活时间
  • 异常处理
  • 如何 foreach 迭代对象
  • 如何数组化操作对象 $obj[key];
  • 如何函数化对象 $obj(123);
  • yield 是什么,说个使用场景 yield
  • PSR 是什么,PSR-1, 2, 4, 7
  • 如何获取客户端 IP 和服务端 IP 地址
  • 客户端 IP
  • 服务端 IP
  • 了解代理透传 实际IP 的概念
  • 如何开启 PHP 异常提示
  • php.ini 开启 display_errors 设置 error_reporting 等级
  • 运行时,使用 ini_set(k, v); 动态设置
  • 如何返回一个301重定向
  • [WARNING] 一定当心设置 301 后脚本会继续执行,不要认为下面不会执行,必要时使用 die or exit
  • 如何获取扩展安装路径
  • phpinfo(); 页面查找 extension_dir
  • 命令行 php -i |grep extension_dir
  • 运行时 echo ini_get('extension_dir');
  • 字符串、数字比较大小的原理,注意 0 开头的8进制、0x 开头16进制
  • 字符串比较大小,从左(高位)至右,逐个字符 ASCII 比较
  • BOM 头是什么,怎么除去
  • 0xEF,0xBB,0xBF
  • 检测、去除
  • 什么是 MVC
  • 依赖注入实现原理
  • 如何异步执行命令
  • 模板引擎是什么,解决什么问题、实现原理(Smarty、Twig、Blade)
  • 如何实现链式操作 $obj->w()->m()->d();
  • Xhprof 、Xdebug 性能调试工具使用
  • 索引数组 [1, 2] 与关联数组 ['k1'=>1, 'k2'=>2] 有什么区别
  • 缓存的使用方式、场景

实践篇

  • 给定二维数组,根据某个字段排序
  • 如何判断上传文件类型,如:仅允许 jpg 上传
  • 不使用临时变量交换两个变量的值 $a=1; $b=2; => $a=2; $b=1;
  • strtoupper 在转换中文时存在乱码,你如何解决?php echo strtoupper('ab你好c');
  • Websocket、Long-Polling、Server-Sent Events(SSE) 区别
  • “Headers already sent” 错误是什么意思,如何避免

算法篇

  • 快速排序(手写)
  • 冒泡排序(手写)
  • 二分查找(了解)
  • 查找算法 KMP(了解)
  • 深度、广度优先搜索(了解)
  • LRU 缓存淘汰算法(了解,Memcached 采用该算法)

数据结构篇(了解)

  • 堆、栈特性
  • 队列
  • 哈希表
  • 链表

对比篇

  • Cookie 与 Session 区别
  • GETPOST 区别
  • includerequire 区别
  • include_oncerequire_once 区别
  • Memcached 与 Redis 区别
  • MySQL 各个存储引擎、及区别(一定会问 MyISAM 与 Innodb 区别)
  • HTTP 与 HTTPS 区别
  • Apache 与 Nginx 区别
  • define() 与 const 区别
  • traits 与 interfaces 区别 及 traits 解决了什么痛点?
  • Git 与 SVN 区别

数据库篇

  • MySQL
  • CRUD
  • JOIN、LEFT JOIN 、RIGHT JOIN、INNER JOIN
  • UNION
  • GROUP BY + COUNT + WHERE 组合案例
  • 常用 MySQL 函数,如:now()、md5()、concat()、uuid()等
  • 1:11:nn:n 各自适用场景
  • 了解触发器是什么,说个使用场景
  • 数据库优化手段
  • 索引、联合索引(命中条件)
  • 分库分表(水平分表垂直分表
  • 分区
  • 会使用 explain 分析 SQL 性能问题,了解各参数含义
  • 重点理解 typerowskey
  • Slow Log(有什么用,什么时候需要)
  • MSSQL(了解)
  • 查询最新5条数据
  • NOSQL
  • Redis、Memcached、MongoDB
  • 对比、适用场景(可从以下维度进行对比)
  • 持久化
  • 支持多钟数据类型
  • 可利用 CPU 多核心
  • 内存淘汰机制
  • 集群 Cluster
  • 支持 SQL
  • 性能对比
  • 支持事务
  • 应用场景
  • 你之前为了解决什么问题使用的什么,为什么选它?

服务器篇

  • 查看 CPU、内存、时间、系统版本等信息
  • find 、grep 查找文件
  • awk 处理文本
  • 查看命令所在目录
  • 自己编译过 PHP 吗?如何打开 readline 功能
  • 如何查看 PHP 进程的内存、CPU 占用
  • 如何给 PHP 增加一个扩展
  • 修改 PHP Session 存储位置、修改 INI 配置参数
  • 负载均衡有哪几种,挑一种你熟悉的说明其原理
  • 数据库主从复制 M-S 是怎么同步的?是推还是拉?会不会不同步?怎么办
  • 如何保障数据的可用性,即使被删库了也能恢复到分钟级别。你会怎么做。
  • 数据库连接过多,超过最大值,如何优化架构。从哪些方便处理?
  • 502 大概什么什么原因? 如何排查 504呢?

架构篇

  • 偏运维(了解):
  • 负载均衡(Nginx、HAProxy、DNS)
  • 主从复制(MySQL、Redis)
  • 数据冗余、备份(MySQL增量、全量 原理)
  • 监控检查(分存活、服务可用两个维度)
  • MySQL、Redis、Memcached Proxy 、Cluster 目的、原理
  • 分片
  • 高可用集群
  • RAID
  • 源代码编译、内存调优
  • 缓存
  • 工作中遇到哪里需要缓存,分别简述为什么
  • 搜索解决方案
  • 性能调优
  • 各维度监控方案
  • 日志收集集中处理方案
  • 国际化
  • 数据库设计
  • 静态化方案
  • 画出常见 PHP 应用架构图

框架篇

  • ThinkPHP(TP)、CodeIgniter(CI)、Zend(非 OOP 系列)
  • Yaf、Phalcon(C 扩展系)
  • Yii、Laravel、Symfony(纯 OOP 系列)
  • Swoole、Workerman (网络编程框架)
  • 对比框架区别几个方向点
  • 是否纯 OOP
  • 类库加载方式(自己写 autoload 对比 composer 标准)
  • 易用性方向(CI 基础框架,Laravel 这种就是高开发效率框架以及基础组件多少)
  • 黑盒(相比 C 扩展系)
  • 运行速度(如:Laravel 加载一大堆东西)
  • 内存占用

设计模式

  • 单例模式(重点)
  • 工厂模式(重点)
  • 观察者模式(重点)
  • 依赖注入(重点)
  • 装饰器模式
  • 代理模式
  • 组合模式

安全篇

  • SQL 注入
  • XSS 与 CSRF
  • 输入过滤
  • Cookie 安全
  • 禁用 mysql_ 系函数
  • 数据库存储用户密码时,应该是怎么做才安全
  • 验证码 Session 问题
  • 安全的 Session ID (让即使拦截后,也无法模拟使用)
  • 目录权限安全
  • 包含本地与远程文件
  • 文件上传 PHP 脚本
  • eval 函数执行脚本
  • disable_functions 关闭高危函数
  • FPM 独立用户与组,给每个目录特定权限
  • 了解 Hash 与 Encrypt 区别

高阶篇

  • PHP 数组底层实现 (HashTable + Linked list)
  • Copy on write 原理,何时 GC
  • PHP 进程模型,进程通讯方式,进程线程区别
  • yield 核心原理是什么
  • PDO prepare 原理
  • PHP 7 与 PHP 5 有什么区别
  • Swoole 适用场景,协程实现方式

前端篇

  • 原生获取 DOM 节点,属性
  • 盒子模型
  • CSS 文件、style 标签、行内 style 属性优先级
  • HTML 与 JS 运行顺序(页面 JS 从上到下)
  • JS 数组操作
  • 类型判断
  • this 作用域
  • .map() 与 this 具体使用场景分析
  • Cookie 读写
  • JQuery 操作
  • Ajax 请求(同步、异步区别)随机数禁止缓存
  • Bootstrap 有什么好处
  • 跨域请求 N 种解决方案
  • 新技术(了解)
  • ES6
  • 模块化
  • 打包
  • 构建工具
  • vue、react、webpack、
  • 前端 mvc
  • 优化
  • 浏览器单域名并发数限制
  • 静态资源缓存 304 (If-Modified-Since 以及 Etag 原理)
  • 多个小图标合并使用 position 定位技术 减少请求
  • 静态资源合为单次请求 并压缩
  • CDN
  • 静态资源延迟加载技术、预加载技术
  • keep-alive
  • CSS 在头部,JS 在尾部的优化(原理)

网络篇

  • IP 地址转 INT
  • 192.168.0.1/16 是什么意思
  • DNS 主要作用是什么?
  • IPv4 与 v6 区别

网络编程篇

  • TCP 三次握手流程
  • TCP、UDP 区别,分别适用场景
  • 有什么办法能保证 UDP 高可用性(了解)
  • TCP 粘包如何解决?
  • 为什么需要心跳?
  • 什么是长连接?
  • HTTPS 是怎么保证安全的?
  • 流与数据报的区别
  • 进程间通信几种方式,最快的是哪种?
  • fork() 会发生什么?

API 篇

  • RESTful 是什么
  • 如何在不支持 DELETE 请求的浏览器上兼容 DELETE 请求
  • 常见 API 的 APP_ID APP_SECRET 主要作用是什么?阐述下流程
  • API 请求如何保证数据不被篡改?
  • JSON 和 JSONP 的区别
  • 数据加密和验签的区别
  • RSA 是什么
  • API 版本兼容怎么处理
  • 限流(木桶、令牌桶)
  • OAuth 2 主要用在哪些场景下
  • JWT
  • PHP 中 json_encode(['key'=>123]);return json_encode([]); 区别,会产生什么问题?如何解决

加分项

  • 了解常用语言特性,及不同场景适用性。
  • PHP VS Golang
  • PHP VS Python
  • PHP VS JAVA
  • 了解 PHP 扩展开发
  • 熟练掌握 C

PHP常用技能

消息队列

应用场景 秒杀 抢购 发送消息 发送卡券

  • Redis List
  • RabbitMQ

生成二维码

  • QR Code

即时通信

应用场景 客服 聊天 监控实时监控数据 群发

  • MeepoPS
  • workerman

抽象画图

应用场景 数据统计 性能统计

  • JpGraph

安装扩展

mcrypt扩展

yum install libmcrypt libmcrypt-devel php-mcrypt mhash

php性能优化

PHP语言级性能优化

  • 避免使用魔法函数如__get()
  • 尽量使用自带函数完成
  • 自带函数功能一致的情况下性能不同
  • 禁用错误抑制符@
  • 合理使用内存,及时unset()释放不使用的内存(unset有释放不掉的内存)
  • 合理使用正则
  • 避免在循环内做运算(循环内的计算式将会被重复计算)
  • 减少密集型业务(PHP不适合密集型运算的场景),适合衔接webserver与后端服务、UI呈现
  • 务必使用带引号的字符串做键值(PHP会将没有引号的键值作为常量,产生查找常量的开销)

PHP周边问题的优化

  • 减少文件类的操作(内存>>数据库>磁盘>网络)
  • 减少PHP发起的网络请求(设置超时时间,将串行请求并行化”使用curl_multi,使用swoole扩展”)
  • 压缩PHP输出,利:利于我们的数据输出,client端能更快的获取到数据;弊:产生额外的CPU开销(Gzip即可)
  • PHP缓存复用(多次请求,内容不变的情况)
  • Smarty调优和重叠时间窗口
坚持原创技术分享,您的支持将鼓励我继续创作!