chat.php 約 100 行完成核心功能chat.txt、online.txt)存儲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、移除線上名單 |
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";
}
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);
}
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);
}
<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);
<marquee> 顯示自訂訊息style="background:#99CC99",可擴充色板flock() 防止資料損壞room_id 欄位,檔案分離或資料庫化這個「百行聊天室」展示了 PHP 處理即時通訊的基本原理:Session 識別身分、檔案存儲狀態、Iframe 分區刷新、簡單廣播機制。雖然生產環境不建議直接使用,但作為理解「狀態管理、即時更新、併發控制」核心概念的教學範例極具價值。