慕神8447489
2022-05-22 17:36:29
我正在制作一個基本的聊天室。我的代碼:$conn = ("127.0.0.1","root","","mymessages");$stmt = "SELECT * FROM posts ORDER BY timestamp LIMIT 100";$result = mysqli_query($conn, $stmt);if(!$result) { echo("Query failed" . mysqli_error());}while ($row = mysqli_fetch_assoc($result)) { $messagefname = $row['fname']; $messagelname = $row['lname']; $subject = $row['subject']; $content = $row['content']; $day = $row['day']; $month = $row['month']; $year = $row['year']; $hour = $row['hour']; $min = $row['minute']; echo("<font size='1.5' face='Arial'>"); echo("Sent by " . $messagefname . " " . $messagelname . " at " . $hour . ":" . $min. " on " . $day . "/" . $month . "/" . $year . "<br>"); echo("</font><br><font size='4' face='Arial'><b>"); echo($subject); echo("</font><br><font size='3' face='Arial'></b>"); echo($content); echo("</font><br><br><hr><br>");}每次刷新頁面時,此更新以及自上次刷新后添加的所有記錄都會添加到列表中。在聊天室中,這并不理想,那么有沒有辦法讓它不斷檢查新記錄,同時盡可能少地對用戶造成干擾?謝謝!
1 回答
子衿沉夜
TA貢獻1828條經驗 獲得超3個贊
你被當前的技術??ㄗ×恕ySQL 沒有任何好的方法可以向您推送有新內容可看的通知。
(您可以考慮添加一個消息隊列子系統,例如 RabbitMQ,但這需要對應用程序的結構進行重大更改)。
以盡可能低的成本處理輪詢的一些準則。
將用戶期望設置為消息延遲幾秒鐘而不是毫秒。
盡可能頻繁地查詢以滿足對延遲的期望。
避免每次查詢都查詢大量數據。你怎么能那樣做?
一種。每次運行查詢時保存最新的時間戳
灣。不要使用
SELECT *. 而是給出您實際需要的列的名稱。這讓 MySQL 的優化器有助于降低查詢成本。C。進行查詢,
SELECT whatever WHERE timestamp > saved_timestamp ORDER BY timestamp這樣您就只能按順序從表中獲取新項目。如果您的系統不是很忙,這些 SELECT 通常不會返回任何行。那挺好的。d。確保在時間戳和 SELECT 語句中的其他列上有一個多列索引。這稱為覆蓋指數。
e. 打開與 MySQL 的連接后,立即發出此 SQL 語句。它可以讓 MySQL 獲取您的數據,而不會與其他向表中插入行的 MySQL 客戶端爭用。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
如果您在用戶的瀏覽器中使用 AJAX 執行此操作,您希望在 AJAX 請求中包含最新的時間戳,以便您可以向每個用戶的瀏覽器提供所需的新項目。
添加回答
舉報
0/150
提交
取消
