2010-01-02 59 views
0

我使用PHP和JavaScript聊天進行了聊天,並且有一個斷開連接按鈕,可以將用戶從聊天中刪除,並首先將其從用戶列表中刪除。但是,如果用戶關閉瀏覽器,那麼他將留在用戶列表中。我如何檢查他是否離開?檢查用戶是否關閉了PHP中的頁面?

這個必須完成沒有在頁面關閉在JS中的任何句柄,因爲如果用戶殺死瀏覽器,他將繼續聊天。

順便說一句,JS腳本總是向PHP頁面發送一個請求,它不斷地檢查循環中的新消息,當有一些時候,腳本將它們打印出來並退出。然後再重複一遍。

編輯:我如何在PHP中做心跳事件?如果用戶關閉頁面,腳本執行將被終止,因此我們將無法檢查用戶是否仍然使用相同的腳本進行連接。

+0

如果您進行了聊天,那您爲什麼不能修改客戶端代碼? – 2010-01-02 20:57:25

+0

我製作了服務器腳本,但沒有製作客戶端腳本 – 2010-01-02 21:03:28

回答

3

對不起,沒有可靠的方式來做到這一點,這就是HTTP構建的方式 - 這是一個「拉」協議。 我能想到的唯一解決方案是「有效」和登錄客戶端必須以非常小的間隔查詢服務器。如果他們不這樣做,他們會被註銷。

2

您可以每5秒發送一次微小的ajax呼叫到您的服務器。和不這樣做的用戶不再在房間裏

+0

有兩種優化方式:如果您願意處理大量同時(但空閒)連接(apache + php並不擅長,但彗星是)選擇長輪詢意味着你只會在幾分鐘內創建一個連接,並且你將獲得關於連接下降的最新知識。另一方面,如果您定期進行心跳檢查,您將建立並拆除更多連接,但您可能在任何特定時間打開更少的連接。另外,您的輪詢時間間隔將決定您發現丟棄缺陷的分辨率 – 2010-01-02 21:35:25

0

如果由於某種原因無法修改JS代碼,那麼您確實很少能做到。只有你可以使用來做的事情是檢查是否有超過15分鐘的距離,從最後一次活動,用戶已經離開。但這絕不是一件明智的事情,用戶可能只是坐着看對話15分鐘。

只有正確的做法是在設定的時間間隔內使用AJAX輪詢,如果您想要做到可靠。

您注意到用戶不斷地輪詢新服務器的服務器,難道你不能用它來檢測用戶是否已經離開了嗎?

1

您回答了您自己的問題:如果您未在給定的時間長度(超過幾秒)內檢測到來自用戶的新消息的請求,則他們離開了房間。

HTTP的性質決定了你需要做一些AJAX類型的通信。如果你不想聽「給我更多的消息」請求(不知道你爲什麼不想),然後建立一個心跳類型的溝通。

0

維護服務器上活動用戶的列表,以及他們最後一次連接到聊天以請求新消息。

當用戶連接到檢查消息時更新他們的時間。

每當您的代碼運行迭代通過此列表並刪除未連接太久的用戶。

唯一的失敗是,如果通道中的用戶數量降至零,服務器將不會注意到有人回來。

0

要解決您的編輯問題,可以使用ignore_user_abort來忽略客戶端終止。

0

使用JavaScript u能做到以下幾點:

<script type="text/javascript"> 

window.onunload = unloadPage; 

function unloadPage() 
{ 
alert("unload event detected!"); 
} 
</script> 

請在unloadPage()函數必要的Ajax調用UR PHP腳本

0

請求一個PHP腳本,去一點點這樣的事情,與AJAX:

register_shutdown_function("disconnect_current_user"); 
header('Content-type: multipart/x-mixed-replace; boundary="pulse"'); 

while(true) { 
    echo "--pulse\r\n.\r\n"; 
    sleep(2); 
} 

這樣一來,你就不會不斷地打開/關閉連接。

相關問題