首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 秒殺倒計時:服務器時間同步 + JavaScript 實時渲染

     編輯:PHP 綜合知識

需求分析

  • 顯示 時:分:秒 實時倒計時
  • 以服務器時間為準,用戶端修改本地時間不影響
  • 避免每秒 AJAX 請求服務器

解決方案

核心思路:PHP 一次性計算「服務器當前時間」與「活動結束時間」的差值(秒),輸出給 JS;JS 以此為基準,每秒遞減渲染。誤差僅源於網絡傳輸延遲(通常 <1s),可接受。

完整代碼

<?php
date_default_timezone_set('PRC'); // 設置時區

$starttimestr = "08:00:00";
$endtimestr   = "22:00:00";
$starttime = strtotime($starttimestr);
$endtime   = strtotime($endtimestr);
$nowtime   = time();

if ($nowtime < $starttime) {
    die("活動還沒開始,活動時間:{$starttimestr} 至 {$endtimestr}");
}
$lefttime = $endtime - $nowtime; // 剩餘秒數
?>

<script>
var runtimes = 0;
function GetRTime() {
    var nMS = <?=$lefttime?> * 1000 - runtimes * 1000;
    var nH = Math.floor(nMS / (1000*60*60)) % 24;
    var nM = Math.floor(nMS / (1000*60)) % 60;
    var nS = Math.floor(nMS / 1000) % 60;

    document.getElementById("RemainH").innerHTML = nH;
    document.getElementById("RemainM").innerHTML = nM;
    document.getElementById("RemainS").innerHTML = nS;

    if (nMS > 5*59*1000 && nMS <= 5*60*1000) {
        alert("還有最後五分鐘!");
    }
    runtimes++;
    setTimeout("GetRTime()", 1000);
}
window.onload = GetRTime;
</script>

<h4><strong id="RemainH">XX</strong>:<strong id="RemainM">XX</strong>:<strong id="RemainS">XX</strong></h4>

關鍵點解析

  1. 時區設置:date_default_timezone_set('PRC') 確保服務器時間正確
  2. 時間差計算:PHP 端用 time()(秒),JS 端轉毫秒(*1000)
  3. 客戶端校正:runtimes 記錄已運行秒數,抵消 setTimeout 不精確帶來的漂移
  4. 活動時間窗口:未開始直接退出,結束後邏輯可自行擴展

進階優化建議

  • 使用 Date.now() + performance.now() 替代累加計數,精度更高
  • 活動結束前推送 WebSocket 通知,避免輪詢
  • 高併發場景下,將倒計時邏輯前置至 CDN/邊緣節點,減輕源站壓力
  • 結合 Redis/Lua 腳本實現原子級庫存扣減,防止超賣
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved