PHP特性
PHP-FPM
Master–Worker执行模型
多进程、单线程
PHP-FPM采用一个多进程、单线程的执行模型,其中master为主进程,其可以管理多个相互隔离的worker子进程(即工作进程)来处理请求
多进程指可以同时可以运行多个worker,单线程指的是一个worker进程内部只有一个执行线程
同步 + 阻塞
- 同步(什么时候做):指执行顺序——任务必须按顺序来,前一个没做完,后一个绝对不会开始。
- 阻塞(等待时干什么-干等):指等待行为——遇到 I/O 操作时,进程会挂起等待,不会去干别的事
worker进程级常驻
worker进程保持内存常驻状态(进程级常驻),不同于Laravel Octane提供的的应用级内存常驻
进程常驻指worker把全部请求执行完毕后不会销毁,而是继续等待下一个请求处理
内存泄漏管理
每一次请求结束,清理worker自动执行
php_request_shutdown()清理请求级资源达到
pm.max_requests = 500设定的每个worker最高处理请求数上限时,worker销毁(定期销毁,解决内存泄漏)达到
request_terminate_timeout = 30s设定的单个请求的最大执行时间时,超时直接销毁Worker,防止慢请求或死循环导致内存暴涨进程隔离:每个 Worker 进程内存独立,一个进程泄漏不会影响其他进程,也不会拖垮整个服务
进程常驻但应用不常驻
应用不常驻:每次请求重新构建应用上下文
text
应用不常驻(PHP-FPM)
Worker 常驻
↓
请求1 → Laravel 应用初始化 → 处理 → 请求结束
↓
请求2 → Laravel 应用重新初始化 → 处理 → 请求结束
↓
请求3 → Laravel 应用重新初始化 → 处理 → 请求结束应用常驻:只创建一次应用上下文,后面每次请求复用之前构建应用上下文
text
FrankenPHP
Worker 常驻
↓
Laravel 应用初始化一次
↓
请求1 → 复用 Application → 处理
↓
请求2 → 复用 Application → 处理
↓
请求3 → 复用 Application → 处理类型声明
PHP虽然是动态弱类型语言,但允许在以下位置对变量的类型进行声明
text
函数/方法
├── 参数
└── 返回值
类
├── 属性
└── 常量