當前位置: 首頁> 最新文章列表> 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環境的項目。對於實時性要求不高但需要及時反饋的應用場景,是一種值得採用的解決方案。