当前位置:首页 > PHP

php socket实现长连接

2026-02-13 20:58:18PHP

PHP Socket 实现长连接的方法

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

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

php socket实现长连接

$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实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php实现注册

php实现注册

注册功能实现步骤 数据库准备 创建用户表,包含字段如id、username、password、email等。示例SQL: CREATE TABLE users ( id INT AUTO_I…

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使用…

php 实现链表

php 实现链表

PHP 实现链表的方法 链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。PHP 中可以通过类和对象来实现链表。 定义链表节点类 创建一个 ListNode 类,用于表示链…

php实现注册登陆

php实现注册登陆

PHP 注册功能实现 创建数据库表结构(MySQL示例): CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, usern…

php实现多态

php实现多态

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