php长连接实现
长连接的概念
长连接(Keep-Alive)是指客户端与服务器建立一次TCP连接后,可以在此连接上发送多个请求并接收多个响应,而不需要为每个请求重新建立连接。这种方式减少了连接建立和关闭的开销,提高了性能。
PHP实现长连接的方法
使用HTTP长连接
HTTP/1.1默认支持长连接,通过设置Connection: keep-alive头部实现。在PHP中可以通过以下方式启用:
header('Connection: keep-alive');
header('Keep-Alive: timeout=60, max=100');
timeout=60:连接空闲超时时间(秒)。max=100:单个连接上最多允许的请求数。
使用WebSocket
WebSocket是真正的全双工长连接协议,适合实时通信场景。PHP可通过以下库实现:

-
Ratchet(推荐):
use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; use MyApp\Chat; require dirname(__DIR__) . '/vendor/autoload.php'; $server = IoServer::factory( new HttpServer( new WsServer( new Chat() ) ), 8080 ); $server->run();需实现
Chat类处理消息逻辑。
-
Swoole(高性能方案):
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501); $server->on('message', function ($server, $frame) { $server->push($frame->fd, "Received: {$frame->data}"); }); $server->start();
数据库长连接
PHP中MySQL长连接可通过mysql_pconnect(已弃用)或PDO参数实现:
$pdo = new PDO(
'mysql:host=localhost;dbname=test',
'user',
'password',
[PDO::ATTR_PERSISTENT => true]
);
注意:长连接可能导致数据库连接数耗尽,需合理配置连接池。
注意事项
- 资源管理:长连接会占用服务器资源,需设置合理的超时和最大连接数。
- 兼容性:部分代理服务器或CDN可能不支持长连接,需测试验证。
- 心跳机制:WebSocket等长连接需定期发送心跳包维持连接。
性能优化建议
- 使用Swoole或Workerman等异步框架提升并发能力。
- 结合Nginx反向代理管理HTTP长连接。
- 监控连接状态,避免资源泄漏。






