php socket实现长连接
PHP Socket 实现长连接的方法
创建 Socket 服务器端
使用 socket_create 函数创建一个 Socket 服务器端,指定协议族为 AF_INET,类型为 SOCK_STREAM,协议为 SOL_TCP。绑定 IP 地址和端口后,调用 socket_listen 开始监听连接请求。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
接受客户端连接
使用 socket_accept 函数接受客户端的连接请求,返回一个新的 Socket 资源用于与客户端通信。将该 Socket 设置为非阻塞模式以实现长连接。
$client = socket_accept($socket);
socket_set_nonblock($client);
处理客户端消息
通过循环不断读取客户端发送的消息,使用 socket_read 函数读取数据。如果读取到数据则进行处理,未读取到数据则继续等待。
while (true) {
$data = socket_read($client, 1024);
if ($data !== false && !empty($data)) {
echo "Received: " . $data;
socket_write($client, "Server received: " . $data);
}
usleep(100000);
}
保持连接活跃
为避免连接超时断开,可以定期发送心跳包。服务器端定时向客户端发送特定消息以确认连接状态,客户端收到后回复确认信息。
if (time() - $lastHeartbeat > 30) {
socket_write($client, "HEARTBEAT");
$lastHeartbeat = time();
}
客户端实现
客户端同样使用 socket_create 创建 Socket 并连接到服务器端。设置非阻塞模式后,循环发送消息并接收服务器响应。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8080);
socket_set_nonblock($socket);
while (true) {
socket_write($socket, "Hello Server");
$response = socket_read($socket, 1024);
if ($response !== false) {
echo "Server response: " . $response;
}
usleep(100000);
}
错误处理
在 Socket 操作过程中加入错误处理逻辑,捕获可能的异常并记录日志,确保程序稳定性。
if ($socket === false) {
echo "Socket creation failed: " . socket_strerror(socket_last_error());
exit;
}
资源释放
在程序结束或连接断开时,调用 socket_close 关闭 Socket 连接,释放资源。

socket_close($client);
socket_close($socket);
通过以上步骤可以实现 PHP Socket 长连接,适用于需要实时通信的场景。






