当前位置:首页 > 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 的环境:

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

php实现图片上传

php实现图片上传

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

基于php的设计与实现

基于php的设计与实现

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

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/…

php队列的实现

php队列的实现

PHP队列的实现方式 PHP中实现队列功能可以通过多种方式,根据需求选择适合的方案: 使用数组实现基础队列 PHP数组本身支持队列操作,利用array_push和array_shift函数: $q…

php实现上传图片

php实现上传图片

上传图片的基本流程 PHP 实现图片上传功能需要处理文件接收、验证、保存等步骤。以下是具体实现方法。 创建 HTML 表单 在 HTML 中创建一个表单,设置 enctype="multipart/…