php本身不提供负载均衡能力,所谓“php负载均衡”实为借助nginx、haproxy等外部服务将http请求分发至多个php后端服务器;直接在php中实现转发存在阻塞i/o、无健康检查、session丢失、功能缺失等严重缺陷。

PHP 本身不提供负载均衡能力,所谓“PHP 负载均衡”实际是指:用外部服务(如 Nginx、HAProxy、云 LB)把 HTTP 请求分发到多个运行 PHP 的后端服务器上。直接在 PHP 代码里做请求分发既不可靠也不安全,更无法处理连接、健康检查、会话保持等关键问题。
为什么不能用 PHP 写负载均衡器
有人尝试用 curl 或 stream_socket_client 在 PHP 中转发请求,但这类方案存在严重缺陷:
- 阻塞式 I/O 导致并发能力极低,一个请求卡住就拖垮整个进程
- 无法自动检测后端宕机(没健康检查),故障转移全靠手动重启
- Session 丢失风险高,PHP 默认 session 不跨机器共享
- 超时、重试、限流、TLS 终止等必须功能都得自己重复造轮子
Nginx 作为反向代理实现最简负载均衡
这是新手最该起步的方式:Nginx 做前端接收所有请求,按策略分发给多个 PHP-FPM 或 Apache+PHP 实例。
示例配置(/etc/nginx/conf.d/loadbalancer.conf):
立即学习“PHP免费学习笔记(深入)”;
upstream php_backend {
server 192.168.1.10:9000; # PHP-FPM 监听地址
server 192.168.1.11:9000;
keepalive 32;
}
<p>server {
listen 80;
location / {
proxy_pass <a href="https://www.php.cn/link/6ec52fc9886c13b7f97e5c5dee505909">https://www.php.cn/link/6ec52fc9886c13b7f97e5c5dee505909</a>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}</p>-
upstream块定义后端池,支持weight、max_fails、fail_timeout等参数调优 - 务必配
proxy_set_header,否则 PHP 的$_SERVER['REMOTE_ADDR']会变成 Nginx 本机 IP - 如果后端是 Apache/PHP(非 PHP-FPM),
proxy_pass应指向http://192.168.1.x:80,不是:9000
Session 共享是绕不开的坑
负载均衡后,用户请求可能落到任意后端,但默认 PHP session 存本地文件,导致登录态失效。
- 首选方案:改用
redis存 session,所有 PHP 实例连同一 Redis 实例
→ 修改php.ini:session.save_handler = redis,session.save_path = "192.168.1.20:6379" - 次选方案:用数据库(如 MySQL)存 session,性能不如 Redis,但兼容性更好
- 不推荐方案:粘性 Session(sticky session),靠 Nginx 的
ip_hash,但破坏了负载均衡意义,且 NAT 环境下失效
真正麻烦的从来不是加几台机器或改几行配置,而是状态——比如 session、缓存、数据库连接池、上传临时文件路径。这些不在请求中显式传递的东西,才是多实例部署时最容易出问题的地方。











