php socket实现长连接
PHP Socket 实现长连接
在 PHP 中,使用 Socket 实现长连接需要结合 Socket 函数和事件循环机制。以下是实现方法:
创建 Socket 服务器
使用 socket_create、socket_bind 和 socket_listen 函数创建服务器端 Socket:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
接受客户端连接
通过 socket_accept 接受客户端连接,并设置为非阻塞模式:

$client = socket_accept($socket);
socket_set_nonblock($client);
处理长连接数据
使用循环持续监听客户端数据,避免连接断开:
while (true) {
$data = socket_read($client, 1024);
if ($data !== false) {
// 处理接收到的数据
echo "Received: " . $data;
// 发送响应
socket_write($client, "Server response\n");
}
usleep(100000); // 避免 CPU 过高占用
}
客户端保持连接
客户端需要定期发送心跳包维持连接:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8080);
// 发送心跳包
while (true) {
socket_write($socket, "HEARTBEAT\n");
$response = socket_read($socket, 1024);
echo $response;
sleep(5); // 每 5 秒发送一次
}
错误处理与重连
在客户端实现自动重连机制:
while (true) {
try {
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!socket_connect($socket, '127.0.0.1', 8080)) {
throw new Exception("Connection failed");
}
// 正常通信逻辑
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
sleep(1); // 等待后重试
}
}
使用 select 多路复用
对于多个客户端连接,使用 socket_select 提高效率:
$read = [$socket];
while (true) {
$changed = $read;
if (socket_select($changed, $write, $except, 0) > 0) {
foreach ($changed as $client) {
$data = socket_read($client, 1024);
// 处理数据
}
}
}
注意事项
- 长连接会占用服务器资源,需合理设置超时和心跳间隔
- 生产环境建议使用成熟的 Socket 库如
ReactPHP或Swoole - 考虑使用
pcntl_fork或多线程处理并发连接
以上方法实现了基本的 PHP Socket 长连接功能,可根据实际需求调整心跳机制和错误处理逻辑。






