当前位置:首页 > PHP

php socket实现长连接

2026-02-13 20:58:18PHP

PHP Socket 实现长连接的方法

长连接(Keep-Alive)的核心在于维持客户端与服务器之间的持久通信通道,避免频繁建立和断开连接。以下是实现长连接的几种方法:

使用 stream_socket_serverstream_socket_accept

创建一个基本的 Socket 服务器并保持连接:

php 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_createsocket_accept

通过 PHP 的 socket_* 函数实现更底层的长连接:

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_forklibevent 实现异步处理:

$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 中实现稳定的长连接通信。

标签: phpsocket
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用原生PHP实现分页功能需要结合数据库查询和HTML展示。以下是核心实现步骤: 数据库查询与分页逻辑 // 连接数据库 $conn = new mysqli('lo…

vue实现socket

vue实现socket

Vue 实现 WebSocket 通信 在 Vue 中实现 WebSocket 通信可以通过原生 WebSocket API 或第三方库如 socket.io-client。以下是两种方法的详细实现方…

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开:…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 &l…

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERV…