本文展示如何結合 PHP 後端、jQuery 前端、AJAX 輪詢與數字滾動動畫,打造一個無需刷新頁面即可即時更新的「在線人數」展示組件。適用於統計大屏、直播間人氣展示、電商促銷場景等。
<div class="count">
當前在線:<span id="number"></span>
</div>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script>
// 1. 數字滾動動畫函數
function magic_number(value) {
var $num = $("#number");
$num.animate({count: value}, {
duration: 500,
step: function() {
$num.text(String(parseInt(this.count)));
}
});
}
// 2. AJAX 輪詢更新函數
function update() {
$.getJSON("number.php?jsonp=?", function(data) {
magic_number(data.n); // data.n 為後端返回的在線人數
});
}
// 3. 啟動:首次執行 + 每 5 秒輪詢
update();
setInterval(update, 5000);
</script>
animate({count: value}):利用 jQuery 自定義屬性動畫,從當前數字平滑過渡到目標值step 回調:每幀執行,將中間值取整後更新 DOM 文本duration: 500:動畫持續 500ms,體驗流暢不拖沓<?php
// 實際項目中應查詢 Redis/Memcached/數據庫獲取真實在線數
// 此處用隨機數模擬演示
$total_data = array('n' => rand(0, 999));
// 支持 JSONP 跨域調用
$callback = isset($_GET['jsonp']) ? $_GET['jsonp'] : 'callback';
header('Content-Type: application/javascript; charset=utf-8');
echo $callback . '(' . json_encode($total_data) . ')';
?>
| 優化方向 | 具體方案 |
|---|---|
| 數據存儲 | Redis `INCR`/`DECR` + `EXPIRE` 維護在線鍵,或 Sorted Set 存儲用戶最後活躍時間 |
| 推送替代輪詢 | WebSocket (Workerman/Swoole) 或 Server-Sent Events (SSE) 實現真正服務端推送 |
| 前端性能 | 使用 `requestAnimationFrame` 替代 `animate`,或引入 countUp.js 等專業庫 |
| 緩存策略 | Nginx `proxy_cache` 緩存 PHP 響應 1-2 秒,減輕後端壓力 |
| 錯誤處理 | 前端 `$.getJSON().fail()` 重試機制,後端異常返回固定結構 `{n: 0, error: ''}` |
project/ ├── index.html # 包含 HTML + JS 代碼 └── number.php # 後端數據接口
這個方案以「極簡代碼、零依賴、即插即用」為特點,適合快速原型驗證或中小型項目。隨著業務增長,建議逐步演進至 WebSocket 架構以獲得更低延遲與更高併發承載能力。