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

模擬 OICQ 即時通訊系統:狀態掃描與訊息推送(下)

     編輯:PHP 綜合知識

前言

承接上篇,本文實作「使用者心跳更新」與「新訊息即時彈窗」兩大核心機制,完成一個可用的最小化即時通訊雛形。

一、隱藏框架定時掃描架構

在主頁面嵌入零尺寸 <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'>";
?>

三、關鍵流程說明

  1. 訊息輪詢:每 15 秒查詢一次 forumtalk,發現 readsign=0 且 receiver 為當前用戶的記錄,即以 window.open 彈出聊天視窗。
  2. 心跳機制:同步更新 userinfo.CurrentDate,前端列線上名單時以「現在時間 - CurrentDate < 120 秒」判定在線。
  3. 安全性補充:實務上必須對 $currentUser 做嚴格驗證,並使用預處理語句防止 SQL 注入。

四、現代化改造建議

  • 將輪詢改為 setInterval(fetch('/api/poll'), 15000),後端回傳 JSON。
  • 引入 WebSocket(如 Workerman、Swoole)實現真正的伺服器推送,降低延遲與伺服器負載。
  • 訊息已讀狀態可在前端閱讀時以 AJAX 回寫 readsign=1。

總結

兩篇文章完整呈現了早期 PHP 聊天室的經典架構:資料庫設計、線上狀態維護、訊息輪詢彈窗。雖然技術棧已過時,但「心跳+輪詢」的核心思想在長輪詢、Server-Sent Events、WebSocket 等現代技術中依然可見影子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved