当前位置:首页 > PHP

php 实现长连接

2026-04-02 22:28:34PHP

使用 header() 函数实现长连接

在 PHP 中,可以通过设置 HTTP 头信息 Connection: keep-aliveKeep-Alive: timeout=x, max=y 来实现长连接。示例代码如下:

header("Connection: keep-alive");
header("Keep-Alive: timeout=60, max=1000");
  • timeout=60 表示连接保持 60 秒。
  • max=1000 表示最多允许 1000 次请求复用同一个连接。

使用 ob_flush()flush() 保持连接

在长连接场景下(如实时数据推送),可以使用输出缓冲机制保持连接不中断:

// 关闭输出缓冲
if (ob_get_level() > 0) {
    ob_end_flush();
}

// 推送数据
while (true) {
    echo "Data: " . date("Y-m-d H:i:s") . "\n";
    ob_flush();
    flush();
    sleep(1); // 每秒推送一次
}

结合 WebSocket 实现持久连接

PHP 原生不支持 WebSocket,但可以通过以下方式实现:

php 实现长连接

  1. 使用 Ratchet(推荐):
    安装 Ratchet:

    composer require cboden/ratchet

    示例服务端代码:

    php 实现长连接

    use Ratchet\Server\IoServer;
    use Ratchet\Http\HttpServer;
    use Ratchet\WebSocket\WsServer;
    use MyApp\Chat; // 自定义处理类
    
    require dirname(__DIR__) . '/vendor/autoload.php';
    
    $server = IoServer::factory(
        new HttpServer(new WsServer(new Chat())),
        8080
    );
    $server->run();
  2. 自定义 WebSocket 处理类

    namespace MyApp;
    use Ratchet\MessageComponentInterface;
    use Ratchet\ConnectionInterface;
    
    class Chat implements MessageComponentInterface {
        public function onOpen(ConnectionInterface $conn) {
            // 新连接逻辑
        }
        public function onMessage(ConnectionInterface $from, $msg) {
            // 处理消息
        }
        public function onClose(ConnectionInterface $conn) {
            // 连接关闭逻辑
        }
        public function onError(ConnectionInterface $conn, \Exception $e) {
            // 错误处理
        }
    }

使用 fsockopen 实现 TCP 长连接

适用于非 HTTP 协议的持久连接:

$socket = fsockopen("tcp://example.com", 8080, $errno, $errstr, 30);
if (!$socket) {
    die("Failed: $errstr ($errno)");
}

// 发送数据
fwrite($socket, "PING\n");
// 接收响应
while (!feof($socket)) {
    echo fgets($socket, 128);
}
fclose($socket);

注意事项

  • Nginx/Apache 配置:确保服务器支持长连接(如 Nginx 的 keepalive_timeout)。
  • 资源消耗:长连接会占用服务器资源,需合理设置超时和最大请求数。
  • WebSocket:需依赖外部库或扩展(如 RatchetSwoole)。

以上方法可根据实际场景选择,HTTP 长连接适合短时复用,WebSocket 适合实时双向通信。

标签: php
分享给朋友:

相关文章

php实现文件上传

php实现文件上传

文件上传的基本实现 在PHP中实现文件上传需要使用$_FILES超全局数组处理上传的文件数据。表单必须设置enctype="multipart/form-data"属性,并采用POST方法提交。 创…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="upload…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $image…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…