傳統聊天室常用 `
<frameset rows="80,*,100" cols="*" border="1" framespacing="0"> <frame src="top.php" name="topFrame" scrolling="no" noresize> <frameset rows="*" cols="168,*"> <frame src="list.php" name="leftFrame" scrolling="no"> <frameset rows="70%,*"> <frame src="center.php" name="mainFrame" scrolling="auto"> <frame src="private.php" name="priFrame" scrolling="auto"> </frameset> </frameset> <frame src="talk.php" name="bottomFrame" scrolling="no" noresize> </frameset>
現代替代:CSS Flex/Grid + AJAX 長輪詢 / WebSocket,單頁應用 (SPA) 體驗更佳。
<?php function appendChat($file, $data) { $fp = fopen($file, 'a'); // 追加 if ($fp) { flock($fp, LOCK_EX); // 獨佔鎖 fwrite($fp, $data . "\n"); flock($fp, LOCK_UN); fclose($fp); } } // 讀取最近 50 行 function readLastLines($file, $lines = 50) { $all = file($file, FILE_IGNORE_NEW_LINES); return array_slice($all, -$lines); } ?>
<script> // 每 30 秒檢查一次,移除超過 60 秒無發言的用戶 function cleanupUsers() { fetch('cleanup.php?action=remove_idle&timeout=60') .then(r => r.json()) .then(data => { if (data.removed) refreshUserList(); }); } setInterval(cleanupUsers, 30000); // 30 秒 // 單次延遲執行 (如顯示提示 3 秒後消失) setTimeout(() => { alertBox.style.display = 'none'; }, 3000);
後端 cleanup.php 讀取用戶檔案,比對最後活躍時間戳,移除逾期者並重寫檔案。
cleanup.php
<script> function scrollWindow() { window.scrollTo(0, document.body.scrollHeight); // 或極大值 99999 setTimeout(scrollWindow, 200); } scrollWindow(); </script>
<div id="msgList" style="height:300px; overflow-y:auto;">...</div> <script> function scrollMsgList() { const el = document.getElementById('msgList'); el.scrollTop = el.scrollHeight; setTimeout(scrollMsgList, 200); } scrollMsgList(); </script>
結論:前端無法可靠防刷新,正確做法是後端設計**冪等 API**、**Token 防重複提交**、**WebSocket 狀態同步**,讓刷新不造成資料重複或狀態錯亂。
htmlspecialchars()
兩種分頁總數查詢寫法 -- 方案 A:兩次查詢 SELECT
前言:Mac 上搭建本地伺服器的痛點 許多從 Windows
前言 目錄操作是 PHP 檔案系統管理的基礎。本文涵蓋建立/
遷移背景 在 PHP 7 環境安裝 ECShop V2.7.