承接上篇,本文實作「使用者心跳更新」與「新訊息即時彈窗」兩大核心機制,完成一個可用的最小化即時通訊雛形。
在主頁面嵌入零尺寸 <iframe>,每 15 秒自動重載 userflush.php:
<iframe name="flush" src="userflush.php"
width="0" height="0" frameborder="0"
scrolling="no" marginwidth="0" marginheight="0"></iframe>
此法在 AJAX 普及前極為常見,現代建議改用 fetch() / WebSocket。
userflush.php 完整邏輯<?php
session_start();
// 資料庫連線建議改用 mysqli/PDO
mysql_connect('localhost', '', '');
mysql_select_db('php2000');
$currentUser = $_SESSION['username'] ?? ''; // 假設登入後存入 session
// 1. 檢查是否有未讀私人訊息
$query = "SELECT id FROM forumtalk
WHERE readsign = 0 AND receiver = '" . mysql_real_escape_string($currentUser) . "'";
$result = mysql_query($query);
if (mysql_num_rows($result) > 0) {
$msg = mysql_fetch_assoc($result);
$talkId = $msg['id'];
// 彈出新視窗顯示訊息
echo "<script>window.open('shortalk.php?action=view&talknumber=$talkId', '_blank', 'width=300,height=250');</script>";
}
// 2. 更新當前使用者最後活動時間(心跳)
mysql_query("UPDATE userinfo SET CurrentDate = " . time() . " WHERE Name = '" . mysql_real_escape_string($currentUser) . "'");
// 3. 15 秒後自動重載自身
echo "<meta http-equiv='refresh' content='15;url=userflush.php'>";
?>
forumtalk,發現 readsign=0 且 receiver 為當前用戶的記錄,即以 window.open 彈出聊天視窗。userinfo.CurrentDate,前端列線上名單時以「現在時間 - CurrentDate < 120 秒」判定在線。$currentUser 做嚴格驗證,並使用預處理語句防止 SQL 注入。setInterval(fetch('/api/poll'), 15000),後端回傳 JSON。WebSocket(如 Workerman、Swoole)實現真正的伺服器推送,降低延遲與伺服器負載。readsign=1。兩篇文章完整呈現了早期 PHP 聊天室的經典架構:資料庫設計、線上狀態維護、訊息輪詢彈窗。雖然技術棧已過時,但「心跳+輪詢」的核心思想在長輪詢、Server-Sent Events、WebSocket 等現代技術中依然可見影子。