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

PHP 百行代碼構建簡易聊天室:無資料庫、檔案存儲、即時刷新

     編輯:PHP 相關知識

專案特色

  • 單檔案 chat.php 約 100 行完成核心功能
  • 無需資料庫,採用文字檔(chat.txt、online.txt)存儲
  • 支援登入、發言、線上名單、IP/時間記錄、字體顏色、URL 自動轉連結、自訂標題與跑馬燈廣告
  • 適合個人學習、小型內部溝通

核心常數定義

define("SCRIPT", $_SERVER['SCRIPT_NAME']);
define("CHAT_NOTE", "./chat.txt");      // 聊天記錄檔
define("ONLINE_LIST", "./online.txt");  // 線上用戶檔
define("REF_TIME", 5);                  // 刷新間隔(秒)
define("CHAT_NAME", "黑夜路人聊天室");
define("AD_MSG", "今天是中國情人節, 祝大家情人節快樂!!");

流程控制邏輯

透過 $_GET['action'] 參數分派:

action功能
(空)顯示登入表單
login驗證暱稱、寫入 Session、記錄線上、跳轉 chat
chat主介面:iframe 嵌入 show(訊息區) + say(輸入區) + 跑馬燈
show讀取 chat.txt、顯示訊息、自動刷新
say發言表單、JS 檢查、顏色選擇
save寫入訊息至 chat.txt、記錄時間/IP
logout清除 Session、移除線上名單

關鍵函式實作

1. 取得客戶端 IP

function get_client_ip() {
    if (getenv("HTTP_CLIENT_IP")) return getenv("HTTP_CLIENT_IP");
    if (getenv("HTTP_X_FORWARDED_FOR")) return getenv("HTTP_X_FORWARDED_FOR");
    if (getenv("REMOTE_ADDR")) return getenv("REMOTE_ADDR");
    return "UNKNOWN";
}

2. 線上名單管理

function save_online($user, $ip) {
    $fp = fopen(ONLINE_LIST, "a");
    fwrite($fp, "$user|$ip|".time()."\n");
    fclose($fp);
}

function get_online_sum() {
    $arr = file(ONLINE_LIST);
    $now = time();
    $online = array();
    foreach ($arr as $line) {
        list($u, $ip, $t) = explode("|", $line);
        if ($now - $t < 60) $online[$u] = $line; // 60秒無動作視為離線
    }
    // 重寫檔案保留活躍用戶
    $fp = fopen(ONLINE_LIST, "w");
    foreach ($online as $line) fwrite($fp, $line);
    fclose($fp);
    return count($online);
}

3. 訊息儲存與 URL 轉連結

function save_chat($msg, $user) {
    $msg = htmlspecialchars($msg);           // 防 XSS
    $msg = preg_replace('/(https?:\/\/[^\s]+)/', '$1', $msg); // URL轉連結
    $line = "[".date("H:i:s")."] [$user] $msg\n";
    file_put_contents(CHAT_NOTE, $line, FILE_APPEND);
}

4. 顯示區自動刷新

<iframe src="?action=show" name="show_win" width="800" height="450" scrolling="auto" frameborder="0"></iframe>
// show.php 內部:
header("Refresh: ".REF_TIME); // 每5秒刷新
echo file_get_contents(CHAT_NOTE);

前端介面亮點

  • Frameset/Iframe 架構:主視窗分為訊息顯示區(自動刷新)與輸入區(獨立提交),避免整頁重載
  • 跑馬燈廣告:<marquee> 顯示自訂訊息
  • 顏色選擇:輸入框 style="background:#99CC99",可擴充色板

安全與擴充建議

  • 檔案鎖定:併發寫入時使用 flock() 防止資料損壞
  • 訊息清理:定時任務清理過舊記錄,避免檔案過大
  • 私聊/房間:引入 room_id 欄位,檔案分離或資料庫化
  • WebSocket 升級:替換輪詢為長連接,大幅降低延遲與伺服器負載
  • 輸入驗證:長度限制、敏感詞過濾、CSRF Token

總結

這個「百行聊天室」展示了 PHP 處理即時通訊的基本原理:Session 識別身分、檔案存儲狀態、Iframe 分區刷新、簡單廣播機制。雖然生產環境不建議直接使用,但作為理解「狀態管理、即時更新、併發控制」核心概念的教學範例極具價值。

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