php 实现长连接
PHP 实现长连接的方法
使用 header() 函数设置连接保持
通过设置 HTTP 头信息实现长连接,适用于简单的 HTTP 长连接场景。
header("Connection: keep-alive");
header("Keep-Alive: timeout=60, max=1000");
timeout 指定连接保持时间(秒),max 指定最大请求次数。

结合 ob_flush() 和 flush() 实现服务器推送
适用于需要服务器主动推送数据的场景(如实时通知)。

// 关闭输出缓冲
while (ob_get_level() > 0) ob_end_flush();
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while (true) {
echo "data: " . date('Y-m-d H:i:s') . "\n\n";
ob_flush();
flush();
sleep(1);
}
使用 Swoole 扩展实现高性能长连接
适用于需要高并发长连接的场景(如聊天室)。
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
$server->on('open', function ($server, $request) {
echo "connection open: {$request->fd}\n";
});
$server->on('message', function ($server, $frame) {
$server->push($frame->fd, "Server: {$frame->data}");
});
$server->on('close', function ($server, $fd) {
echo "connection close: {$fd}\n";
});
$server->start();
数据库持久连接
通过 pconnect() 实现数据库长连接,减少连接开销。
$link = mysql_pconnect("localhost", "user", "password");
if (!$link) {
die('Could not connect: ' . mysql_error());
}
注意事项
- HTTP 长连接受限于浏览器和服务器配置,非真正的双向通信
- 长时间运行的脚本需设置
set_time_limit(0) - WebSocket 实现需浏览器支持,服务端推荐使用 Swoole/Workerman
- 保持连接会占用服务器资源,需合理设置超时时间






