当前位置: 首页> 最新文章列表> PHP实时消息推送实现案例详解(基于长轮询)

PHP实时消息推送实现案例详解(基于长轮询)

gitbox 2025-08-05

案例背景

实时消息推送技术可以帮助网站和应用实现更高效的用户交互体验。例如,用户在使用在线客服、聊天室或实时通知系统时,需要第一时间接收到来自服务器的消息。虽然WebSocket是目前主流的实时通信技术,但由于部分服务器或环境支持不佳,使用PHP结合长轮询的方案,依然是实用且可行的替代方式。

实时消息推送的原理

消息推送的关键在于保持客户端与服务器之间的持续通信。传统的HTTP通信是单向请求响应,而长轮询则通过在客户端发出请求后,服务器延迟响应,从而实现近似实时的效果。

长轮询的工作流程

长轮询的通信过程可以分为以下几个步骤:

  • 客户端发送一个请求到服务器。
  • 服务器判断是否有新的消息可用。
  • 如果有新消息,立即返回消息数据。
  • 如果没有消息,服务器保持连接并等待新的消息生成。
  • 等待超时或有消息后,服务器返回响应。
  • 客户端接收到响应后立即再次发送请求,形成轮询循环。

系统实现步骤

创建数据库表

我们首先需要设计一个用于存储消息的数据库表。例如,可以创建如下的“messages”表:


CREATE TABLE messages (
  id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  content VARCHAR(255) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

前端页面开发

前端页面用于展示推送过来的实时消息,可以使用HTML与JavaScript配合jQuery进行处理:


<!DOCTYPE html>
<html>
<head>
  <title>实时消息推送</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="app.js"></script>
</head>
<body>
  <div id="messages"></div>
</body>
</html>

后端处理逻辑

后端PHP代码负责处理长轮询逻辑与数据响应。我们可以创建一个名为 index.php 的文件,处理前端发起的请求。

基本PHP处理示例


<?php
// 数据库连接
$conn = new mysqli("localhost", "用户名", "密码", "数据库名");
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 获取上次接收到的最后一条消息ID
$lastId = isset($_GET['last_id']) ? intval($_GET['last_id']) : 0;
$timeout = 30; // 最多等待30秒
$startTime = time();

while (true) {
    $sql = "SELECT * FROM messages WHERE id > $lastId ORDER BY id ASC";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        $messages = [];
        while($row = $result->fetch_assoc()) {
            $messages[] = $row;
        }
        echo json_encode(["status" => "success", "data" => $messages]);
        break;
    } else {
        // 每隔1秒检查一次是否有新消息,避免服务器压力过大
        sleep(1);
    }

    if ((time() - $startTime) > $timeout) {
        echo json_encode(["status" => "timeout", "data" => []]);
        break;
    }
}
$conn->close();
?>

前端轮询脚本(app.js)


let lastId = 0;
function fetchMessages() {
  $.ajax({
    url: 'index.php',
    type: 'GET',
    data: { last_id: lastId },
    success: function(response) {
      if (response.status === 'success') {
        response.data.forEach(function(msg) {
          $('#messages').append('<p>' + msg.content + '</p>');
          lastId = msg.id;
        });
      }
      fetchMessages();
    },
    error: function() {
      setTimeout(fetchMessages, 3000);
    }
  });
}

$(document).ready(function() {
  fetchMessages();
});

总结

通过以上方式,我们使用PHP和长轮询技术成功构建了一个基础的实时消息推送系统。该方案具有良好的兼容性和较低的开发门槛,适用于不支持WebSocket环境的项目。对于实时性要求不高但需要及时反馈的应用场景,是一种值得采用的解决方案。