我試圖找到一種方法來在用戶關閉頁面後執行一些PHP代碼。在我的應用程序中,一旦用戶關閉或導航離開頁面,服務器將在數據庫中聲明用戶爲「離線」。這要求代碼知道用戶何時離開頁面導航。我的應用程序也有無盡的負載(即它會在用戶關閉頁面之前休眠)。PHP在頁面關閉時執行代碼
編輯:
感謝您的答案。我決定採用Pekka的會話方法,因爲這對我的應用來說似乎是最合乎邏輯的。
乾杯
我試圖找到一種方法來在用戶關閉頁面後執行一些PHP代碼。在我的應用程序中,一旦用戶關閉或導航離開頁面,服務器將在數據庫中聲明用戶爲「離線」。這要求代碼知道用戶何時離開頁面導航。我的應用程序也有無盡的負載(即它會在用戶關閉頁面之前休眠)。PHP在頁面關閉時執行代碼
編輯:
感謝您的答案。我決定採用Pekka的會話方法,因爲這對我的應用來說似乎是最合乎邏輯的。
乾杯
當用戶關閉頁面時可靠地發送一個事件幾乎是不可能的。有可以執行Ajax調用的onbeforeunload
事件,但可能會失敗,出於安全原因不會執行,或者根本不執行,因爲用戶關閉了JavaScript。
這通常是通過會話超時完成的:當某個會話的請求最後一次發生時,會檢查它。如果時間超過x分鐘,會話將視爲過期。這不是一個選項嗎?
是的,這似乎是最佳做法。你的回答讓我更多地思考如何做到這一點,而且看起來似乎比其他提到的方法更符合邏輯。謝謝! – 2011-02-01 16:11:08
如果你放入一個在5-10秒後刷新的ajax腳本,你可以通過ajax請求調用的php文件更新上次更新的戳記,並且如果它超過10秒就會脫機。這當然可以是一個更清潔的解決方案:-)
頁面請求是無狀態的,這意味着你永遠不會有一個100%的工作檢測方法來確定是否有人離開了頁面。您可以嘗試抓取頁面卸載,但這不是100%準確。你也可以嘗試使用AJAX提到的@Nayena,但這並不理想。
最好的辦法是像大多數常見網站那樣做,使用「N分鐘內的最後一次活動」作爲指標,而不是在他們離開或關閉頁面時趕上。
你可以檢查用戶是否已經從PHP內部瀏覽頁面(不是網站),但這意味着連接將保持打開狀態(瀏覽器中的加載進度將工作到無窮遠)..檢查我的回答 – 2011-02-01 15:46:36
@Ranan :我也可以使用AJAX推送服務,或者保持活動連接的隱藏閃光插件,或者....(並不意味着它們中的任何一個對於服務器來說都是理想的或者好的)。我將選擇「超時」方法,並讓我的服務器線程在上述任何一天的任何一天的任何一天打開。 [除非商業模式需要這種開銷。但至於「用戶離開了嗎?」 - 不值得資源] – 2011-02-01 15:50:30
)我知道,但他說'執行一些PHP代碼'和'我的應用程序也有無盡的負載(即它會睡覺,直到用戶關閉頁面)。'' ,那爲什麼不用這個方法? – 2011-02-01 15:54:26
如果你可以使用JavaScript和JQuery,使用 'window.onclose',然後調用Ajax做任何你想要使用PHP:
// Javascript code
window.onclose = closing;
function closing(){
$.ajax({
url: 'yoururl.php',
data: yourdata,
success: function(content){
// empty
}
})
}
只需設置ignore_user_abort(true)
然後進入無限while循環的
while (!connection_aborted()){
// do nothing ...
}
//after the while loop :
some_function_to_say_that_the_user_is_offline();
但要小心,無論何時用戶導航出頁面,函數將被執行。
編輯:和瀏覽器的進度條會像 「下載...」 永遠...
編輯2:同時檢查http://www.php.net/manual/en/function.register-shutdown-function.php
用身體屬性onunload的
http://www.htmlcodetutorial.com/document/_BODY_onUnload.html
將數據庫中的每個用戶操作註冊爲`timestamp`,然後檢查用戶在最後(n)分鐘內是否處於活動狀態。這就是每個人都做的,而且是100%工作的唯一途徑。 – Shoe 2011-02-01 15:46:58