我目前正在開發一個即時訊息系統。但是,我的優化有問題。這是我當前的代碼:
<script>
setInterval('load_messages()', 500);
function load_messages(){
$('#messages').load('loadMessages.php');
}
</script>
除此之外,最好使用 AJAX 請求僅在定義的時間戳之后請求訊息。有沒有辦法將資料包從發送者的頁面傳遞給接收者以重繪 以避免向資料庫發送垃圾郵件。這是一個解釋我想做什么的模式:
php、apache 或 javascript 中有沒有辦法做到這一點?
謝謝閱讀
uj5u.com熱心網友回復:
您使用的技術稱為短輪詢。它基本上是向服務器發送垃圾郵件,直到服務器向您展示新的東西。看起來像:
Client: cookie?
Server: no
Client: cookie?
Server: no
Client: cookie?
Server: no
Client: cookie?
Server: yes; here's the cookie: ??
Client: cookie?
Server: no
...
正如您自己理解的那樣,這確實效率低下;我不知道有任何網站仍在使用短輪詢。
你還有其他選擇。最簡單的一種(假設您使用的是 PHP)是長輪詢。基本上,您發送一個請求,服務器只是停止請求,一旦有新訊息出現,服務器就會發回回應。這使您可以立即獲取訊息而不會發送太多訊息:
Client: tell me when you have a cookie...
[loads for 1m 32s]
Server: the cookie has come [sends response]
Client: tell me when you have a cookie...
...
但是,Apache 通過為每個請求創建一個新執行緒來處理并發請求。因此,如果您的聊天中有 2 個用戶,那很好。但是,假設您有很多房間,總共有 100,000 個用戶長時間輪詢您的服務器。您的服務器可能無法處理那么多執行緒并且會崩潰。(NodeJS 因其事件驅動的架構和內置的異步性而在實時應用程式中非常流行。)
但是還有其他更好的選擇:
- Websockets:這基本上是客戶端和服務器之間的持久(即手動關閉連接)連接,因此客戶端不必對服務器產生太多錯誤。每當服務器有訊息時,它會立即將其發送給客戶端,反之亦然。這是一篇好文章。這是實時應用程式最流行的解決方案,并由大多數聊天應用程式(如 Discord 或 Slack)實施。
- SSE(服務器發送事件):基本上,服務器可以向客戶端發送資料,而不是客戶端向服務器請求資料。如果您想知道它是如何作業的,這里是另一篇文章。
您的背景關系: SSE 在 PHP 中很容易實作,無需額外的庫;這是一個例子。另一方面,Websockets 設定起來有點復雜(可能需要像rachet這樣的第三方庫),但由于它作業得很好,這可能是我會考慮的。
您的問題: 有沒有辦法將資料包從發送者的頁面傳遞到接收者以重繪 以避免向資料庫發送垃圾郵件?如果我要準確回答您的問題,SSE。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/525753.html
上一篇:區間值之和oracle
