PHP 原理大纲
这份不是“会不会写 PHP”的大纲,而是“PHP 在后端系统里到底是怎么工作的,以及为什么它适合你这类复杂业务系统”。
一、总纲
PHP 原理层最核心的 5 条主线:
- 运行模型
- 请求生命周期
- 进程管理与 PHP-FPM
- 代码组织与框架机制
- 复杂业务系统里的优势与边界
二、PHP 运行模型
1. PHP 本质是什么
PHP 本质上是解释执行的服务端脚本语言。 在 Web 场景里,通常是每次请求来到时由 PHP-FPM 拉起 worker 执行脚本,请求结束后释放大部分运行态。
2. PHP 的经典模型是什么
经典模型是:
- 请求进来
- 初始化运行环境
- 执行业务逻辑
- 输出响应
- 请求结束后释放运行上下文
这种模型的好处是:
- 简单
- 稳定
- 请求之间默认隔离
- 不容易因为内存状态污染彼此
坏处是:
- 每个请求都会重复初始化一部分资源
- 不适合天然长连接场景
3. 为什么这个模型适合复杂业务后台
因为复杂业务系统更看重:
- 规则实现效率
- 团队协作效率
- 请求之间状态隔离
- 问题容易收敛
你可以把这个挂回自己项目:
像订阅、支付、退款、后台、活动、规则配置这种复杂业务,不一定最追求单请求极限性能,反而更看重落地效率和可维护性。
三、Nginx + PHP-FPM 请求链路
1. 链路是什么
典型链路是:
- 客户端请求到 Nginx
- Nginx 判断静态资源还是动态请求
- 动态请求通过 FastCGI 转给 PHP-FPM
- PHP-FPM 选一个 worker 执行脚本
- 执行结果返回 Nginx
- Nginx 再返回客户端
2. Nginx 和 PHP-FPM 分别干什么
Nginx
- 连接接入
- 路由
- 静态资源处理
- 反向代理
- 转发 PHP 动态请求
PHP-FPM
- 管理 PHP worker 进程
- 执行 PHP 脚本
- 控制并发 worker 数量
3. 面试可延伸点
- 为什么 PHP-FPM 会打满
max_children是什么- 慢请求怎么查
- 为什么不是 Nginx 一层就够了
四、PHP-FPM 原理重点
1. PHP-FPM 是什么
PHP-FPM 是 FastCGI Process Manager。 它的核心价值不是“让 PHP 能跑”,而是:
- 管理 worker 进程
- 控制并发
- 提高稳定性
- 支持慢日志、平滑重启、池化管理
2. 为什么要用进程池
因为 PHP Web 请求本质上要靠 worker 去执行。 如果每次请求都临时起一个 PHP 进程,成本太高;如果完全没有上限,又容易打爆机器。 所以需要进程池去做平衡。
3. 常见模式
staticdynamicondemand
4. 面试时怎么理解“FPM 打满”
本质上是请求执行速度和到达速度失衡。 可能原因是:
- 慢 SQL
- 外部依赖超时
- 代码逻辑太重
- worker 数不足
- 突发流量
所以“调大 max_children”只是手段,不是根因修复。
五、PHP 框架机制原理
这一块你不需要背框架源码,但要理解框架在解决什么问题。
1. 路由
把 URL / method 映射到控制器或处理函数。
2. 中间件
在请求真正进入业务逻辑前后做统一处理,比如:
- 鉴权
- 日志
- 限流
- 参数校验
3. IOC / DI
通过依赖注入把“接口”和“实现”解耦,降低耦合度,方便替换和测试。
4. Service / Repository / Domain 分层
不是为了好看,而是为了:
- 让业务规则不要散落在 controller
- 让复杂逻辑更集中
- 让测试和扩展更容易
5. 配置与容器
框架通过配置文件和容器,把系统中的公共能力组织起来。
六、autoload 与代码组织
1. Composer autoload 在解决什么问题
解决类加载问题,让代码按命名空间和目录规则组织起来,而不是手写 include / require。
2. PSR-4 的意义
核心不是记规范,而是:
- 目录结构清楚
- 命名空间统一
- 代码组织可维护
这对大型项目尤其重要。
七、复杂业务系统里为什么 PHP 仍然合理
核心答案
因为 PHP 在复杂业务后端里,优势不是“语法简单”,而是:
- 业务落地快
- 团队协作成熟
- 请求隔离天然清晰
- 生态成熟
- 后台系统和业务系统开发效率高
你的项目里怎么讲
海外业务平台
- 订阅
- 支付
- 退款
- 权益同步
- 后台和运营配置
这些都属于规则复杂、协作密集、迭代频繁的系统,PHP 很合适。
核心业务链路
- 活动
- 小程序
- 商家
- 交易
也都偏复杂业务落地,而不是极致高并发纯计算服务。
八、PHP 的边界
这一段很重要,能体现你不是盲目站队。
PHP 不擅长的典型场景
- 长连接
- 极高并发实时处理
- 大量消费者常驻服务
- 重 IO 并发协程场景
所以怎么做
你的最佳回答是:
我不会让 PHP 承担所有角色。 复杂业务主链路、后台和规则配置继续放 PHP; 实时链路、高并发消费者、长生命周期服务拆到 Go。 这是我项目里一直在做的分工方式。
九、你最应该能顺着讲出的原理链
你至少要能完整顺着讲出这条链:
请求 -> Nginx -> FastCGI -> PHP-FPM -> worker 执行脚本 -> 框架路由/中间件 -> service 层业务逻辑 -> MySQL/Redis/外部服务 -> 响应返回
只要这条链你讲顺了,PHP 原理层就不会显得空。
十、最适合你的结尾表达
我对 PHP 的理解,不是停留在语法和 CRUD,而是理解它在 Web 后端里的运行模型、进程池方式和框架分层方式,也知道它最适合承接什么类型的业务。对我来说,PHP 不是“落后语言”,而是复杂业务系统里非常高效的一层。