当前位置:首页 > PHP

php socket实现长连接

2026-01-28 22:49:53PHP

PHP Socket 实现长连接的方法

使用 stream_socket_server 创建服务器端

在 PHP 中可以通过 stream_socket_server 创建一个 TCP 服务器。以下是一个简单的服务器端实现:

$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
    die("$errstr ($errno)");
}

while (true) {
    $conn = stream_socket_accept($socket, -1);
    if ($conn) {
        while (true) {
            $data = fread($conn, 1024);
            if (!$data) break;
            echo "Received: $data";
            fwrite($conn, "Server response: $data");
        }
        fclose($conn);
    }
}

客户端保持长连接

客户端可以使用 stream_socket_client 建立连接并保持长连接:

$socket = stream_socket_client("tcp://127.0.0.1:8000", $errno, $errstr, 30);
if (!$socket) {
    die("$errstr ($errno)");
}

stream_set_blocking($socket, 0);
stream_set_timeout($socket, 0);

while (true) {
    fwrite($socket, "Hello Server\n");
    $data = fread($socket, 1024);
    if ($data) {
        echo "Received: $data";
    }
    sleep(1);
}

心跳机制实现

为了维持长连接,通常需要实现心跳机制:

php socket实现长连接

// 服务器端心跳检测
$lastActive = time();
while (true) {
    $data = fread($conn, 1024);
    if ($data) {
        $lastActive = time();
        // 处理数据
    } elseif (time() - $lastActive > 30) {
        // 超时断开
        fclose($conn);
        break;
    }
}

非阻塞模式设置

设置非阻塞模式可以避免连接阻塞:

stream_set_blocking($socket, 0);

多进程处理连接

使用 pcntl_fork 可以实现多进程处理多个连接:

php socket实现长连接

while (true) {
    $conn = stream_socket_accept($socket, -1);
    $pid = pcntl_fork();
    if ($pid == -1) {
        die('Could not fork');
    } elseif ($pid) {
        // 父进程
        continue;
    } else {
        // 子进程处理连接
        handleConnection($conn);
        exit;
    }
}

使用 socket_select 处理多连接

更高效的方式是使用 socket_select 处理多个连接:

$read = [$socket];
$write = $except = null;

while (true) {
    $changed = $read;
    if (socket_select($changed, $write, $except, 0) > 0) {
        foreach ($changed as $sock) {
            if ($sock === $socket) {
                $conn = stream_socket_accept($socket);
                $read[] = $conn;
            } else {
                $data = fread($sock, 1024);
                if (!$data) {
                    fclose($sock);
                    unset($read[array_search($sock, $read)]);
                }
                // 处理数据
            }
        }
    }
}

错误处理和资源释放

确保正确处理错误和释放资源:

register_shutdown_function(function() use ($socket) {
    fclose($socket);
});

性能优化建议

对于高性能场景,建议考虑以下优化:

  • 使用 libevent 或 ev 扩展
  • 考虑使用 Swoole 等高性能 PHP 网络框架
  • 适当调整缓冲区大小
  • 实现连接池管理

以上方法提供了在 PHP 中实现 Socket 长连接的基本框架,可以根据实际需求进行调整和扩展。

标签: phpsocket
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Session…

基于php的设计与实现

基于php的设计与实现

PHP 设计与实现的关键要素 环境搭建与框架选择 PHP开发需配置服务器环境(如Apache/Nginx)、PHP版本(建议7.4+)及数据库(MySQL/MariaDB)。主流框架包括Laravel…