2012-12-08 88 views
8

我正在研究基於PHP/MySQL/Javascript的在線國際象棋遊戲。我遇到的一個問題是用戶在一端關閉瀏覽器的可能性。有什麼方法可靠地檢測到某人是否閒置/關閉了頁面?任何方式來檢查是否有人用Javascript/PHP關閉了瀏覽器?

作爲一個額外的複雜性,我們學校的服務器不支持cron作業-_-

+4

簡短的回答:**電話**但你仍然可以定期ping通用戶檢查 –

+1

記住,這依賴於事實,即用戶** **讓平次去 –

+0

你這是什麼意思查驗用戶? – user1880610

回答

2

唯一可靠的方式做到這一點是使用ping命令技術到你的服務器,與其他評論者建議。這樣你就可以控制遊戲,而不是瀏覽器。你必須「跟蹤」用戶的方式是發起一次AJAX呼叫......我認爲每5秒往往足夠......到服務器。所有這些操作都是將某些內容插入到「跟蹤」表中或更新您在「遊戲」表中創建的新列,以跟蹤用戶最後一次擁有服務器活動的時間(忽略遊戲中的正常動作......您可以對正常移動執行相同的過程,並重置ping的時間間隔,以避免過度檢查)。因此,每當用戶進行移動(或其他需要服務器交互的其他內容)時,您都必須檢查其對手上次服務器活動的時間 - 如果對手在7秒內沒有進行移動當前時間,那麼對手的瀏覽器已停止通信(無論出於何種原因)。我說7秒的原因是因爲服務器/數據庫通信發生的額外處理以及任何可能的網絡滯後。由於網絡滯後可能是瓶頸,您可能希望增加該值以像10

+0

謝謝你的合理迴應!我沒有想到在SO -_- – user1880610

+0

上會有這麼多的爭吵。現在,對於一個單獨的問題:這個解決方案依賴於一個用戶處於活動狀態。我有一個大廳,顯示所有可用的遊戲。服務器可以通過任何方式判斷兩個玩家是否都離開了,這樣我就不必在大廳裏顯示那個遊戲了?這裏缺乏cron成爲一個問題。 – user1880610

+0

這是我不同意你簡單地使用AJAX進行多人遊戲的方法。這應該全部用websockets完成,你不需要輪詢和類似的東西。 Cronjobs真的沒有幫助(除非您的大廳頁面也使用輪詢,但是這樣做使得它們變得沒有必要),因爲服務器無法將消息發送到客戶端。就像在遊戲中AJAX輪詢的解決方案一樣,你必須在大廳裏做類似的事情。大廳頁面必須像以前一樣每5秒輪詢一次,並檢查兩個用戶是否在過去7秒內沒有活動 – Ian

1

你不能確切肯定知道客戶端是否關閉。你可以做出一些合格的猜測,但它永遠不會可靠。

也許你可以找到一個包括您滿意知道在哪裏,如果一個客戶端會話處於活動狀態?

低技術的解決辦法是將保存會話ID(或一個自制唯一標識字符串)與時間戳一起。 無論何時客戶端發出新請求(新頁面加載和/或使用AJAX),都要更新時間戳。

由於您沒有訪問cronjobs,你需要做出妥協的另一個 - 讓其他遊客告訴你的客戶端是否仍然有效。 每當訪問者加載一個頁面時,運行存儲會話ID和時間戳的表格,並查看是否有任何會話看起來比您認爲正在運行的會話要舊。

這不是一個sulotion您的具體問題(因爲它不能這樣做),但技術含量低的妥協。

0

您可以簡單地在頁面上設置一個'RECURSIVE' ajax腳本,並且該腳本在很短的時間段後悄悄地將更新的時間發送到服務器。在服務器上,您必須編寫該請求偵聽器腳本才能記錄此詳細信息。如果您看到用戶請求已停止或最近一段時間未到達,則他關閉了瀏覽器。

相關問題