当前位置:首页 > PHP

php长连接实现

2026-02-27 11:08:57PHP

PHP 长连接实现方法

使用 set_time_limit 和循环保持连接

通过设置脚本执行时间限制为0,并使用循环保持连接不中断。适合简单的长连接需求。

set_time_limit(0);
while (true) {
    // 业务逻辑处理
    echo "Connection alive\n";
    ob_flush();
    flush();
    sleep(1);
}

结合 ignore_user_abort 实现后台持续运行

当浏览器关闭后脚本仍继续执行,适用于后台任务处理。

ignore_user_abort(true);
set_time_limit(0);
while (!connection_aborted()) {
    // 执行定时任务
    file_put_contents('log.txt', date('Y-m-d H:i:s')."\n", FILE_APPEND);
    sleep(5);
}

WebSocket 服务实现

使用 Ratchet 等库构建真正的全双工长连接。需要安装依赖:

composer require cboden/ratchet

服务端实现示例:

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class MyWebSocket 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) {
        // 错误处理
    }
}

$server = new \Ratchet\App('localhost', 8080);
$server->route('/ws', new MyWebSocket());
$server->run();

Swoole 扩展高性能方案

使用 PHP 的 Swoole 扩展实现高性能长连接服务:

$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);

$server->on('open', function (Swoole\WebSocket\Server $server, $request) {
    echo "connection open: {$request->fd}\n";
});

$server->on('message', function ($server, $frame) {
    $server->push($frame->fd, "Received: {$frame->data}");
});

$server->on('close', function ($server, $fd) {
    echo "connection close: {$fd}\n";
});

$server->start();

长轮询 (Comet) 技术

实现服务器推送效果,适合不支持 WebSocket 的环境:

php长连接实现

// 服务端
function waitForChange() {
    $lastUpdate = $_SESSION['lastUpdate'] ?? 0;
    while (true) {
        if (checkDataChanged($lastUpdate)) {
            return getNewData();
        }
        usleep(100000); // 100ms
        session_write_close();
        session_start();
    }
}

// 客户端通过AJAX持续请求

连接保持注意事项

  • Nginx 配置需要调整超时时间:
    proxy_read_timeout 600s;
    proxy_send_timeout 600s;
  • PHP.ini 配置建议:
    max_execution_time = 0
    default_socket_timeout = -1
  • 内存管理要谨慎,长时间运行的脚本需定期释放资源
  • 需要实现心跳机制检测连接状态
  • 考虑使用 supervisor 等工具监控进程状态

选择具体方案时需根据应用场景决定,WebSocket/Swoole 适合实时性要求高的场景,而简单轮询适合兼容性要求高的环境。

标签: php
分享给朋友:

相关文章

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session是…

php购物车实现

php购物车实现

PHP购物车实现方法 使用PHP实现购物车功能可以通过多种方式完成,以下是几种常见的实现方法: Session存储购物车数据 利用PHP的$_SESSION超全局变量存储购物车数据是最简单的方法。用…

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php mvc实现

php mvc实现

PHP MVC 实现步骤 模型(Model)层 模型负责数据处理和业务逻辑,通常与数据库交互。创建一个基类模型,其他具体模型继承它。 class Model { protected $db;…

php 实现mvc

php 实现mvc

PHP 实现 MVC 架构的方法 MVC(Model-View-Controller)是一种常见的软件设计模式,用于分离业务逻辑、用户界面和用户输入。以下是 PHP 实现 MVC 架构的关键步骤:…

php实现文章

php实现文章

PHP实现文章管理功能 在PHP中实现文章管理功能通常涉及数据库操作、表单处理和页面展示。以下是实现文章管理的基本步骤: 数据库设计 创建articles表,包含字段如id、title、conten…