本教程展示如何用約 100 行 PHP 代碼構建一個功能完整的簡易聊天室,包含用戶登錄、實時聊天、在線用戶統計、字體顏色自定義、URL 自動轉鏈接、公告跑馬燈等實用功能。採用文本文件作為存儲介質,適合學習 PHP 基礎、Session 處理、文件操作及前端交互。
<?php
error_reporting(E_ALL ^ E_NOTICE);
session_start();
header("Content-Type: text/html; charset=utf-8");
define("SCRIPT", $_SERVER['SCRIPT_NAME']);
define("CHAT_NOTE", "./chat.txt"); // 聊天記錄文件
define("ONLINE_LIST", "./online.txt"); // 在線用戶文件
define("REF_TIME", 5); // 刷新間隔(秒)
define("CHAT_NAME", "PHP 簡易聊天室");
define("AD_MSG", "歡迎來到聊天室!"); // 公告信息
?>
通過 $_GET['action'] 分發不同邏輯:
login:處理用戶登錄,寫入 Session 與在線列表chat:主聊天界面,嵌入顯示框與發送框show:輪詢讀取聊天記錄並渲染say:發送消息表單,含顏色選擇器save:保存消息到文件,處理 URL 自動鏈接化logout:清理 Session 與在線列表// 獲取客戶端真實 IP
function get_client_ip() {
foreach (['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'] as $key) {
if (!empty($_SERVER[$key])) return $_SERVER[$key];
}
return 'unknown';
}
// 保存在線用戶
function save_online($username, $ip) {
$line = "$username|$ip|" . time() . "\n";
file_put_contents(ONLINE_LIST, $line, FILE_APPEND | LOCK_EX);
}
// 獲取在線人數(清理超時用戶)
function get_online_sum() {
$data = file(ONLINE_LIST, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$now = time();
$valid = [];
foreach ($data as $line) {
[$user, $ip, $time] = explode('|', $line);
if ($now - $time < REF_TIME * 3) $valid[] = $line;
}
file_put_contents(ONLINE_LIST, implode("\n", $valid) . "\n", LOCK_EX);
return count($valid);
}
// URL 自動轉超鏈接
function auto_link($text) {
return preg_replace(
'/(https?:\/\/[^\s]+)/i',
'$1',
$text
);
}
採用 <iframe> 分離顯示區與輸入區,配合 meta refresh 或 JS 定時器實現準實時刷新:
<!-- chat 界面主框架 -->
<div style="border:1px solid #999; width:800px; height:450px;">
<iframe src="?action=show" name="show_win" width="100%" height="100%" frameborder="0"></iframe>
</div>
<marquee width="70%">= AD_MSG ?></marquee>
<span>當前在線:= get_online_sum() ?></span>
<iframe src="?action=say" name="say_win" width="800" height="60" frameborder="0"></iframe>
chat.txt、online.txt 並設置可寫(如 0666)htmlspecialchars)、CSRF 保護、敏感詞過濾註:本示例為教學演示,生產環境請務必加強安全防護,建議使用成熟框架(Laravel、ThinkPHP)配合 Redis + WebSocket 重構。