PHP http长连接的实现
HTTP长连接的概念
HTTP长连接(Keep-Alive)允许客户端和服务器在单个TCP连接上发送和接收多个HTTP请求/响应,减少重复建立和关闭连接的开销。在PHP中实现长连接通常涉及以下技术:
使用header()函数设置Keep-Alive
通过发送HTTP头Connection: keep-alive和Keep-Alive: timeout=x, max=y启用长连接。timeout表示空闲超时时间(秒),max表示最大请求数。
header("Connection: keep-alive");
header("Keep-Alive: timeout=60, max=100");
配置Web服务器
长连接的实际效果依赖服务器配置:
- Apache: 修改
httpd.conf或虚拟主机配置:KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 60 - Nginx: 在
nginx.conf中调整:keepalive_timeout 60; keepalive_requests 100;
使用cURL实现客户端长连接
PHP的cURL库支持复用连接,减少TCP握手开销:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Connection: keep-alive']);
curl_setopt($ch, CURLOPT_FORBID_REUSE, false); // 允许连接复用
$response = curl_exec($ch);
curl_close($ch); // 实际连接可能被保留在连接池
长连接与PHP-FPM
当使用PHP-FPM时,长连接的维持由Web服务器(如Nginx)管理。PHP脚本只需正常处理请求,无需特殊代码。确保PHP-FPM的pm配置(如pm.max_children)足够处理并发请求。
注意事项
- 资源消耗: 长连接会占用服务器资源,需合理设置超时和最大请求数。
- 兼容性: 部分老旧客户端或代理可能不支持
Keep-Alive。 - 调试工具: 使用Chrome DevTools或Wireshark验证连接是否复用。
实时通信的替代方案
若需真正的持久连接(如实时推送),考虑以下技术:
- WebSocket: 使用Ratchet或Swoole库实现全双工通信。
- Server-Sent Events (SSE): 通过
Content-Type: text/event-stream实现服务器到客户端的单向流。







