php socket实现长连接
PHP Socket 实现长连接的方法
长连接(Keep-Alive)的核心在于维持客户端与服务器之间的持久通信通道,避免频繁建立和断开连接。以下是实现长连接的几种方法:
使用 stream_socket_server 和 stream_socket_accept
创建一个基本的 Socket 服务器并保持连接:

$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
die("Failed to create socket: $errstr ($errno)");
}
while (true) {
$client = stream_socket_accept($socket, -1);
if ($client) {
while (true) {
$data = fread($client, 1024);
if ($data === false || $data === '') {
break;
}
fwrite($client, "Received: " . $data);
}
fclose($client);
}
}
使用 socket_create 和 socket_accept
通过 PHP 的 socket_* 函数实现更底层的长连接:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8000);
socket_listen($socket);
while (true) {
$client = socket_accept($socket);
if ($client) {
while (true) {
$data = socket_read($client, 1024);
if ($data === false || $data === '') {
break;
}
socket_write($client, "Received: " . $data);
}
socket_close($client);
}
}
设置超时和心跳机制
为了避免连接因长时间无数据而断开,可以设置心跳包:
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
stream_set_timeout($socket, 0); // 非阻塞模式
while (true) {
$client = stream_socket_accept($socket);
if ($client) {
stream_set_timeout($client, 3600); // 超时时间为 1 小时
while (true) {
$data = fread($client, 1024);
if ($data === false || $data === '') {
break;
}
if (trim($data) === 'PING') {
fwrite($client, 'PONG');
} else {
fwrite($client, "Received: " . $data);
}
}
fclose($client);
}
}
使用多进程或异步处理
对于高并发场景,可以使用 pcntl_fork 或 libevent 实现异步处理:
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
while (true) {
$client = stream_socket_accept($socket);
if ($client) {
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// Parent process
continue;
} else {
// Child process
while (true) {
$data = fread($client, 1024);
if ($data === false || $data === '') {
break;
}
fwrite($client, "Received: " . $data);
}
fclose($client);
exit();
}
}
}
注意事项
- 资源管理:长连接会占用服务器资源,需合理设置超时和心跳机制。
- 错误处理:确保在连接异常时能正确关闭 Socket。
- 性能优化:高并发场景建议结合异步 I/O 或多进程技术。
通过以上方法,可以在 PHP 中实现稳定的长连接通信。






