PHP http长连接的实现
HTTP 长连接基础概念
HTTP长连接(Keep-Alive)允许在单个TCP连接上发送和接收多个HTTP请求/响应,减少重复建立和断开连接的开销。HTTP/1.1默认启用长连接,而HTTP/1.0需显式设置Connection: keep-alive头部。
PHP 实现长连接的方法
使用 header() 函数设置Keep-Alive
通过PHP的header()函数设置HTTP头部,启用长连接:
header("Connection: keep-alive");
header("Keep-Alive: timeout=5, max=100"); // 超时5秒,最多100次请求
结合Nginx/Apache配置
在Web服务器配置中启用长连接更高效。例如Nginx的配置:
keepalive_timeout 65; // 超时时间(秒)
keepalive_requests 100; // 单连接最大请求数
长轮询(Long Polling)实现
通过阻塞PHP脚本直到数据更新,模拟实时通信:
while (true) {
$data = check_data_update(); // 自定义数据检查逻辑
if ($data !== null) {
echo json_encode($data);
break;
}
sleep(1); // 避免CPU过载
flush(); // 确保输出缓冲区刷新
}
WebSocket 替代方案
对于更高实时性需求,建议使用WebSocket。PHP可通过库如Ratchet实现:
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
$server = IoServer::factory(
new HttpServer(new WsServer(new YourWebSocketHandler())),
8080
);
$server->run();
注意事项
- 超时控制:长连接需合理设置超时时间,避免资源浪费。
- 服务器限制:共享主机可能有脚本执行时间限制,需调整
set_time_limit()。 - 内存管理:长时间运行的脚本需注意内存泄漏问题。
性能优化建议
- 使用OPcache加速PHP脚本执行。
- 考虑异步框架如Swoole处理高并发长连接场景。
- 监控服务器连接数,避免过多长连接耗尽资源。
以上方法可根据实际需求选择,简单场景用Keep-Alive头部即可,复杂实时交互推荐WebSocket方案。




