實時消息推送技術可以幫助網站和應用實現更高效的用戶交互體驗。例如,用戶在使用在線客服、聊天室或實時通知系統時,需要第一時間接收到來自服務器的消息。雖然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
// 數據庫連接
$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();
?>
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環境的項目。對於實時性要求不高但需要及時反饋的應用場景,是一種值得採用的解決方案。