PHP Web、会话与运行机制
Session 与 Cookie 的区别是什么?
Session主要存储在服务端。Cookie主要存储在客户端。- 两者都可以设置过期时间。
- 通常用
Cookie保存标识,再用服务端Session保存状态。
如何修改 Session 的生存时间?
常见做法有:
- 配置
session.gc_maxlifetime - 调用
session_set_cookie_params() - 修改
php.ini或运行时 ini 配置
需要区分:
- 服务端 Session 数据有效期
- 客户端 Session Cookie 有效期
如何处理多服务器共享 Session?
核心思路是让多个应用节点共享同一份 Session 存储。
常见方案:
- Redis
- Memcached
- 数据库
- 共享文件系统
实际项目里最常见的是 Redis。
分布式系统中,Session 一般如何保存?
常见思路是把多个应用实例都接到统一的会话存储层。
如果面试继续追问,可以补:
- Session 过期策略
- 登录态续期
- 是否改为无状态 JWT
不使用 PHP 自带的 setcookie(),还能怎样给客户端下发 Cookie?
从协议角度看,Cookie 本质上是 HTTP 响应头里的 Set-Cookie。
因此即使不直接调用 setcookie(),也仍然可以:
header('Set-Cookie: token=abc123; Path=/; HttpOnly');但在业务代码里通常还是更推荐使用标准接口。
如何获取一个网页地址的内容?
常见方式有:
file_get_contents()curlfsockopen()/ socket
通常业务开发更推荐 curl,因为超时、Header、POST、HTTPS 等控制更完整。
PHP 中发起 HTTP 请求有哪几种方式?它们有什么区别?
常见方式:
file_get_contents()curlfsockopen()/ socket
区别大致如下:
file_get_contents():简单轻量。curl:功能最完整,业务里最常用。fsockopen():更底层,灵活但使用成本高。
PHP 的进程模型是什么?PHP 是怎么支持多个并发请求的?
在典型 Web 架构里:
- Web Server 接收请求,例如 Nginx。
- 请求被转发给 PHP-FPM。
- PHP-FPM 里的某个 worker 进程处理请求。
- 请求结束后,worker 回到池中等待下一个请求。
因此传统 PHP 的并发主要来自“多进程 worker + 进程池管理”。
php-fpm 的核心配置项有哪些?daemonize 是什么?
常见高频项:
pmpm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_serverspm.max_requests
其中:
pm=static:固定数量子进程。pm=dynamic:动态调整。pm=ondemand:有请求时再拉起。
daemonize 表示是否以守护进程方式在后台运行。
php-fpm 的进程数量配置多少比较合理?
核心思路是根据机器资源和单请求内存占用反推:
max_children ≈ 可用于 PHP 的总内存 / 单 worker 平均内存
最终还是要结合压测和监控校正。
一个请求到达 Nginx 后,和 PHP 的通信流程通常是什么样的?
在典型 Nginx + PHP-FPM 架构里:
- 请求先到 Nginx。
- Nginx 判断是静态资源还是 PHP 请求。
- PHP 请求通过 FastCGI 转发给 PHP-FPM。
- PHP-FPM 选一个空闲 worker 执行脚本。
- 执行结果返回给 Nginx。
- Nginx 再响应客户端。
Nginx 和 PHP-FPM 的协作里,哪些配置参数最值得关注?
如果从 PHP 生态角度回答,重点是并发、超时和资源上限相关参数。
例如:
- Nginx 侧:
fastcgi_passfastcgi_paramfastcgi_connect_timeoutfastcgi_read_timeout
- PHP-FPM 侧:
pmpm.max_childrenrequest_terminate_timeoutslowlogpm.max_requests
来源引用
- https://github.com/ycrao/mynotes/blob/master/php/interview.md
- https://github.com/ycrao/mynotes/blob/master/php/interview_2.md
- https://github.com/lengyue1024/BAT_interviews/blob/master/PHP%E9%9D%A2%E8%AF%95%E9%A2%98%E5%8F%8A%E7%AD%94%E6%A1%88.md
- https://github.com/walijoy/php-engineer-interview-questions
评论
使用 GitHub 账号即可参与加载较慢?可 直接前往 GitHub Discussions 查看与参与。