当前位置:首页 > PHP

php socket实现长连接

2026-02-27 19:52:56PHP

PHP Socket 实现长连接

在 PHP 中,使用 Socket 实现长连接需要结合 Socket 函数和事件循环机制。以下是实现方法:

创建 Socket 服务器

使用 socket_createsocket_bindsocket_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 提高效率:

php socket实现长连接

$read = [$socket];
while (true) {
    $changed = $read;
    if (socket_select($changed, $write, $except, 0) > 0) {
        foreach ($changed as $client) {
            $data = socket_read($client, 1024);
            // 处理数据
        }
    }
}

注意事项

  • 长连接会占用服务器资源,需合理设置超时和心跳间隔
  • 生产环境建议使用成熟的 Socket 库如 ReactPHPSwoole
  • 考虑使用 pcntl_fork 或多线程处理并发连接

以上方法实现了基本的 PHP Socket 长连接功能,可根据实际需求调整心跳机制和错误处理逻辑。

标签: phpsocket
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (int…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

php 实现下载

php 实现下载

PHP 实现文件下载的方法 使用 PHP 实现文件下载可以通过设置 HTTP 头信息,强制浏览器将文件作为附件下载而非直接打开。 基本下载实现 $file_path = 'path/to/your/…

php实现推送消息推送消息

php实现推送消息推送消息

PHP 实现消息推送的方法 使用 WebSocket 实现实时推送 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时消息推送。 安装 Ratchet 库(WebSo…

php实现多态

php实现多态

多态的概念 多态是面向对象编程的三大特性之一,指同一个方法在不同类中有不同实现方式。PHP通过继承和接口实现多态。 通过继承实现多态 父类定义方法,子类重写该方法实现不同行为: class Ani…